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 26-03-2012
marcial marcial is offline
Miembro
 
Registrado: may 2003
Posts: 147
Poder: 22
marcial Va por buen camino
Smile Scroll en DBGrid

Hola a todos:
Trabajo con Delphi5
Necesito hacer lo siguiente y no se si se puede:
Tengo un DBGrid que en pantalla NO saca (por espacio) todos los campos de una tabla. Entonces busco que cuando el ratón llegue a la última/primera columna del DBGrid haga un scroll horizontal automático hacia la derecha o la izquierda sacando el resto de las columnas de la tabla.
Gracias por vuestra ayuda.
Responder Con Cita
  #2  
Antiguo 26-03-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Hola, recuerda poner tus preguntas en los foros adecuados, este es "Conexión con bases de datos", y la pregunta no tiene mucho que ver con eso


P.d.: Lo muevo a 'varios'
Responder Con Cita
  #3  
Antiguo 27-03-2012
Avatar de lmpadron
lmpadron lmpadron is offline
Miembro
 
Registrado: feb 2009
Ubicación: Habana, Cuba
Posts: 204
Poder: 16
lmpadron Va por buen camino
deberías explicarte mejor porque no entiendo que es lo que quieres hacer !!!
__________________
Nunca esta de más volver a ver la "Guia de Estilo" o "La Otra Guia de Estilo". Recuerda siempre usar los "Tags" para una mejor legibilidad de tu código.


Cuando miras fijamente al abismo, este te devuelve la mirada


oo______ooo_____ooo_ooooooo_____ooo____oooooo____ooooooo______oooo____ooo____oo_
oo______oooo___oooo_oo____oo__oo___oo__oo____oo__oo____oo___oo____oo__oooo___oo_
oo______oo_oo_oo_oo_oo____oo_oo_____oo_oo_____oo_oo____oo__oo______oo_oo_oo__oo_
oo______oo__ooo__oo_oooooo___ooooooooo_oo_____oo_ooooooo___oo______oo_oo__oo_oo_
oo______oo_______oo_oo_______oo_____oo_oo____oo__oo____oo___oo____oo__oo___oooo_
ooooooo_oo_______oo_oo_______oo_____oo_oooooo____oo_____oo____oooo____oo____ooo_
________________________________________________________________________________
Responder Con Cita
  #4  
Antiguo 27-03-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

A ver si así hace mas o menos lo que buscas...
Código Delphi [-]
   ...
   private
     procedure MMouseEvent(var Msg: TMsg; var Handled: Boolean);
   end;
...
implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage := MMouseEvent;
end;

procedure TForm1.MMouseEvent(var Msg: TMsg; var Handled: Boolean);
var
  P: TPoint;
begin
  P:= ScreenToClient(Mouse.CursorPos);
  if PtInRect(DBGrid1.BoundsRect,P) then
  begin
    if P.X = DBGrid1.Left + GetSystemMetrics(SM_CXVSCROLL) then
      SendMessage(DBGrid1.Handle, WM_HSCROLL, SB_LINELEFT, 0);
    if P.X = DBGrid1.Left+DBGrid1.Width - GetSystemMetrics(SM_CXVSCROLL) then
      SendMessage(DBGrid1.Handle, WM_HSCROLL, SB_LINERIGHT, 0);
  end;
end;
...

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 27-03-2012 a las 01:06:42.
Responder Con Cita
  #5  
Antiguo 27-03-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Me quede pensando que agregando un detalle te puede servir para más de un TDBGrid en el mismo form:
Código Delphi [-]
  private
     procedure MMouseEvent(var Msg: TMsg; var Handled: Boolean);
  end;

....

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage := MMouseEvent;
end;

procedure TForm1.MMouseEvent(var Msg: TMsg; var Handled: Boolean);
var
  P: TPoint;
  WControl: TWinControl;
  G: TDBGrid;
  i: Integer;
