如何在InitNode事件中将数据分配给VirtualStringTree的节点

我不知道如何将数据分配给VirtualStringTree中的节点。 我需要为树控件的InitNode事件中的Node的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事件中的节点,但不知道如何分配它。


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

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

你的代码失败,因为Node.Data有类型record ; 你不能用^来解除引用。 在简单情况下, GetNodeData返回的值将等于该字段的地址(即, GetNodeData(Node) = @Node.Data )。 但不要以为所有情况都很简单。 正如我所说的,树控后裔可以保留自己的数据空间,因此您可以使用不受您控制的代码来共享该空间,并由树控制来管理您的数据空间。 始终调用GetNodeData


此外,你对你的数据类型感到困惑。 你说FDiagDataList是一个TObjectList ,但你明确地存储了它不是TObject的后代的东西。 当你不使用对象时,不要使用TObjectList 。 如果您使用的是早于2009年的Delphi版本,请使用TList并将指针存储到TDiagData

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

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

NodeData^ := FDiagDataList[c];

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

链接地址: http://www.djcxy.com/p/35073.html

上一篇: How to assign data to node of VirtualStringTree in InitNode event

下一篇: Color VirtualStringTree rows with hidden nodes