Delphi 2010 - 我有一个TreeView,大约有2000个节点。每个节点都有一个数据对象,指向一个记录。当我退出程序时,与数据对象相关联的内存是否会自动释放,还是我需要遍历每个节点并对其进行DISPOSE处理?
Delphi 2010 - 我有一个TreeView,大约有2000个节点。每个节点都有一个数据对象,指向一个记录。当我退出程序时,与数据对象相关联的内存是否会自动释放,还是我需要遍历每个节点并对其进行DISPOSE处理?
通过Google搜索找到这个问题,没有找到我刚使用的解决方案,尽管这个问题已经有几年了,但我还是决定回答一下。
TTreeView有一个OnTreeDeletion方法,当树中的每个节点被删除时调用该方法,从而有机会释放/处理任何相关数据。
以下是我的代码:
procedure TfmMyForm.MyTreeDeletion(Sender: TObject; Node: TTreeNode);
var
rci: TRecentCodeItem;
begin
rci := node.data;
if assigned(rci) then
freeandnil(rci);
end;
TTreeNode
类的Data
属性是为您的私有需求而设计的。它是一个无类型指针,这使您可以随意在其中放置任何内容。OnCreateNodeClass
是实现这一目标的关键。我使用了这个解决方案,也许它能帮助未来的某个人:
TTreeViewItemEx<TData: class> = class(TTreeViewItem)
private
_dataObject: TData;
public
destructor Destroy; override;
property dataObject: TData read _dataObject write _dataObject;
end;
destructor TTreeViewItemEx<TData>.Destroy;
begin
if Assigned(_dataObject) then
_dataObject.Free;
inherited;
end;
用法:
procedure UsageExample;
var
node: TTreeViewItemEx<TData>;
begin
node := TTreeViewItemEx<TData>.Create(treeView);
node.DataObject := TData.Create;
node.Parent := treeView;
end;
是的,一旦您退出程序,数据就会被释放,因为对象驻留在应用程序运行的进程的同一内存空间中。无论如何,手动释放它们是一个好习惯,可以使用 Object.free
或更好的是 FreeAndNil(object)
。
Dispose
。 - David HeffernanTTreeNode
中存储一个对象。最好的做法可能是直接存储对象而不是记录指针,例如MyClass := TMyClass.Create;
,然后稍后使用TMyClass(Node.Data).Free;
。 - FlorisFree
是不合适的。 - David Heffernan
Data
属性不知道您放入其中的内容,它们只是指针。 - Jerry Dodge