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: 21
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.040
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: 21
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
  #8  
Antiguo 28-03-2012
marcial marcial is offline
Miembro
 
Registrado: may 2003
Posts: 147
Poder: 21
marcial Va por buen camino
Solucionado. Muy bien explicado. Da gusto encontrar profesores así.
Muchas Gracias
Responder Con Cita
  #9  
Antiguo 28-03-2012
marcial marcial is offline
Miembro
 
Registrado: may 2003
Posts: 147
Poder: 21
marcial Va por buen camino
De hecho, y gracias a tu inestimable ayuda he mezclado tus códigos y he añadido algo hasta que ha quedado a mi gusto.
Reitero nuevamente mi agradecimiento porque sólo no podría haberlo hecho.

Código Delphi [-]
procedure TForm1.MMouseEvent(var Msg: TMsg; var Handled: Boolean);
{$J+}
const InZD: Boolean = False;
{$J-}
var
  P, PP: TPoint;
  WControl: TWinControl;
  G: TDBGrid;
  ZD, i: 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
         for i:= G.Columns.Count-1 downto G.SelectedIndex do
                begin
                PP := ScreenToClient(Mouse.CursorPos);
                if pp.x <> p.x then exit;
                SendMessage(G.Handle, WM_HSCROLL, SB_LINELEFT, 0);
                sleep(100);
                end;
    if (P.X > G.Left + G.Width - ZD) and not InZD then  // Ingresa zona desplazamiento derecha
      for i:= G.SelectedIndex to G.Columns.Count-1 do  //Así no hay que ingresar en la zona de desplazamiento columna a columna
                begin
                PP := ScreenToClient(Mouse.CursorPos); 
                if pp.x <> p.x then exit;  //Chequea que la posición haya cambiado con respecto de la inicial para salir del buche

                SendMessage(G.Handle, WM_HSCROLL, SB_LINERIGHT, 0);
                sleep(100);  // Una pequeña pausa a gusto del consumidor para que el scroll no sea tan rápido
                end;
    InZD:= (P.X < G.Left + ZD) or (P.X > G.Left + G.Width - ZD); // ¿ En zona desplazamiento ?

  end;
end;
Responder Con Cita
  #10  
Antiguo 29-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.

Primero que nada, me alegro que el código te haya servido como base .

Ahora que veo que deseas un scroll continuo con retraso de tiempo, te pongo otra alternativa más simple:
Código Delphi [-]
procedure TForm1.MMouseEvent(var Msg: TMsg; var Handled: Boolean);
var
  P: TPoint;
  WControl: TWinControl;
  G: TDBGrid;
  ZD: Integer;
begin
  WControl:= FindVCLWindow(Mouse.CursorPos);
  if Assigned(WControl) and (WControl is TDBGrid) then
  begin
    P:= ScreenToClient(Mouse.CursorPos);
    G:= TDBGRid(WControl);
    ZD:=  GetSystemMetrics(SM_CXVSCROLL);
    while (P.X >= G.Left) and (P.X <= G.Left+ZD) do
    begin
      P:= ScreenToClient(Mouse.CursorPos);
      SendMessage(G.Handle, WM_HSCROLL, SB_LINELEFT, 0);
      Sleep(250);
    end;
    while (P.X >= G.Left+G.Width-ZD) and (P.X <= G.Left+G.Width) do
    begin
      P:= ScreenToClient(Mouse.CursorPos);
      SendMessage(G.Handle, WM_HSCROLL, SB_LINERIGHT, 0);
      Sleep(250);
    end;
  end;
end;

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #11  
Antiguo 30-03-2012
marcial marcial is offline
Miembro
 
Registrado: may 2003
Posts: 147
Poder: 21
marcial Va por buen camino
Muchas gracias. Como siempre, mejor que el mio.
Responder Con Cita
  #12  
Antiguo 30-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
Cita:
Empezado por marcial Ver Mensaje
Muchas gracias. Como siempre, mejor que el mio.
Hola.

Yo no diría mejor... sólo un modo diferente que dá un código más simple.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #13  
Antiguo 30-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
Saludos ecfisa, podría traducir este código a c usted o alguien mas? Seria magnífico !!!
__________________
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
  #14  
