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.

[RESUELTO] Ratón arriba, ratón abajo, ratón arriba...
Comenzado por
TiammatMX
, oct 12 2011 03:36
3 respuestas en este tema
#1
Escrito 12 octubre 2011 - 03:36
#2
Escrito 12 octubre 2011 - 05:31
Puedes basarte en algo como esto:
Saludos.
delphi
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); begin if DBGrid1.Focused then begin if WheelDelta < 0 then DBGrid1.DataSource.DataSet.Next else DBGrid1.DataSource.DataSet.Prior; Handled:= true; end; end;
Saludos.
#3
Escrito 13 octubre 2011 - 04:10
#4
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:
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:
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
procedure TGPagView.MouseWheelEventMessage(var Msg: tagMSG; var Handled: Boolean); var sube: boolean; p: TPoint; begin //Solo si el form esta activocontinuo... if Active then begin //Zoom con la ruleta del raton... if (Msg.message = WM_MOUSEWHEEL) then begin try //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 sube:= Msg.wParam>0; Handled:= true; //Esta el ratón encima del componente? En mi caso un TImagen p:= Imagen1.ScreenToClient(Mouse.CursorPos); if (p.x>0) and (p.y>0) and (p.x<Imagen1.ClientWidth) and (p.y<Imagen1.ClientHeight) then //Si, estoy sobre mi componenete AUNQUE no este "focused" ZoomFrom(p, sube); //Esto lo cambias por tu código... except end; end; end; 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: