Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-04-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
¿Cómo esconder o eliminar el vertical ScrollBar de un DBGrid?

Hola Compañeros del foro, pues eso como reza el titulo, ¿alguien sabe cómo hacerlo?, Agradecido de antemano.

Saludos.

PD. Utilizo Delphi 7.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #2  
Antiguo 18-04-2008
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Permíteme, compañero, que te remita aqui al respecto
__________________
Piensa siempre en positivo !
Responder Con Cita
  #3  
Antiguo 18-04-2008
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
probando la solucion me parece que en el evento afterscroll del dataset cumple la funcion, se ve un ligero parpadeo del repintado pero es mejor que estar dibujando Paneles, a mi manera de ver las cosas.

pero sigo sin enteder que mal puede hacer el pobre scroll alli

edito:
Para el que no sepa de lo que se habla, me refiero a la instruccion
Cita:
ShowScrollBar(Grid.Handle,SB_HORZ,false);
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #4  
Antiguo 18-04-2008
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Cita:
ShowScrollBar(Grid.Handle, SB_HORZ, false);
No estabamos hablando de la barra 'vertical' ?
__________________
Piensa siempre en positivo !
Responder Con Cita
  #5  
Antiguo 18-04-2008
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
Cita:
Empezado por gluglu Ver Mensaje
No estabamos hablando de la barra 'vertical' ?
bueno, ya me voy a tener que ir a dormir
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #6  
Antiguo 18-04-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Cita:
Empezado por gluglu Ver Mensaje
Permíteme, compañero, que te remita aqui al respecto
Gracias GluGlu, tome la opción de Neftali y me funciona perfectamente y gracias también a Eduarcol.

En unos momentos pondré el componente aquí.

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #7  
Antiguo 18-04-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Pues he aquí el componente, una Grilla sin el Vertical ScrollBar, Gracias al código de Neftalí via Link por GluGlu, voy a seguir jugando con el componente haciendole varias modificaciones.

DBGrilla.zip

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #8  
Antiguo 18-04-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Partiendo del código de Neftalí podríamos intentar detectar cuando son necesarias las barras:

Código Delphi [-]
procedure TExtendedDBGrid.WMNCCalcSize(var msg: TMessage);
var
  Style: Integer;

begin
  if Assigned(DataSource) and Assigned(DataSource.DataSet) then
  begin
    Style := GetWindowLong(Handle, GWL_STYLE);

    if DataSource.DataSet.RecordCount > VisibleRowCount then
      Style := Style or WS_VSCROLL
    else
      Style := Style and not WS_VSCROLL;

    SetWindowLong(Handle, GWL_STYLE, Style);
  end;

  inherited;
end;

// Saludos

Última edición por roman fecha: 18-04-2008 a las 18:36:18.
Responder Con Cita
  #9  
Antiguo 18-04-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Gracias Román, debo decirte que el código que propones me dio problemas, en tiempo de diseño no muestra los borde ni los scroll, pero me tira este error:

Cita:
---------------------------
Error
---------------------------
Access violation at address 51007648 in module 'dclusr70.bpl'. Read of address 00000030.
---------------------------
OK
---------------------------
Me lo tira al momento de ponerlo en el Form y al momento en que le altero el tamaño del grid, en cambio, en tiempo de ejecución los Scroll vuelven a aparecer.

Saludos.

EDITO: No me di cuenta que el código indica que los ScrollBars aparecerán cuando sean necesarias. Perdón Román.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.

Última edición por enecumene fecha: 18-04-2008 a las 18:51:30.
Responder Con Cita
  #10  
Antiguo 18-04-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Excelente Amigo Román, ahora sí funciona. Agradecido enormemente!!.

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #11  
Antiguo 18-04-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Bueno, dejo este componente que he hecho basado en los códigos de Román y Neftalí, se trata de un DBGrid con las siguientes propiedades:

- AutomaticScroll : Al ponerlo en True los scroll se activan cuando sean necesarios.
- VerticalScroll : Activa y desactiva el Vertical ScrollBar.
- HorizontalScroll : Activa y desactiva el Horizontal ScrollBar.

Aquí el link disponible en el FTP del Club.

Espero comentarios y criticas y que lo disfruten.

Gracias Román, Neftalí, GluGlu y Eduarcol.

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #12  
Antiguo 18-04-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Sí, yo tengo algunos comentarios.

El primero es para pedirte que no escribas cosas como

Código Delphi [-]
if AutomaticScroll = True then

ya que es redundante; basta poner

Código Delphi [-]
if AutomaticScroll then

Es como decir "orillate a la orilla", "sube arriba", "sal afuera"; se entiende pero suena feo.

Otra cosa es que no entiendo el propósito de las propiedades VerticalScrollBar y HorizontalScrollBar. Si las pones en false pero AutomaticScroll está en true, de todas maneras aparecen si hay muchos registros.

Finalmente, que estas propiedades deben tener un "setter"

