Ir al contenido


Foto

[RESUELTO] Ratón arriba, ratón abajo, ratón arriba...


  • Por favor identifícate para responder
3 respuestas en este tema

#1 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 12 octubre 2011 - 03:36

Buena tarde, compañerit@s del foro. Acá otra vez con un par de dudas, de las cuales una vez resueltas me permitirán avanzar en mi proyecto. Les cuento.

Tengo un TScrollBox, trabajando en Delphi 6 (ya saben, Windows XP y MSSQLServer 2008 R2) y requiero poder controlarlo con la rueda del mouse de la computadora. Hacia arriba y hacia abajo, me refiero.

También, si pudiesen incluir el "cómo hacerlo" para un TDbGrid, sería altamente fabuloso.

De antemano, muchas gracias.
  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 12 octubre 2011 - 05:31

Puedes basarte en algo como esto:



delphi
  1. procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  2.   WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  3. begin
  4.   if DBGrid1.Focused then
  5.   begin
  6.     if WheelDelta < 0  then  DBGrid1.DataSource.DataSet.Next
  7.     else DBGrid1.DataSource.DataSet.Prior;
  8.     Handled:= true;
  9.   end;
  10. end;



Saludos.

  • 0

#3 ELKurgan

ELKurgan

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 566 mensajes
  • LocationEspaña

Escrito 13 octubre 2011 - 04:10

Mira a ver si este truco de la antigua página de Trucomanía puede ayudarte

Saludos

  • 0

#4 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 13 octubre 2011 - 05:50

En D7 los eventos de mousewheel no van muy bien, o no van en absoluto, si miras el codigo fuente del dbgrid la cosa da miedo: Mueve la fila activa en pantala, pero no actualiza el record activo del datasource, con lo que crees haberte movido de record pero no es cierto, y si pulsas borrar, se borra el que tenias seleccionado antes de mover la ruletita, no el que se ve en pantalla seleccionado... ARGGG!

El caso es que en general no van, y supongo que en D6 es igual o peor, así que nosotros tomamos "el camino de en medio" y definimos nuestros eventos cuando lo necesitamos así:

1) Añadimos un TApplicationEvent al form (lengueta "Aditional" en mi D7) que solemos llamarlo MouseWheelEvent, este evento es generico del form y no de un TScroolPanel ni ningún otro componente.

2) Defines el evento OnMessage para que haga lo que toque hacer, en mi caso es hacer zoom + o zoom - en un dibujo:



delphi
  1. procedure TGPagView.MouseWheelEventMessage(var Msg: tagMSG;
  2.   var Handled: Boolean);
  3. var
  4.   sube: boolean;
  5.   p: TPoint;
  6. begin
  7.   //Solo si el form esta activocontinuo...
  8.   if Active then begin
  9.     //Zoom con la ruleta del raton...
  10.     if (Msg.message = WM_MOUSEWHEEL) then begin
  11.       try
  12.         //Sube te dira si han movido para arriba o para abajo, cuanto se ha desplazado *supongo* que es el valor absoluto de wParam, yo no lo utilizo
  13.         sube:= Msg.wParam>0;
  14.         Handled:= true;
  15.         //Esta el ratón encima del componente? En mi caso un TImagen
  16.         p:= Imagen1.ScreenToClient(Mouse.CursorPos);
  17.         if (p.x>0) and (p.y>0) and (p.x<Imagen1.ClientWidth) and (p.y<Imagen1.ClientHeight) then
  18.           //Si, estoy sobre mi componenete AUNQUE no este "focused"
  19.           ZoomFrom(p, sube); //Esto lo cambias por tu código...
  20.       except
  21.       end;   
  22.     end;
  23.   end;
  24. end;



En mi caso, este codigo cambia solo el valor del zoom, que es internamente un TScrollBar.Position, pero no se redibuja la pantalla, eso lo hago con el evento OnIdle, que salta cuando la ruleta lleva ya un rato sin moverse, asi puedes hacer 3 zooms seguidos con solo un redibujado al final.

Puede que en tu caso no sea necesario usar OnIdel en abosoluto, solo haces scrool en el OnMessage y listo, se redibujará solo con el siguiente Application.ProccessMessages:


  • 0




IP.Board spam blocked by CleanTalk.