2011-08-02 72 views
5

我正在做一個持有訂單和打印發票的應用程序。我的表單上有一些標籤,tedits,tmemos,按鈕,一個數據源,一個adotable,一個popupmenu和一個dbgrid。德爾福dbgrid連續滾動

當我編譯程序並向下滾動dbgrid滾動條時,它會在釋放鼠標按鈕後滾動。但我想要連續滾動。

問候

+1

這不就是數據感知控件的性質是什麼? –

+0

我不知道。 – nikel

回答

9

這就是所謂的拇指跟蹤。派生一個新類來覆蓋滾動行爲。使用中介類的實例:

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; 


你也可以更換控制的WindowProc,如果你不希望派生新類。您需要做的就是處理WM_VSCROLL消息。 Here是一個例子,如何做到這一點。

+0

「TDBGrid」的非跟蹤是否可以避免在滾動時敲擊數據庫?對於對數據庫一無所知的人來說,這是一個無知的問題。 –

+4

@David - 很可能..但是該選項無論如何都應該給開發者。有時候,所有的現場數據都會被緩存,因此沒有必要進行拇指跟蹤。 –

+2

謝謝

2

下面是其他的解決辦法Sertac Akyuz而不必從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;