2010-02-08 16 views
1

我有一個TListView後代,引入了從數據集中排序和加載等附加功能。在TListView後裔中檢查的處理項目

我現在希望修改該類,以便每當某個項目被選中或取消選中時,就會在檢查項目的內部列表中添加或刪除該項目,以便使用該組件實例的應用程序可以輕鬆地讀取該項目的編號和位置檢查項目而不必遍歷列表視圖中的所有項目。

不幸的是,TCustomListView似乎將檢查邏輯嵌入到一個大的消息處理函數中,而不是將檢查/取消檢查操作抽象爲一些可以重寫的內部方法(如DoCheck)。

我能想到的將我自己的行爲整齊地引入組件的唯一方法是劫持OnItemChecked屬性,導致該屬性讀取和寫入FOnItemCheckedUser(例如)而不是FOnItemChecked,將我自己的代碼放在FOnItemChecked中,並從我的代碼中調用FOnItemCheckedUser。

有沒有更直接的方法來處理這個問題?如果沒有,我的想法是否可行和安全?

+1

由於您正在實現附加功能並創建自己的後代,您是否考慮過使用VirtualTreeView代替TLisView? –

+0

我剛開始使用VirtualTreeView,但對於我在列表視圖類中做的事情,TListView更接近我需要的東西。 –

回答

4

不幸的是,檢查事件代碼被埋在消息處理程序中,但它不是一個showstopper。自己抓住並處理相同的消息。檢測父類的消息處理程序檢查的相同條件,然後在那裏執行您的自定義操作。之後,致電inherited

type 
    TListViewDescendant = class(TListView) 
    private 
    procedure CNNotify(var Message: TMessage); message cn_Notify; 
    end; 

procedure TListViewDescendant.CNNotify(var Msg: TMessage); 
begin 
    if IsCheckBoxNotification(Msg) then 
    DoSpecialCheckBoxHandling; 
    inherited; 
end; 
+0

謝謝,羅布,我花了幾天時間回到這裏。處理CN_NOTIFY消息的過程在祖先類(TCustomListView)中是私有的和非虛擬的。我不能直接覆蓋它,但據推測,可以用我自己的方法來掩蓋它來處理CN_NOTIFY。但是,我也似乎無法使用繼承調用祖先方法 - 「無法訪問專用符號TCustomListView.CNNotify」。 –

+0

好的,想通了(即查找)如何促進CNNotify在我的後代類中受到保護,並且這似乎允許我調用繼承版本。目前正在努力解決此問題。 –

+0

你不需要重寫任何東西。編寫自己的消息處理程序。使用'message'指令。祖先方法不需要可見。只使用一個簡單的「繼承的」語句,編譯器會將消息轉發給下一個處理程序,而不管下一個處理程序發生什麼命名。 ('CNNotify'只是一個約定,可以任意命名。) –