Antiguo 30-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
Cita:
Empezado por lmpadron Ver Mensaje
Saludos ecfisa, podría traducir este código a c usted o alguien mas? Seria magnífico !!!
Hola impadrón.

Código:
void __fastcall TForm1::MMouseEvent(TMsg &msg, bool &Handled){
TPoint tp;
int i;
  TWinControl *wc =  FindVCLWindow(Mouse->CursorPos);
  if (wc != NULL) {
    tp = Form1->ScreenToClient(Mouse->CursorPos);
    TDBGrid *g = static_cast<TDBGrid*> (wc);
    int ZD = GetSystemMetrics(SM_CXVSCROLL);
    while(tp.x >= g->Left && tp.x <= g->Left+ZD) {
      tp = Form1->ScreenToClient(Mouse->CursorPos);
      SendMessage(g->Handle, WM_HSCROLL, SB_LINELEFT, 0);
      Sleep(250);
    };
    while (tp.x >= g->Left+g->Width-ZD && tp.x <= g->Left+g->Width) {
      tp = Form1->ScreenToClient(Mouse->CursorPos);
      SendMessage(g->Handle, WM_HSCROLL, SB_LINERIGHT, 0);
      Sleep(250);
    };
  }
};

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  Application->OnMessage = MMouseEvent;
}

Saludos.

PD: No me trates de usted. (la próxima vez que lo hagas te traduzco a Visual Basic )
__________________
Daniel Didriksen

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

Última edición por ecfisa fecha: 30-03-2012 a las 16:04:32.
Responder Con Cita
  #15  
Antiguo 30-03-2012
marcial marcial is offline
Miembro
 
Registrado: may 2003
Posts: 147
Poder: 21
marcial Va por buen camino
Hola de nuevo:
Parece que la felicidad nunca es completa.
Resulta que aplico el código y va perfectamente pero....cuando en el programa existe un componente Application Event para controlar la rueda del ratón con este código en el evento On Message:
Código Delphi [-]
 if Msg.message = WM_MOUSEWHEEL then
   begin
     Msg.message := WM_KEYDOWN;
     Msg.lParam := 0;
     if Msg.wParam > 0 then
       Msg.wParam := VK_UP
     else
       Msg.wParam := VK_DOWN;
     Handled := False;
   end;

Resulta que el maravilloso código de ecfisa no funciona.

¿Habría alguna manera de poder utilizar los dos a la vez?
Responder Con Cita
  #16  
Antiguo 30-03-2012
marcial marcial is offline
Miembro
 
Registrado: may 2003
Posts: 147
Poder: 21
marcial Va por buen camino
Vaya, si que se puede. Lo dejo por si a alguien le interesa:

En las Private Declarations
Código Delphi [-]
    { Private declarations }
    procedure DBGrid1PillaLaRueda(var Message: TMessage);
       procedure MMouseEvent(var Msg: TMsg; var Handled: Boolean); {SCROLL DEL DBGRID}


Despues de los Uses y antes de {SR *.DFM}
Código Delphi [-]
type
TomaInvento = class(TControl);


El el OnCreate de la Form
Código Delphi [-]
DBGrid1.WindowProc := DBGrid1PillaLaRueda;
   Application.OnMessage := MMouseEvent; {PARA EL SCROLL DEL DBGRID}

El procedure del Scroll Vertical
Código Delphi [-]
procedure TForm3.DBGrid1PillaLaRueda(var Message: TMessage);
 var
   Cuanto : short;
 begin

   if (Message.Msg = WM_MOUSEWHEEL) then begin
     Cuanto:=HIWORD(Message.WParam);
     Cuanto:=Cuanto div 120;
     DbGrid1.DataSource.DataSet.MoveBy(-Cuanto);

   end else TomaInvento(DBGrid1).WndProc(Message);
 end;

Y por último, después del procedure Vertical, el procedure de Ecfisa para el Scroll Horizontal

Así tenemos los Scroll Vertical y Horizontal sin usar las Barras de Desplazamiento

Muchas gracias
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 12:36:50.


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