我有一個顯示在VirtualStringTree中的數據的層次結構。我在我的應用程序中多次使用這種層次結構,並對樹的繪製/顯示方式進行了輕微修改。我的方法當前使用AddChild()過程來添加節點,因此在應用程序運行時我有多個數據副本。使用1個數據副本同步多個VirtualStringTrees
我現在想合併這些樹並且有一個指向實際數據的「主」樹,但是然後讓'奴隸'樹指向同一個數據。
我有點不確定是否/如何達到這個目的。我會認爲我可以簡單地加載主樹,並使用指向我所保存的數據的指針來填充它的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;
目前,節點被添加到正確的層次結構中,但是沒有文本出現在從屬樹中。任何幫助,將不勝感激。
從你的問題,我以爲你已經這樣做了。 ;-)恭喜找到解決方案。 –
我想這樣做,只是沒有在那裏! :) – Simon