我試圖在TTreeNode.Data
屬性下的樹視圖中存儲接口指針。雖然我能夠存儲接口指針(Node.Data := Pointer(MyInterface);
),但似乎不能以其他方式工作(MyInterface := ISomeInterface(Node.Data);
)。它總是出來nil
。在樹視圖節點內存儲接口指針
我也試過使用手動引用計數,因爲我已經在another question中看到了。然而,它仍然出來nil
,現在給內存泄漏。
//Clears tree view and adds drive letters
procedure TfrmMain.cmdRefreshBrowseClick(Sender: TObject);
var
Arr, O: ISuperObject;
X: Integer;
N, C: TTreeNode;
begin
//First clear all items and release their interface refs
for N in tvBrowse.Items do begin
O:= ISuperObject(N.Data);
O._Release;
end;
tvBrowse.Items.Clear;
Arr:= ListDirectory(''); //Returns ISuperObject array listing drives
for X := 0 to Arr.AsArray.Length-1 do begin
O:= Arr.AsArray.O[X];
N:= tvBrowse.Items.Add(nil, O.S['drive']+':\ ['+O.S['type']+']'); //Add root node
N.Data:= Pointer(O); // Assign interface pointer to node data
O._AddRef; //Manually increment interface reference count
C:= tvBrowse.Items.AddChild(N, ''); //Add a fake child node
end;
end;
procedure TfrmMain.tvBrowseExpanding(Sender: TObject; Node: TTreeNode;
var AllowExpansion: Boolean);
var
N, C: TTreeNode;
P, A, O: ISuperObject;
X: Integer;
begin
//Check first node if it's a fake node
N:= Node.getFirstChild;
if N.Text = '' then begin //if first node is a fake node...
P:= ISuperObject(Node.Data); // <-- P always comes out nil here???
N.Delete; //Delete first "fake" node
//Get child files/folders
if Node.Parent = nil then //If root (drive) node...
A:= ListDirectory(P.S['drive']+':\') //Returns ISuperObject array listing files/folders
else
A:= ListDirectory(P.S['name']); //Returns ISuperObject array listing files/folders
for X := 0 to A.AsArray.Length-1 do begin
O:= A.AsArray.O[X];
C:= tvBrowse.Items.AddChild(N, O.S['name']); //Add child node
C.Data:= Pointer(O); //Assign interface pointer to node data
O._AddRef; //Manually increment reference count
end;
end;
end;
什麼是適當的方法來做到這一點?
您可以研究[TInterfaceList]的代碼(http://docwiki.embarcadero.com/Libraries/en/System.Classes.TInterfaceList)。 – 2014-09-01 18:23:19
或者我可以將每個接口及其內容轉換爲記錄並存儲記錄指針,而不是接口指針 – 2014-09-01 18:25:15
如果將一個InterfaceList和您的TTreeNode.Data指向InterfaceItem?樹視圖中的每個項目都是接口列表中的一個項目。 – Passella 2014-09-01 18:28:32