Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi TVirtualStringTree-添加对象而不是记录_Delphi_Delphi Xe2_Virtualtreeview_Tvirtualstringtree - Fatal编程技术网

Delphi TVirtualStringTree-添加对象而不是记录

Delphi TVirtualStringTree-添加对象而不是记录,delphi,delphi-xe2,virtualtreeview,tvirtualstringtree,Delphi,Delphi Xe2,Virtualtreeview,Tvirtualstringtree,我有一个TVirtualStringTree(版本5.2.2),我需要向它的节点添加对象,而不是记录 我已经看过关于这个问题的答案: 但它们不起作用 我要添加到树节点的对象如下 TNodeElem = class public LineTimeS, LogMessage, MethName: String; LineDate,LineTime: TDateTime; LineDateTime: TDateTime; ElemType: TLogLineTy

我有一个TVirtualStringTree(版本5.2.2),我需要向它的节点添加对象,而不是记录

我已经看过关于这个问题的答案: 但它们不起作用

我要添加到树节点的对象如下

  TNodeElem = class
  public
    LineTimeS, LogMessage, MethName: String;
    LineDate,LineTime: TDateTime;
    LineDateTime: TDateTime;
    ElemType: TLogLineType;//ordinal type
....
  end;
这些节点将添加到TObjectList中:

FObjLst.Add(lNode);
并添加到树中:

var iPos: Integer;
    lNode: PVirtualNode;
    ldata: TNodeElem;
begin
  FTreeView.BeginUpdate;
  for iPos := 0 to FObjLst.Count -1 do
  begin
   lNode := FTreeView.AddChild(nil);
   lData := TNodeElem(FObjLst[iPos]);
   FTreeView.getNodeData(lNode)^ := lData;//E2015 Operator not aplicable to this operand type
   FTreeView.ValidateNode(lNode,False);
  end;
  FTreeView.EndUpdate;
end;

procedure VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex;
    TextType: TVSTTextType; var CellText: UnicodeString);
var
 Data: TNodeElem;
begin
 Data := FTreeView.GetNodeData(Node);
 CellText := Data.LogMessage;
end;
我得到了一份工作。这可能是我在这里所缺少的非常简单的东西

我知道我可以将其添加为具有以下对象成员的记录:

TNode = record
 obj: TMyObject;
end;
但是我想知道我做错了什么。

函数AddItem(Item:tnodelem):PVirtualNode;
开始
结果:=FTreeView.InsertNode(nil,amAddChildLast,Item);
结束;
函数GetItem(节点:PVirtualNode):tnodelem;
变量
NodeData:指针;
开始
结果:=无;
如果未分配(节点),则
出口
NodeData:=FTreeView.GetNodeData(节点);
如果已分配(节点数据),则
结果:=TNodeElem(NodeData^);
结束;

另一种方法是在Tlist中存储对象的索引。 那你就不用参考资料了。 检查错误引用更容易

procedure TForm1.Button2Click(Sender: TObject);
var i : Integer;
begin
  for i := 0 to Pred(Mylist.count) do
    VirtualStringTree1.AddChild(nil, pInteger(i));
end;

procedure TForm1.VirtualStringTree1GetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer);
begin
  NodeDataSize := SizeOf(integer);
end;

procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex;
  TextType: TVSTTextType; var CellText: string);
var i : Integer;
begin
  if Node = nil then Exit;
  CellText := 'Unknown';
  i := pInteger(Sender.GetNodeData(node))^;
  if (i >= 0) and (i < Mylist.Count) then begin
    if Assigned(MyList[i]) then
      Celltext := TmyObject(MyList[i]).MyText;
  end;
end;
procedure TForm1.按钮2点击(发送方:TObject);
varⅠ:整数;
开始
对于i:=0到Pred(Mylist.count)do
VirtualStringTree1.AddChild(nil,pInteger(i));
结束;
过程TForm1.VirtualStringTree1GetNodeDataSize(发送方:TBaseVirtualTree;变量NodeDataSize:Integer);
开始
NodeDataSize:=SizeOf(整数);
结束;
过程TForm1.VirtualStringTree1GetText(发送方:TBaseVirtualTree;节点:PVirtualNode;列:TColumnIndex;
TextType:TVSTTextType;var CellText:string);
varⅠ:整数;
开始
如果Node=nil,则退出;
CellText:=“未知”;
i:=pInteger(Sender.GetNodeData(node))^;
如果(i>=0)和(i
很明显……现在我可以为自己的愚蠢而自责了。V5.2.2不是最新版本。从V6开始,TVirutalNode有通用的帮助器方法来添加或设置避免类型转换的节点。我只看了软宝石网页,没有在果酱软。。。