Ver Mensaje Individual
  #4  
Antiguo 23-01-2006
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Reputación: 21
gluglu Va por buen camino
Me refería en mi caso concreto a los DBGrid's. La verdad es que será el 99.9% de mis casos. El StringGrid no lo he mirado en detalle, pero con bases de datos cliente/servidor, gran cantidad de registros, etcétera, supongo que es absurdo ponerse a pensar en el StringGrid, teniendo un componente especial para BBDD.

En innumerables foros estuve consultado cual era la mejor manera de ocultar sobre todo el scrollbar vertical, ya que el horizontal en mi caso se elimina solo por el propio diseño en pantalla.

Aquí desarrollo un poco más la solución junto con TIBQuery (como ejemplo general):

* Defino un DBGrid1

* Defino un TPanel, PanelVScrollBar1 cuyo tamaño y posición se adapte exáctamente al scrollbar vertical del DBGrid. Por defecto su propiedad Visible := True de tal manera que incluso en tiempo de diseño no veré el scrollbar una vez posicionado este PanelVScrollBar sobre el DBGrid1. Por supuesto el 'control' del PanelVScrollBar1 tendrá que ser 'bring to front' con respecto al DBGrid1

* En la rutina de entrada del form, que considero debería ser Form.OnPaint (para que se oculte correctamente cada vez que se redibuja el Form), o bien en el frame en mi caso particular, en cuyo caso he utilizado Frame.OnEnter, defino una llamada a un procedimiento llamado CheckVScrollBar1
Código Delphi [-]
procedure TFrame1.FrameEnter(Sender: TObject);
begin
...
CheckVScrollBar1;
...
end;

* Dicho procedimiento CheckVScrollBar1 lo he desarrollado así :
Código Delphi [-]
procedure TFrame1.CheckVScrollBar1();
begin
  with DataModule1.IBQueryCheck do begin
    SQL.Clear;
    SQL.Add('Select Count(*) from TABLA1');
    SQL.Add('where CONDICION = :Txt1');
    ParamByName('Txt1').AsInteger := DataModule1.IBQuery1CAMPO1.Value;
    Prepare;
    Open;
    If FieldByName('Count').Value > Max_Rows then
      PanelVScrollBar1.Visible := False
    else
      PanelVScrollBar1.Visible := True;
  end;
end;

Max_Rows se puede definir como variable global, o en mi caso concreto he reemplazado directamente el código con el valor concreto, ya que siempre será el mismo al no permitir redimensionar el DBGrid en ejecución. (... en mi caso mi código es If FieldByName('Count').Value > 4 ...).

* En las rutinas de inserción o borrado de registros (se puede incluir también la de edición, pero en mi caso la de edición no añade ni borra registros, ni tampoco modifica la clave principal por lo que siempre seguirá siendo el registro parte del DBGrid), ejecuto una nueva llamada a CheckVScrollBar1



... y al menos a mí me funciona de maravilla, y mucho mejor y efectivo que todo lo que he visto hasta ahora !

Sólo un dato más con respecto al comentario de vtdeleon: Intenté también con la rutina ShowScrollBar, pero cada vez que me reposiciono en el DBGrid (utilizo Delphi 2006) me vuelve a aparecer el ScrollBar, por lo que si lo quiero esconder cada vez, me causaba un efecto visual 'feo' con destellos. Incluso creo que definiéndome un componente derivado, e incluyendo esta llamada a ShowScrollBar en el evento OnPaint produciría ese 'flickering' indeseado.

... así que ya tengo la posibilidad de mostrar u ocultar de manera efectiva y eficiente mi scrollbar vertical cuando yo decida, y no cuando lo decida Delphi

Saludos a todos.
__________________
Piensa siempre en positivo !
Responder Con Cita