2011-08-02 18 views
5

Wykonuję aplikację, która przechowuje zamówienia i drukuje faktury. Mam kilka etykiet, tedi, tmemos, buttons, źródło danych, adotable, popupmenu i dbgrid w moim formularzu.Delphi dbgrid ciągłe przewijanie

Kiedy buduję program i przewijam w dół pasek przewijania dbgrid, przewija się po zwolnieniu przycisku myszy. Ale chcę ciągłego przewijania.

Pozdrowienia

+1

nie jest, że charakter danych świadomi kontroli? –

+0

Nie wiem tego. – nikel

Odpowiedz

9

To się nazywa śledzenie kciukiem. Wyprowadź nową klasę, aby zastąpić zachowanie przewijania. Przykład użycia klasy interposer:

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; 


Można również wymienić WindowProc z kontrolą, jeśli nie chcą czerpać nową klasę. Wszystko, co musisz zrobić, to obsłużyć wiadomość WM_VSCROLL. Here jest przykładem, jak to zrobić.

+0

Czy brak śledzenia 'TDBGrid' jest wyborem projektu, aby uniknąć uderzenia bazy danych podczas przewijania? Jest to szczere pytanie zadawane w ignorancji przez kogoś, kto absolutnie nic nie wie o bazach danych. –

+4

@David - Bardzo prawdopodobne .. Jednak i tak należało dać deweloperowi taką możliwość. Czasami wszystkie dane pola są buforowane, nie ma sensu, aby nie mieć śledzenia kciuka. –

+2

Dziękuję

2

Oto inne rozwiązanie Sertac Akyuz wymienić bez konieczności uzyskania nowej klasy z 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; 
Powiązane problemy