Событие прокрутки TListView - PullRequest
2 голосов
/ 30 марта 2011

Есть ли у элемента управления TListView событие, которое будет срабатывать при прокрутке элемента управления?

Я бы предпочел не создавать подкласс для элемента управления TListView.

Ответы [ 4 ]

7 голосов
/ 30 марта 2011

Это работает отлично, но может нарушить ограничения вашего вопроса.

В разделе 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;
3 голосов
/ 30 марта 2011

Вы можете создать подкласс окна без написания класса-потомка, что полезно, когда вы ожидаете, что измененное поведение будет одноразовым требованием.Напишите функцию TWndMethod, как в ответ Андреаса , но запишите ее в любом классе, который вы хотите, например в форме, которой принадлежит представление списка.Присвойте его свойству 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;
0 голосов
/ 30 марта 2011

Весь ответ в порядке :-), но я не хочу создавать нового потомка класса. Спасибо всем за помощь: -)!


Мое разрешение: Я использую компонент (в Delphi 7) ApplicationEvents и япроверить изменение позиции ScrollBar (GetScrollPos (ListView.Handle, SB_VERT)).

0 голосов
/ 30 марта 2011

Или, если вы хотите перехватить только событие вертикальной прокрутки, вы можете использовать это. Код почти такой же, как выложил Андреас ...

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;
...