TListView控件是否有一个在滚动控件时会触发的事件?
我宁愿不必对TListView控件进行子类化。
答案 0 :(得分:7)
这很有效,但可能会违反你问题的限制。
在包含使用interface
的表单(TListView
声明之前)的单元的TForm
部分中,添加
type
TListView = class(ComCtrls.TListView)
protected
procedure WndProc(var Message: TMessage); override;
end;
然后,在同一单元的implementation
部分中,定义
procedure TListView.WndProc(var Message: TMessage);
begin
inherited;
case Message.Msg of
WM_HSCROLL, WM_VSCROLL: beep;
end;
end;
答案 1 :(得分:3)
您可以在不编写子类的情况下对窗口进行子类化,这在您希望更改的行为是一次性要求时非常有用。写一个TWndMethod
函数,就像Andreas's answer一样,但是把它写成你想要的任何类,比如拥有列表视图的表单。将其分配给列表视图控件的WindowProc
属性。在此之前,请存储属性的先前值,以便将所有其他消息推迟到该值。
type
TNanikForm = class(TForm)
ListView: TListView;
private
FPrevListViewProc: TWndMethod;
procedure ListViewWndProc(var Msg: TMessage);
public
procedure Loaded; override;
end;
procedure TNanikForm.ListViewWndProc(var Msg: TMessage);
begin
case Msg.Message of
wm_VScroll: ;
else FPrevListViewProc(Msg);
end;
end;
procedure TNanikForm.Loaded;
begin
inherited;
FPrevListViewProc := ListView.WindowProc;
ListView.WindowProc := ListViewWndProc;
end;
答案 2 :(得分:0)
或者如果您想捕获垂直滚动事件,可以使用它。代码几乎与Andreas发布的相同......
type
TListView = class(ComCtrls.TListView)
protected
procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
end;
procedure TListView.WMVScroll(var Message: TWMVScroll);
begin
inherited;
Beep;
end;
答案 3 :(得分:0)
所有答案都很好:-),但我不会创造新的班级孩子。 感谢大家的帮助: - )!
我的解决方案:我使用组件(在Delphi 7中) ApplicationEvents ,我检查 ScrollBar位置的更改(GetScrollPos(ListView.Handle, SB_VERT))。