1

我不确定如何将数据分配给 VirtualStringTree 中的节点。我需要在树控件的 InitNode 事件中将指向记录对象的指针分配给节点的 Data 属性。但是,我收到“需要指针类型”编译时错误。

type
  TDiagData = record
    DiagID: Integer;
    DiagName: String;
    Selected: Byte;
  end;

  PDiagData = ^TDiagData;

var
  FDiagDataList: TObjectList;
  c: Integer; // used as an iterator for the list // incremented in vst1InitNode



procedure Btn1Click;
var
  DiagData : PDiagData;
begin

  try
    FDiagDataList := TObjectList.Create; // TODO: Move this to form constructor

    for c := 1 to 10 do
    begin
      New(DiagData);

      DiagData.DiagID := c;
      DiagData.DiagName := Format('Diag# %d', [c]);

      FDiagDataList.Add(DiagData);
    end;

    c := 0;

    vst1.NodeDataSize := SizeOf(TDiagData);
    vst1.RootNodeCount := 10; // test

  finally
    //  FDiagDataList.Free;   //TODO: Move this to form destructor
  end
end;

procedure vst1InitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode;
  var InitialStates: TVirtualNodeInitStates);
var
  DiagData: PDiagData;
begin

  DiagData = TDiagData(FDiagDataList.Items[c]); // FDiagDataList is a TObjectlist

  Node.Data^ := DiagData; // <--- this is not working ..
  // The error is: Pointer type required.

  Inc(c);
end;

我需要将数据分配给 InitNode 事件中的节点,但不确定如何分配。

4

1 回答 1

2

不要Node.Data直接读或写。需要的数据不一定恰好位于该字段的地址。(树控件具有允许后代为自己保留额外数据的机制。)相反,调用Sender.GetNodeData.

var
  NodeData: PDiagData;
begin
  NodeData := Sender.GetNodeData(Node);
  NodeData^ := TDiagData(FDiagDataList.Items[c]);
end;

您的代码失败,因为Node.Data有 type record; 你不能用^. 在简单的情况下,返回的值GetNodeData将等于该字段的地址(即GetNodeData(Node) = @Node.Data)。但不要假设所有情况都很简单。正如我所说,树控件的后代可以保留自己的数据空间,因此您正在与您无法控制的代码共享该空间,并且由树控件来管理您数据空间。总是打电话GetNodeData


此外,您对数据类型感到困惑。您说FDiagDataListis a TObjectList,但您显然在其中存储了不是TObject. 当你不使用对象时,不要使用TObjectList. 如果您使用早于 2009 年的 Delphi 版本,则使用并TList存储指向TDiagData

NodeData^ := PDiagData(FDiagDataList[c])^;

如果您使用的是 Delphi 2009 或更高版本,请使用TList<TDiagData>,然后摆脱类型转换:

NodeData^ := FDiagDataList[c];

无论哪种方式,如果每个事件处理程序都以相同的方式开始,您可能会发现事情更容易管理,调用以GetNodeData获取指向当前节点数据的类型安全指针。

于 2014-10-29T16:41:14.963 回答