begin
  WControl:= FindVCLWindow(Mouse.CursorPos);
  if Assigned(WControl) and (WControl is TDBGrid) then
  begin
    G:= TDBGRid(WControl);
    P:= ScreenToClient(Mouse.CursorPos);
    if P.X = G.Left + GetSystemMetrics(SM_CXVSCROLL) then
      for i:= G.Columns.Count-1 downto G.SelectedIndex do
        SendMessage(G.Handle, WM_HSCROLL, SB_LINELEFT, 0);
    if P.X = G.Left + G.Width - GetSystemMetrics(SM_CXVSCROLL) then
      for i:= G.SelectedIndex to G.Columns.Count-1 do
        SendMessage(G.Handle, WM_HSCROLL, SB_LINERIGHT, 0);
  end
end;

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 27-03-2012 a las 01:41:31. Razón: corrección
Responder Con Cita
  #6  
Antiguo 27-03-2012
marcial marcial is offline
Miembro
 
Registrado: may 2003
Posts: 147
Poder: 22
marcial Va por buen camino
Ecfisa, muchas gracias por responder
Es "casi" perfecto, lo que pasa es que por ejemplo si una tabla tiene 15 campos y el DBGrid sólo visualiza 5, al llegar a las barras de scroll verticales se mueve automáticamente hasta el último campo de la tabla (sin visualizar los intermedios). Lo ideal sería que cuando el cursor se posicionara sobre la primera/última columna visible (sin llegar a las del scroll vertical-derecha o fijas-izquierda), se moviese una columna mas a la izquierda o derecha.
Eso si que sería perfecto.
Muchas gracias y perdón por el abuso.
Responder Con Cita
  #7  
Antiguo 27-03-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola marcial.

Entonces creo que el primer código que adjunté se hacercaba más a lo que buscabas.

El problema que veo es que comparando la coordenada X del mouse por la igualdad, te desplazará una columna cuando ingresa a la zona de desplazamiento pero también cuando sale. Esto se soluciona comparando por mayor y menor, pero cualquier movimiento que haga con el mouse una vez en el area de desplazamiento, por pequeño que sea, provocará el scroll. En resumidas cuentas: Es imposible de manejar para el usuario.
Así que la solución es detectar si el puntero del mouse está dentro de las zonas de desplazamiento o nó. Si ya se encuentra dentro no debe realizar el scroll.

Creo que el código que buscas sería:
Código Delphi [-]
procedure TForm1.MMouseEvent(var Msg: TMsg; var Handled: Boolean);
{$J+} 
const InZD: Boolean = False; 
{$J-}
var
  P: TPoint;
  WControl: TWinControl;
  G: TDBGrid;
  ZD: Integer;
begin
  WControl:= FindVCLWindow(Mouse.CursorPos);  // ¿ Esta sobre un TWinControl ?
  if Assigned(WControl) and (WControl is TDBGrid) then // ¿ Es tambien un TDBGrid ? 
  begin
    P:= ScreenToClient(Mouse.CursorPos);  // Obtener posición del mouse
    G:= TDBGRid(WControl);                     
    ZD:=  GetSystemMetrics(SM_CXVSCROLL);  // Ancho zona desplazamiento 
    if (P.X < G.Left + ZD) and not InZD then  // Ingresa zona desplazamiento izquierda    
      SendMessage(G.Handle, WM_HSCROLL, SB_LINELEFT, 0);
    if (P.X > G.Left + G.Width - ZD) and not InZD then  // Ingresa zona desplazamiento derecha
      SendMessage(G.Handle, WM_HSCROLL, SB_LINERIGHT, 0);
    InZD:= (P.X < G.Left + ZD) or (P.X > G.Left + G.Width - ZD); // ¿ En zona desplazamiento ?
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage := MMouseEvent;
end;
De este modo el usuario tiene que volver a la zona de no desplazamiento y reingresar a la de desplazamiento para que se produzca el scroll (izquierdo o derecho).

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
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
DBGrid y Rueda(Scroll) del Mouse en Delphi 7 Emilio_82 Conexión con bases de datos 8 05-04-2013 09:23:41
Eliminar scroll horizontal (que no scrollbar) de dbgrid coso OOP 21 07-10-2008 19:29:13
barra de scroll en DBGrid macro32 Conexión con bases de datos 2 15-08-2008 07:53:58
Barra de Scroll de un DbGrid con Query gandalf_uy Varios 2 22-09-2005 18:09:34
DBGRID y SCROLL vtdeleon OOP 2 22-12-2004 14:34:59


La franja horaria es GMT +2. Ahora son las 16:41:01.


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