【发布时间】:2009-11-12 16:40:49
【问题描述】:
我有一个 DBGrid,每次使用水平滚动条时,我都需要运行一些代码。我在 DBGrid 中找不到这样的事件。能给点建议吗?
【问题讨论】:
标签: delphi events scrollbar dbgrid
我有一个 DBGrid,每次使用水平滚动条时,我都需要运行一些代码。我在 DBGrid 中找不到这样的事件。能给点建议吗?
【问题讨论】:
标签: delphi events scrollbar dbgrid
TCustomGrid 中有一个 WMHScroll 过程,但它是私有的。您不能在 DBGrid 中使用它。
您必须创建自己的 TDBGrid 后代并自己做
procedure WMHScroll(var Msg: TWMHScroll); message WM_HSCROLL;
或者做一些非常糟糕的黑客行为......
更新:欺骗/破解您的代码...
[...]
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;
[...]
Update2:请注意,您可以将您的特殊 TDBGrid 代码移动到单独的单元(推荐),只需确保将此 单元名称 AFTER DBGrids 放在 Form 的 uses 子句中.
【讨论】:
也许这会有所帮助。它显示了一个捕获常规 TStringGrid 的滚动事件的示例。 Synchronize the Scrolling of two TStringgrids?
【讨论】:
编辑:显然是错误的答案。它捕获 vertical 滚动条,但不捕获 horizontal 滚动条。
您不会在 DBGrid 级别捕获它。您在附加的 TDataSet 的 BeforeScroll 或 AfterScroll 处捕获它。它使用滚动条、向上和向下箭头键、向上翻页触发 以及出现在 DBGrid 中的向下翻页键等。
【讨论】:
我目前无法检查,但如果我没记错的话,该事件就在那里,但没有发布。尝试创建一个源自 TDBGrid 并发布滚动条事件的控件。
【讨论】: