Delphi dbgrid连续滚动

时间:2011-08-02 21:32:49

标签: delphi delphi-2010 tdbgrid

我正在制作一个包含订单和打印发票的应用程序。我的表单上有一些标签,tedits,tmemos,按钮,数据源,adotable,popupmenu和dbgrid。

当我构建程序并向下滚动dbgrid滚动条时,它会在我释放鼠标按钮后滚动。但我想要连续滚动。

问候

2 个答案:

答案 0 :(得分:10)

这就是所谓的拇指追踪。派生一个新类来覆盖滚动行为。使用插入器类的示例:

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是如何做到这一点的一个例子。

答案 1 :(得分: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;