2013-02-17 53 views
2

在ListView中,如何隨時將對象附加到已存在的ListItem中? (我知道我可以附加一個對象到一個ListItem與AddItem,但我需要在創建ListItem後附加對象)。將對象附加到已存在的ListItem中?

+0

而不是使用'數據'你可以使用'OnCreateItemClass'並創建你自己的'TListItem'的專用子類。 – 2013-02-17 16:42:20

+0

@DavidHeffernan謝謝。你有一個例子如何做到這一點? – user1580348 2013-02-17 16:54:17

+0

你在你的清單項目中存儲什麼? – 2013-02-17 17:03:22

回答

6

您可以通過TListItem.Data屬性訪問它。例如:

var 
    ListItem: TListItem; 
begin 
    ListView1.AddItem('Item 1', nil); 
    ... 
    ListItem := ListView1.Items[0]; 
    ListItem.Data := Edit1; 
    TEdit(ListItem.Data).Text := 'Updated text...'; 
end; 
+0

謝謝。我需要知道如何在一個ListItem對象後面附加一個對象,而不是如何在已經用'AddItem'附加後訪問對象。謝謝。 – user1580348 2013-02-17 16:52:11

+4

@user - 第一句話是你的答案:Item.Data:= ... – 2013-02-17 16:56:19

5

你可以解決這個使用TListItemData財產。這通常是一種快速而簡單的方法。如果您需要列表項目來管理其關聯數據的生命週期,那麼唯一輕微的摺痕是。在這種情況下,您必須實施一個OnDeletion事件處理程序,以在節點被銷燬時最終確定關聯的數據。

另一種方法是使用TListItem的子類。首先定義您的子類:

type 
    TMyListItem = class(TListItem) 
    private 
    FDateTime: TDateTime; 
    public 
    property DateTime: TDateTime read FDateTime write FDateTime; 
    end; 

然後爲列表視圖的OnCreateNodeClass事件實施處理程序。這確定列表視圖實例化的列表項目的實際類別。

procedure TForm1.ListView1CreateItemClass(Sender: TCustomListView; 
    var ItemClass: TListItemClass); 
begin 
    ItemClass := TMyListItem; 
end; 

現在列表視圖將創建類TMyListItem的項目。

因此,您可以像訪問其他任何屬性一樣訪問列表項的DateTime屬性。當然,這種方法可以擴展到存儲更多信息。

唯一的另一點是列表視圖控件仍然會爲您提供編譯時鍵入爲TListItem的項目。所以你需要上演。

例如,假設您想在編輯項目時執行某些操作。事件處理程序如下所示:

procedure ListView1Edited(Sender: TObject; Item: TListItem; var S: string); 

請注意,該項目的傳遞類型爲TListItem。所以你需要這樣寫:

procedure TForm1.ListView1Edited(Sender: TObject; Item: TListItem; 
    var S: string); 
var 
    MyItem: TMyListItem; 
begin 
    MyItem := Item as TMyListItem; 
    if MyItem.DateTime .... 
end; 
+0

感謝大衛,對這種替代方法的很好和廣泛的解釋!但是,使用CreateItemClass替代方法時,用戶刪除某個項目時會發生什麼? ListView是否也會處理並銷燬我添加的自定義數據字段? (例如FDateTime)。 – user1580348 2013-02-17 18:28:02

+1

是的。它會在物品上調用Free,並且你的區域將被丟棄,就像對象中的任何區域一樣。 – 2013-02-17 18:30:12

+0

我是否需要在所有ListView方法實現中上傳Item參數,或僅在需要訪問自定義數據字段的位置? – user1580348 2013-02-17 18:46:41

相關問題