Código Delphi [-]
property AutomaticScroll: Boolean read FAutomaticScroll write SetAutomaticScroll;

en el que obligues al control a reajustarse para reflejar el cambio.

// Saludos
Responder Con Cita
  #13  
Antiguo 18-04-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
¿y ahora cómo queda amigo Román siguiendo tus consejos?:

Código Delphi [-]
unit DBGrilla1;

interface

uses
  SysUtils, Classes, Controls, Grids, DBGrids, Messages, SHELLAPI, windows;

type
  TDBGrilla = class(TDBGrid)
  private
    FValorVertical: Boolean;
    FValorHorizontal: Boolean;
    FScrollAutomatico: Boolean;

    procedure WMNCCalcSize(var msg: TMessage); message WM_NCCALCSIZE;
  protected
      procedure setAutomaticScroll(Value: Boolean);
      procedure setVerticalScrollBar(Value: Boolean);
      procedure setHorizontalScrollBar(Value: Boolean);
  public
    { Public declarations }
  published
    property VerticalScrollBar: Boolean read FValorVertical write setVerticalScrollBar;
    property HorizontalScrollBar: Boolean read FValorHorizontal write setHorizontalScrollBar;
    property AutomaticScroll: Boolean read FScrollAutomatico write setAutomaticScroll;
  end;

procedure Register;

implementation

procedure TDBGrilla.setAutomaticScroll(Value: Boolean);
begin
  if Value <> FScrollAutomatico then
  begin
    FScrollAutomatico := Value;
  end;
end;

procedure TDBGrilla.setVerticalScrollBar(Value: Boolean);
begin
  if Value <> FValorVertical then
  begin
    FValorVertical := Value;
  end;
end;

procedure TDBGrilla.setHorizontalScrollBar(Value: Boolean);
begin
  if Value <> FValorHorizontal then
  begin
    FValorHorizontal := Value;
  end;
end;

procedure TDBGrilla.WMNCCalcSize(var msg: TMessage);
var
  style: Integer;
begin
if VerticalScrollBar then
  begin
  style := getWindowLong( handle, GWL_STYLE );

  if (style and WS_HSCROLL) <> 0 then
    SetWindowLong( handle, GWL_STYLE, style and not WS_HSCROLL );
  if (style and WS_VSCROLL) <> 0 then
    SetWindowLong( handle, GWL_STYLE, style and not WS_VSCROLL );
  end;
if HorizontalScrollBar then
  begin
  style := getWindowLong( handle, GWL_STYLE );

  if (style and WS_VSCROLL) <> 0 then
    SetWindowLong( handle, GWL_STYLE, style and not WS_VSCROLL );
  if (style and WS_HSCROLL) <> 0 then
    SetWindowLong( handle, GWL_STYLE, style and not WS_HSCROLL );
  end;
if AutomaticScroll then
  begin
    if Assigned(DataSource) and Assigned(DataSource.DataSet) then
    begin
      Style := GetWindowLong(Handle, GWL_STYLE);

      if DataSource.DataSet.RecordCount > VisibleRowCount then
       Style := Style or WS_VSCROLL
      else
       Style := Style and not WS_VSCROLL;

      SetWindowLong(Handle, GWL_STYLE, Style);
  end;
end;
  inherited;
end;

procedure Register;
begin
  RegisterComponents('Data Controls', [TDBGrilla]);
end;

end.

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.

Última edición por enecumene fecha: 18-04-2008 a las 21:35:43.
Responder Con Cita
  #14  
Antiguo 19-04-2008
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
He intentado crear este componente en BDS 2006 VCL.Net y al ejecutar inherited me da error. Al igual que en su momento lo intenté con el código de Neftalí.

En cualquier caso, me gustaría retomar el hilo para preguntar si verdaderamente va a funcionar con TQuery's o TDataSet's ya que nos estamos basando en una propiedad del DataSet que es RecordCount para saber si debemos o no pintar la ScrollBar vertical.

Pero a mi entender la propiedad RecordCount de un TDataSet siempre devuelve -1, no es verdad ?

A no ser que previamente hayamos leido 'todos' los registros que incorpore el DataSet, por ejemplo con un 'Last'. Pero eso vuelve a contradecir un poco la filosofía de los TQuery's y el tráfico generado por traer todos los registros de un Select.

A lo mejor estoy equivocado y por eso pregunto.

Saludos de nuevo a todos y gracias por vuestros comentarios
__________________
Piensa siempre en positivo !
Responder Con Cita
  #15  
Antiguo 21-04-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Saludos Compañeros, La cosa va así, he implementado un nuevo procedimiento y se trata de mover registros con la rueda del Ratón, o sea, lo que haces cuando las teclas ARRIBA/ABAJO para moverse entre registros y que ahora se puede hacer con el mouse, he aquí el código:

