【问题标题】:TVirtualStringTree - add object instead of recordTVirtualStringTree - 添加对象而不是记录
【发布时间】:2016-11-24 16:58:37
【问题描述】:

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

我已经查看了有关该问题的答案: Delphi, VirtualStringTree - classes (objects) instead of records 但他们不工作。

我想添加到树节点的对象就像

  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;

我得到一个 E2015 Operator not aplicable to this operand type error 。这可能是我在这里缺少的非常简单的东西......

我知道我可以将它添加为带有对象成员的记录,例如:

TNode = record
 obj: TMyObject;
end;

但我想了解我做错了什么。

【问题讨论】:

  • V5.2.2 不是最新版本。从 V6 开始,TVirutalNode 具有通用的辅助方法来添加或设置避免类型转换的节点。
  • 好点@JoachimMarder。我只看过 soft-gems 网页,而不是 jam soft...

标签: delphi delphi-xe2 virtualtreeview tvirtualstringtree


【解决方案1】:
function AddItem(Item: TNodeElem): PVirtualNode;
begin
  Result := FTreeView.InsertNode(nil, amAddChildLast, Item);
end;

function GetItem(Node: PVirtualNode): TNodeElem;
var
  NodeData: Pointer;
begin
  Result := nil;
  if not Assigned(Node) then
    exit;
  NodeData := FTreeView.GetNodeData(Node);
  if Assigned(NodeData) then
    Result := TNodeElem(NodeData^);
end;

【讨论】:

  • 很明显......现在我可以为自己的愚蠢扇耳光了。
【解决方案2】:

另一种方法是将对象的索引存储在 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;

【讨论】:

    猜你喜欢
    • 2015-02-15
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 2016-09-03
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多