我正在制作一个应用程序,用于保存订单并打印发票。我的表单上有一些标签、文本编辑框、文本区域、按钮、数据源、可调式表格和弹出菜单。
当我构建程序并滚动 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
消息。 这里 有一个示例。
TDBGrid
不进行追踪是否是一种设计选择,以避免在滚动时对数据库造成过多负担?这是一个诚实的问题,由一个对数据库一无所知的人提出。 - David Heffernan 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;