开发者

TListView scroll event

开发者 https://www.devze.com 2023-02-20 19:41 出处:网络
Does the TListView control have an event 开发者_如何学Gothat will fire whenever the control is scrolled?

Does the TListView control have an event 开发者_如何学Gothat will fire whenever the control is scrolled?

I would prefer not to have to sub-class the TListView control.


This works perfectly, but might violate the constraints of your question.

In the interface section of the unit containing the form that use the TListView (prior to the TForm declaration), add

type
  TListView = class(ComCtrls.TListView)
  protected
    procedure WndProc(var Message: TMessage); override;
  end;

Then, in the implementation section of the same unit, define

procedure TListView.WndProc(var Message: TMessage);
begin
  inherited;
  case Message.Msg of
    WM_HSCROLL, WM_VSCROLL: beep;
  end;
end;


You can subclass a window without writing a descendant class, which is useful when you expect the changed behavior to be a one-off requirement. Write a TWndMethod function like in Andreas's answer, but write it in whatever class you want, such as the form that owns the list view. Assign it to the list-view control's WindowProc property. Before you do that, store the property's previous value so you can defer all other messages to it.

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;


Or if you want to trap just vertical scroll event, you can use this. Code is almost the same as Andreas posted ...

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;


The all answer is fine :-), but I don't wont to create new child of class. Thanks everyone for your help :-)!


My resolution: I use component (in Delphi 7) ApplicationEvents and I check change of ScrollBar position (GetScrollPos(ListView.Handle, SB_VERT)).

0

精彩评论

暂无评论...
验证码 换一张
取 消