Código Delphi [-]
{ DBGrilla v1.0                                                   }
{ Grilla basado en los códigos de Neftalí y Román ClubDelphi.com  }
{ Tiene las siguientes Características:                           }
{ Scroll Automatico : Los Scroll Vertical y horizontal aparecerán }
{ cuando sea necesario.                                           }
{ VerticalScroll : Puedes activar o desactivar el scroll Vertical.}
{ HorizontalScroll : ¿no hay que explicarlo verdad?.              }
{ Componente realizado por Enecumene para ClubDelphi.com.         }

unit DBGrilla1;

interface

uses
  SysUtils, Classes, Controls, Grids, DBGrids, Messages, windows, DBTables, Dialogs,
  DB;

type
  TMouse = class(TControl);
  TDBGrilla = class(TDBGrid)
  private
    FValorVertical: Boolean;
    FValorHorizontal: Boolean;
    FScrollAutomatico: Boolean;

    procedure WMNCCalcSize(var msg: TMessage); message WM_NCCALCSIZE;
    procedure MouseScroll(var msg: TMessage); message WM_MOUSEWHEEL;
  protected
      procedure setAutomaticScroll(Value: Boolean);
      procedure setVerticalScrollBar(Value: Boolean);
      procedure setHorizontalScrollBar(Value: Boolean);
  public
    constructor Create(AOwner: TComponent); override;
  published
    property VerticalScrollBar: Boolean read FValorVertical write setVerticalScrollBar;
    property HorizontalScrollBar: Boolean read FValorHorizontal write setHorizontalScrollBar;
    property AutomaticScroll: Boolean read FScrollAutomatico write setAutomaticScroll;
  end;

procedure Register;

implementation

constructor TDBGrilla.Create(AOwner: TComponent);
begin
  WindowProc := MouseScroll;
    inherited;
end;

procedure TDBGrilla.MouseScroll(var msg: TMessage);
Var Cuanto: short;
begin
  if (Msg.Msg = WM_MOUSEWHEEL) then begin
     Cuanto:=HIWORD(Msg.WParam);
     Cuanto:=Cuanto div 120;
     if Assigned(DataSource) and Assigned(DataSource.DataSet) then
     begin
     DataSource.DataSet.MoveBy(-Cuanto);
     end;
   end else TMouse(TDBGrilla).WndProc(Msg);
end;

procedure TDBGrilla.setAutomaticScroll(Value: Boolean);
begin
  if Value <> FScrollAutomatico then
  begin
    FScrollAutomatico := Value;
  end;
end;

procedure TDBGrilla.setVerticalScrollBar(Value: Boolean);
begin
  if Value <> FValorVertical then
  begin
    FValorVertical := Value;
  end;
end;

procedure TDBGrilla.setHorizontalScrollBar(Value: Boolean);
begin
  if Value <> FValorHorizontal then
  begin
    FValorHorizontal := Value;
  end;
end;

procedure TDBGrilla.WMNCCalcSize(var msg: TMessage);
var
  style: Integer;
begin
if VerticalScrollBar then
  begin
  style := getWindowLong( handle, GWL_STYLE );

  if (style and WS_HSCROLL) <> 0 then
    SetWindowLong( handle, GWL_STYLE, style and not WS_HSCROLL );
  if (style and WS_VSCROLL) <> 0 then
    SetWindowLong( handle, GWL_STYLE, style and not WS_VSCROLL );
  end;
if HorizontalScrollBar then
  begin
  style := getWindowLong( handle, GWL_STYLE );

  if (style and WS_VSCROLL) <> 0 then
    SetWindowLong( handle, GWL_STYLE, style and not WS_VSCROLL );
  if (style and WS_HSCROLL) <> 0 then
    SetWindowLong( handle, GWL_STYLE, style and not WS_HSCROLL );
  end;
if AutomaticScroll then
  begin
    if Assigned(DataSource) and Assigned(DataSource.DataSet) then
    begin
      Style := GetWindowLong(Handle, GWL_STYLE);

      if DataSource.DataSet.RecordCount > VisibleRowCount then
       Style := Style or WS_VSCROLL
      else
       Style := Style and not WS_VSCROLL;

      SetWindowLong(Handle, GWL_STYLE, Style);
  end;
end;
  inherited;
end;

procedure Register;
begin
  RegisterComponents('Data Controls', [TDBGrilla]);
end;

end

Saludos
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Scrollbar Vertical desaparece del DBGRID jmlifi OOP 4 27-04-2007 20:54:43
¿Como Eliminar de la Bd el item seleccionado en un DbGrid? day_eli Conexión con bases de datos 1 09-02-2007 16:36:33
eliminar scrollbar en DBGRID cocke C++ Builder 2 25-11-2006 05:01:51
Scrollbar vertical en Tframe Sayuri Varios 3 07-12-2005 16:48:38
ScrollBar Vertical del DBGRID desaparece le4br OOP 3 21-03-2005 10:09:09


La franja horaria es GMT +2. Ahora son las 15:45:45.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi