TVirtualStringTree - 添加对象而不是记录
TVirtualStringTree - add object instead of record
我有一个 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;
但我想了解我做错了什么。
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;
另一种方法是将对象的索引存储在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;
我有一个 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;
但我想了解我做错了什么。
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;
另一种方法是将对象的索引存储在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;