正在尝试与旧VCL TTreeNode.相同的方法好吧,没有TTreeNode,也没有方法将treenodes添加到树中,相反,我必须手动创建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方法是空的虚拟存根,必须在子孙类中将其重写。您不能以TreeViewItem.Data的方式使用它,因为Data实际上包含TTreeViewItem.Name属性。

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

  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;

关于delphi - Firemonkey TTreeView-在TTreeViewItems,TValue中存储对象引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29122108/

10-09 16:26