Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-01-2006
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
Lightbulb Grid y Scrollbar's

Hola Amigos del Foro !

Quiero prestar mi pequeña aportación al tema de los Grids y sus Scrollbar's.

Llevo algo así como tres días analizando, buscando información, bajándome versiones de prueba de componentes de terceros, vamos en definitiva, comiéndome el coco de como poder ocultar decentemente los scrollbar's de un Grid. Nada me ha convencido !!

Y de pronto se me ha ocurrido que a lo mejor la solución es siempre más fácil de lo que parece. ... claro, después de tres días y no se cuantas compilaciones, pruebas, etcétera.

Bueno, termino el rollo ....

Por qué no adjuntar un TPanel al form que se coloque justo encima del correspondiente ScrollBar (Vert/Horiz) en tamaño/posición y con el color del propio Grid, y hacerlo Visible o no según convenga !?

... y ya cada cual decide en su propio código cuando mostrar u ocultar dicho TPanel, y por consiguiente, ocultar o mostrar (respectivamente) el ScrollBar.

Un saludo a todos
__________________
Piensa siempre en positivo !
Responder Con Cita
  #2  
Antiguo 22-01-2006
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Saludos

Yo no entendí na

Para ocultar el Scroll de un Grid solo hago eso
Código Delphi [-]
ShowScrollBar(Grid.Handle,SB_HORZ,false);
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #3  
Antiguo 23-01-2006
Avatar de Jonnathan
Jonnathan Jonnathan is offline
Miembro
 
Registrado: may 2005
Ubicación: Isla de Margarita, Venezuela
Posts: 64
Poder: 19
Jonnathan Va por buen camino
Cita:
Saludos

Yo no entendí na

Para ocultar el Scroll de un Grid solo hago eso

Código Delphi [-]


Cita:
ShowScrollBar(Grid.Handle,SB_HORZ,
Es cierto que ese código sirve para ocultar las barras en un grid, pero no funciona en los DBGrid que pintan la fulana scrollbar desde las entrañas del código de la VCL . Muy buena idea gluglu, eso demuestra que con un poco de maña e imaginación se puede hacer una buena interfaz gráfica .
__________________
"En el siglo de la estupidez todas las casas comienzan por la fachada" (Fuckowsky)
Planeta Insólito, La Pluma Inspirada
Responder Con Cita
  #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
Poder: 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
  #5  
Antiguo 23-01-2006
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Saludos

Que tal
Código Delphi [-]
  EnableScrollBar(DBGrid1.Handle,SB_HORZ,ESB_DISABLE_BOTH);
  ShowScrollBar(DBGrid1.Handle,SB_HORZ,False);
El 1ro deshabilita la barra y la 2da la oculta. Lo he probado y esta vez no reaparece

Edito: Si reaparece. Por alguna razón la barra vertical reaparece, no asi la horizontal
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!

Última edición por vtdeleon fecha: 23-01-2006 a las 12:48:51.
Responder Con Cita
  #6  
Antiguo 23-01-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.281
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Prueba con algo así; derivando el DBGrid estandard:

Código Delphi [-]
  TNSDBdbgrid = class(tdbgrid)
  private
    procedure WMNCCalcSize(var msg: TMessage); message WM_NCCALCSIZE;
  end;

...

procedure TNSDBdbgrid.WMNCCalcSize(var msg: TMessage);
var
  style: Integer;
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 );

  inherited;
end;
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #7  
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
Poder: 21
gluglu Va por buen camino
Uff !! ... mi primera componente propia.

Tengo documentación suficiente de como crear e instalar componentes en versiones anteriores a D2005 y D2006. Pero por lo menos a mi no me ha parecido inmediato instalar una componente a traves de 'paquetes' en D2006.

Siento decirle a Neftali que el código que ha expuesto, a mi por le menos, no me funciona bajo Delphi 2005/2006 para .NET

Ya en tiempo de diseño (como también en tiempo de ejecución) me da error 'Object reference not set to an instance of an object'
__________________
Piensa siempre en positivo !
Responder Con Cita
  #8  
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
Poder: 21
gluglu Va por buen camino
He continuado con el asunto, y he probado el mismo código en Delphi 2005 para Win32 y ya no me dá error, lo que pasa es que no me muestra nunca la barra de scroll vertical.

Aunque simple pero efectiva, sigo acogiéndome a la propuesta que yo hice ...

Saludos
__________________
Piensa siempre en positivo !
Responder Con Cita
  #9  
Antiguo 24-01-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.281
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por gluglu
lo que pasa es que no me muestra nunca la barra de scroll vertical.
¿Y no era eso de lo que se trataba?
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #10  
Antiguo 24-01-2006
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
Hola Neftali,

Se trata precisamente como detallo en mi propuesta que cuando el número de líneas a mostrar sea menor o igual que el número de líneas que caben en 'pantalla', NO me muestre la barra, pero precisamente si aumenta el número de líneas y es necesario y útil un ScrollBar vertical, entonces SI me la muestre. Que sea dinámico y se adapte en tiempo de ejecución.

Para ello precisamente tengo la dificultad añadida con los Query's que ni el propio DataSet, ni el DataSource me van a dar correcta e irrefutablemente el número de registros reales que se están mostrando en pantalla, por lo que le añadí un Query con un Count a mi código.

Añadir una vez más que en mi caso particular estoy utilizando las versiones .NET de Delphi.

Saludos !
__________________
Piensa siempre en positivo !
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
Parece q los problemas no terminan con un Grid Oxa78 Varios 5 26-10-2005 21:32:12
Formatear los datos para un grid escullar Varios 3 05-10-2005 19:38:15
Refresh en Grid con un TiBQuery como datasource ZRR Firebird e Interbase 3 03-10-2005 16:25:32
Titulos En String Grid triniti OOP 2 20-06-2004 23:50:36
Los DBGrid y sus scrollbars SnaKe Varios 3 31-10-2003 19:11:26


La franja horaria es GMT +2. Ahora son las 07:10:13.


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