我正在做一個持有訂單和打印發票的應用程序。我的表單上有一些標籤,tedits,tmemos,按鈕,一個數據源,一個adotable,一個popupmenu和一個dbgrid。德爾福dbgrid連續滾動
當我編譯程序並向下滾動dbgrid滾動條時,它會在釋放鼠標按鈕後滾動。但我想要連續滾動。
問候
我正在做一個持有訂單和打印發票的應用程序。我的表單上有一些標籤,tedits,tmemos,按鈕,一個數據源,一個adotable,一個popupmenu和一個dbgrid。德爾福dbgrid連續滾動
當我編譯程序並向下滾動dbgrid滾動條時,它會在釋放鼠標按鈕後滾動。但我想要連續滾動。
問候
這就是所謂的拇指跟蹤。派生一個新類來覆蓋滾動行爲。使用中介類的實例:
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是一個例子,如何做到這一點。
「TDBGrid」的非跟蹤是否可以避免在滾動時敲擊數據庫?對於對數據庫一無所知的人來說,這是一個無知的問題。 –
@David - 很可能..但是該選項無論如何都應該給開發者。有時候,所有的現場數據都會被緩存,因此沒有必要進行拇指跟蹤。 –
謝謝
下面是其他的解決辦法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;
這不就是數據感知控件的性質是什麼? –
我不知道。 – nikel