2011-08-02 22 views
5

Estoy haciendo una aplicación que contiene pedidos e imprime facturas. Tengo algunas etiquetas, tedits, tmemos, botones, un origen de datos, un adotable, un popupmenu y un dbgrid en mi formulario.Delphi dbgrid desplazamiento continuo

Cuando construyo el programa y me desplazo hacia abajo en la barra de desplazamiento dbgrid, se desplaza después de soltar el botón del mouse. Pero quiero un desplazamiento continuo.

Saludos

+1

No es que la naturaleza de los datos de los controles conscientes? –

+0

no lo sé. – nikel

Respuesta

9

Se llama thumb tracking. Derive una nueva clase para anular el comportamiento de desplazamiento. Ejemplo de uso de una clase de interposición:

type 
    TDBGrid = class(DBGrids.TDBGrid) 
    private 
    procedure WmVScroll(var Message: TWMVScroll); message WM_VSCROLL; 
    end; 

    TForm1 = class(TForm) 
    DBGrid1: TDBGrid; 
    .. 

implementation 

procedure TDBGrid.WmVScroll(var Message: TWMVScroll); 
begin 
    if Message.ScrollCode = SB_THUMBTRACK then 
    Message.ScrollCode := SB_THUMBPOSITION; 
    inherited; 
end; 


También puede reemplazar el WindowProc del control si no desea derivar una nueva clase. Todo lo que necesita hacer es manejar el mensaje WM_VSCROLL. Here es un ejemplo de cómo hacerlo.

+0

¿El no seguimiento de 'TDBGrid' es una opción de diseño para evitar el martilleo de la base de datos mientras se desplaza? Esta es una pregunta honesta hecha en ignorancia por alguien que no sabe absolutamente nada sobre las bases de datos. –

+4

@David - Muy probable ... Pero la opción debería haberse dado al desarrollador de todos modos. A veces, todos los datos de campo se almacenan en caché de todos modos, no tiene sentido entonces no tener seguimiento de pulgar. –

+2

Gracias

2

Aquí está la otra solución Sertac Akyuz mencionó sin tener que derivar una nueva clase de TDBGrid:

private 
    FOrgDBGridWndProc: TWndMethod; 
    procedure DBGridWndProc(var Msg: TMessage); 
    // ... 
    end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    FOrgDBGridWndProc:= DBGrid1.WindowProc; 
    DBGrid1.WindowProc := DBGridWndProc; 
end; 

procedure TForm1.DBGridWndProc(var Msg: TMessage); 
begin 
    if (Msg.Msg = WM_VSCROLL) and 
    (LongRec(Msg.wParam).Lo = SB_THUMBTRACK) then 
    begin 
     LongRec(Msg.wParam).Lo := SB_THUMBPOSITION; 
    end; 
    if Assigned(FOrgDBGridWndProc) then 
    FOrgDBGridWndProc(Msg); 
end; 
Cuestiones relacionadas