Delphi dbgrid 连续滚动

7

我正在制作一个应用程序,用于保存订单并打印发票。我的表单上有一些标签、文本编辑框、文本区域、按钮、数据源、可调式表格和弹出菜单。

当我构建程序并滚动 dbgrid 滚动条时,它只在我松开鼠标按钮后才滚动。但是我希望能够进行连续滚动。

祝好


1
数据感知控件的本质不就是如此吗? - David Heffernan
2个回答

12

这被称为“拇指跟踪”。派生一个新类以覆盖滚动行为。以下是使用中间层类的示例:

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
6
很可能如此,但是开发人员应该被赋予此选项。有时所有字段数据都会被缓存,这种情况下没有跟踪拇指的意义。 - Sertac Akyuz
2
谢谢您 <啦啦啦15个字符> - David Heffernan
我遇到了一个错误:“未声明的标识符DBGrids”..如何修复?谢谢。 - user2200585
1
@用户 - 当您有问题时,请提出新问题,除非此前已经有人回答过。这个问题可能已经被回答了很多次。无论如何,请将“DBGrids”替换为“Vcl.DBGrids”。 - Sertac Akyuz
非常感谢你,兄弟!新年快乐! - user2200585

3
这是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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接