如何在Delphi中捕获DBGrid中的滚动事件

Tof*_*nov 1 delphi events scrollbar dbgrid

我有一个DBGrid,每次使用水平滚动条时,我需要运行一些代码。我在DBGrid中找不到此类事件。你能建议些什么吗?

yoz*_*zey 5

也许这会有所帮助。它显示了一个捕获常规 TStringGrid 滚动事件的示例。同步两个 TStringgrids 的滚动?

  • 您可以将新组件安装到一个包中,然后将该包安装到 IDE 中,以便编译器知道它。关闭带有要替换的 DBGrid 的单元,这样它就不会在 IDE 中打开。*首先复制 .DFM 和 PAS 文件!* 在记事本中打开文本 .DFM 并将 TDBGrid 替换为新网格的类名。对匹配的 .PAS 文件的 interface 部分执行相同操作,并确保将新单元的名称添加到 *interface* uses 子句中。保存文件,然后在 IDE 中重新打开它。如果你做对了,一切都应该没问题。如果没有,请恢复备份副本。 (2认同)

Fra*_*ois 5

TCustomGrid中有WMHScroll过程,但它是私有的。您不能在DBGrid中使用它。
您将必须创建自己的TDBGrid后代并执行自己的操作

procedure WMHScroll(var Msg: TWMHScroll); message WM_HSCROLL;
Run Code Online (Sandbox Code Playgroud)

或进行一些严重的恶意入侵...

更新:欺骗/黑客将您的代码潜入...

[...]
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB, Grids, DBGrids;

    type
      // Hack to redeclare your TDBGrid here whitout the the form designer going mad
      TDBGrid = class(DBGrids.TDBGrid)
        procedure WMHScroll(var Msg: TWMHScroll); message WM_HSCROLL;
      end;

      TForm8 = class(TForm)
        DBGrid1: TDBGrid;
        DataSource1: TDataSource;
        ADODataSet1: TADODataSet;
        ADOConnection1: TADOConnection;
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form8: TForm8;

    implementation

    {$R *.dfm}

    { TDBGrid }

    procedure TDBGrid.WMHScroll(var Msg: TWMHScroll);
    begin
      case Msg.ScrollCode of
        SB_ENDSCROLL: OutputDebugString('SB_ENDSCROLL') ;
        SB_LEFT:OutputDebugString('SB_LEFT');
        SB_RIGHT:OutputDebugString('SB_RIGHT');
        SB_LINELEFT:OutputDebugString('SB_LINELEFT');
        SB_LINERIGHT:OutputDebugString('SB_LINERIGHT');
        SB_PAGELEFT:OutputDebugString('SB_PAGELEFT');
        SB_PAGERIGHT:OutputDebugString('SB_PAGERIGHT');
        SB_THUMBPOSITION:OutputDebugString('SB_THUMBPOSITION');
      end;
      inherited; // to keep the expected behavior
    end;
[...]
Run Code Online (Sandbox Code Playgroud)

Update2:请注意,您可以将特殊的TDBGrid代码移动到单独的单元(推荐),只需确保在Form的uses子句中将此单元名称AFTER DBGrids放入即可