Firemonkey TTreeView - 在 TTreeViewItems、TValue 中存储对象引用

Firemonkey TTreeView - Storing object references in TTreeViewItems, TValue

尝试使用与旧 VCL 相同的方法 TTreeNode. 好的,没有 TTreeNode 并且没有方法将树节点添加到树中,我必须手动创建 TTreeViewItem 实例并将其父 属性 设置为 TTreeView 实例。现在,TTreeViewItem 有一个数据 属性 但它的类型是 TValue.

如何处理这种类型?

我尝试了以下方法:

type
  TMaster = class(TDevice)
  ...
  end;

  ...
  mstitem := TTreeViewItem.create(self);
  mstitem.parent := TreeView1;
  mstitem.data := TMaster.Create(i, 'master'+ inttostr(i));
  ...

  procedure TForm1.TreeView1Click(Sender: TObject);
  var 
    obj: TObject;        
  begin
    selectednode := TTreeView1.Selected;
    obj := TDevice(selectednode.Data.AsObject); //Invalid typecast
    if obj is TDevice then
      showmessage( TDevice(obj).DevName );
  end;

TFmxObject.SetData 方法是空的虚拟存根,必须在后代 classes 中覆盖它。你不能像你那样使用TreeViewItem.Data,因为Data实际上包含TTreeViewItem.Name属性。

您必须创建自己的后代 TTreeViewItem class 并使用它代替默认的

  TMyTreeViewItem = class(TTreeViewItem)
  protected
    fData: TValue;
    function GetData: TValue; override;
    procedure SetData(const Value: TValue); override;
  end;

function TMyTreeViewItem.GetData: TValue;
begin
  Result := fData;
end;

procedure TMyTreeViewItem.SetData(const Value: TValue);
begin
  fData := Value;
end;