我试图在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