Delphi TGUID到TTreeNode.Data?

Delphi TGUID到TTreeNode.Data?,delphi,delphi-2010,Delphi,Delphi 2010,我希望通过将TGUID放入TTreeNode来使用它的Data(pointer)属性。 有人知道如何做到这一点吗 这是代码的一部分,可能会帮助你们理解我在做什么 if Assigned(trNode) then begin trNode := tvMain.Items.Add(trNode, dmMain.qryTreeView.FieldByName('SomeColumn').Text); gID := StringToGUID(dmMain.qryTreeView.FieldByN

我希望通过将TGUID放入TTreeNode来使用它的Data(pointer)属性。 有人知道如何做到这一点吗

这是代码的一部分,可能会帮助你们理解我在做什么

if Assigned(trNode) then
begin
  trNode := tvMain.Items.Add(trNode, dmMain.qryTreeView.FieldByName('SomeColumn').Text);
  gID := StringToGUID(dmMain.qryTreeView.FieldByName('ID').Text);
  trNode.Data := //how do I do this?

TGUID
是记录,所以动态分配它,并将其地址存储到节点的数据中,如

var gID: PGUID;
begin
  New(gID);
  gID^ := StringToGUID(...);
  trNode.Data := gID;

Remembre在删除节点时释放内存,否则将导致内存泄漏

处理此问题的最佳方法是从
TTreeNode
派生一个新类,并给它一个
TGUID
数据成员,然后使用
TTreeView.OnCreateNodeClass
事件让树视图创建类的实例。这样,RTL会自动为您的guid值管理内存(并允许您以任何其他方式自定义节点)。要访问guid,只需在需要时键入
TTreeNode
指针。例如:

type
  TMyTreeNode = class(TTreeNode)
  public
    Guid: TGuid;
  end;

procedure TMyForm.tvMainCreateNodeClass(Sender: TCustomTreeView; var NodeClass: TTreeNodeClass);
begin
  NodeClass := TMyTreeNode;
end;


还有一种方法不需要您手动(dea)分配guid内存。请参阅我的答案以获取示例。
trNode := tvMain.Items.Add(...);
TMyTreeNode(trNode).Guid := StringToGUID(...);