2015-12-23 52 views
3

我開始玩VirtualTreeView,它似乎從VirtualTreeView管理用戶提供的數據的內存(如果有的話)的所有Web信息和文檔。一個不需要New()和Dispose()任何用戶數據。在調用GetNodeData之後,必須告訴VirtualTreeView userdata的大小並分配它的字段值。VirtualTreeView是否爲節點的userdata管理內存,或者我可以嗎?

如果我想管理它,該怎麼辦?可以做到嗎?我可以根據需要創建用戶數據並將其添加到我自己的列表中,並且只提供VirtualTreeView中每個記錄的指針而不干擾它?

回答

5

人們只要告訴VirtualTreeView用戶數據的大小,並呼籲GetNodeData

這是不完全正確後轉讓其字段的值 - 一個也有照顧敲定用戶數據記錄它應該包含需要它的數據類型 - 即引用計數類型,如字符串和接口。這是在OnFreeNode事件中完成的。所以,如果您的數據記錄包含字符串

type 
    TMyNodeData = record 
    Foo: string; 
    end; 

,那麼你必須在節點的數據被釋放到空字符串分配給它:

procedure TForm1.VT_FreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); 
var ND: PMyNodeData; 
begin 
    ND := Sender.GetNodeData(Node); 
    if(ND <> nil)then begin 
    ND.Foo := ''; 
    end; 
end; 

othervise你會泄露該字符串。

自己管理內存的最簡單方法是根本不使用VT的用戶數據記錄,或者只有指向其中一些其他數據結構的指針。

2

不,你不能。 VTW使用固定大小的用戶數據,因此它提供了快速計算和訪問。

但是你可以請求SizeOf(pointer)大小userdata,然後將指針存儲在VTW提供的用戶數據中。這些幀及其大小的數據類型以及您自己管理的分配/解除分配。仍然需要在VTW提供的userdata中存儲指向它的指針,但除此之外,您不會依賴它。

在較新的Delphi(2010+)中,您也可以使用TDictionary<Pointer, you-data-type>對象,並使用由VTW給出的PVirtualNode作爲該容器的關鍵字檢索數據。這樣你就可以設置UserData的大小爲零,所以VTW只會根據自己的需要分配節點內存池。

但是,儘可能讓用戶更好地使用UserData--因爲VTW團隊專門爲您優化了速度。

相關問題