У меня есть иерархия данных, которая отображается в VirtualStringTree.Я использую эту иерархию несколько раз в своем приложении с небольшими изменениями в способе отображения / отображения дерева.Мой метод в настоящее время использует процедуру AddChild () для добавления узлов и d, поэтому у меня есть несколько копий данных при запуске приложения.
Теперь я хотел бы объединить эти деревья и получить «главное» дерево.который указывает на фактические данные, но затем «подчиненные» деревья указывают на те же данные.
Я немного не уверен в том, можно ли добиться этого.Я думаю, я мог бы просто загрузить главное дерево и заполнить его NodeData указателями на то место, где хранятся данные, а затем для всех подчиненных деревьев, просто сохранить тот же указатель в их ноданных.
Однако я немне повезло.
Мой текущий код выглядит следующим образом:
//Initialize the NodeDataSize
procedure TForm1.FormCreate(Sender: TObject);
begin
TreeMasterComponents.NodeDataSize := SizeOf(rMasterComponent);
VST.NodeDataSize := SizeOf(Pointer);
end;
Процедура копирования главного дерева в подчиненные деревья
procedure TForm1.LoadSlaveTree(ATree: TVirtualStringTree);
var Node : PVirtualNode;
procedure RecursiveCopy(SrcPNode,SrcTNode : PVirtualNode; ATree : TVirtualStringTree);
var SrcNode, TargetNode : PVirtualNode;
SrcData : PMasterComponent;
begin
SrcNode := TreeMasterComponents.GetFirstChild(SrcPNode);
while Assigned(SrcNode) do
begin
SrcData := TreeMasterComponents.GetNodeData(SrcNode);
TargetNode := ATree.AddChild(SrcTNode,SrcData);
RecursiveCopy(SrcNode,TargetNode,ATree);
SrcNode := SrcNode.NextSibling;
end;
end;
begin
ATree.BeginUpdate;
ATree.Clear;
Node := TreeMasterComponents.GetFirst(true);
while Assigned(Node) do
begin
RecursiveCopy(Node,nil,ATree);
Node := Node.NextSibling;
end;
ATree.EndUpdate;
end;
Процедура для подчиненного дерева в getCellText
procedure TForm1.SlaveGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var Data : PMasterComponent;
begin
Data := Sender.GetNodeData(Node);
Case column of
0:CellText := Data^.ComponentCode;
1:CellText := Data^.FullLocation;
end;
end;
В данный момент узлы добавляются в правильной иерархии, однако текст для подчиненных деревьев не отображается.Любая помощь будет оценена.