TListView滚动事件

时间:2011-03-29 20:46:08

标签: delphi listview scroll scrollbar

TListView控件是否有一个在滚动控件时会触发的事件?

我宁愿不必对TListView控件进行子类化。

4 个答案:

答案 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))。