2011-03-29 135 views
2

TListView控件是否有一個事件在控件滾動時觸發?TListView滾動事件

我不希望子類TListView控件。

+1

我不明白這個問題。 – 2011-03-29 20:48:33

+0

@David Heffernan:是的,就是這樣。 – Nanik 2011-03-29 20:52:20

+1

您需要監聽WM_VSCROLL。 – 2011-03-29 20:56:42

回答

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; 
+0

這個把戲有多安全/合法? Delphi會期望控件是不同的TListView嗎? (例如,表單設計師使用已註冊的控件工作,但這不是) – himself 2013-10-18 10:19:19

0

或者,如果你想陷入垂直滾動事件,你可以使用它。代碼幾乎與安德烈亞斯發佈的相同...

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

所有的答案都很好:-),但我不會創建新的孩子的類。 感謝大家的幫助:-)!


我的決心:我使用的組件(在Delphi 7)ApplicationEvents我檢查滾動條位置(GetScrollPos(ListView.Handle,SB_VERT))的變化。

+0

'Application.OnIdle'? – 2011-03-29 21:35:49

+0

我不知道,OnIdle有什麼功能,但它工作。 – Nanik 2011-03-29 21:37:02

+4

其他解決方案要好得多。您只需將代碼包含在具有此組件的表單中。它被稱爲插入器。你爲什麼害怕分類?這是一件非常正常的事情。每次事件出現在消息隊列中時調用GetScrollPos都是浪費的。 – 2011-03-29 21:37:12

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; 
+1

我準備發佈一個幾乎相同的答案,這使得只是相同的觀點。但是,我發現只聽WM_VSCROLL是不夠的。這適用於滾動條的操作,但如果使用鼠標滾輪或鍵盤導航,則不會觸發。我已經查看了看起來會有所幫助的LVN_ENDSCROLL通知消息,但是我無法讓我的代碼捕獲這些消息。 – 2011-03-29 22:32:41

+0

其實我越看越越絕望!也許OnMessage破解畢竟是最不可惡的! – 2011-03-29 22:37:04

+0

@David,通知消息被髮送給控件的* parent *。然後,德爾福的父母在添加一個值「cm_Base」後,將通知重新發送給指定的孩子。常用信息的名稱上有一個「C」前綴。嘗試捕捉'cm_Notify'而不是'wm_Notify'。 – 2011-03-29 22:55:37