VirtualStringTreeに表示されるデータの階層があります。私はこの階層をアプリケーションで複数回使用していますが、ツリーの描画/表示方法にわずかな変更を加えています。私のメソッドは現在、AddChild()プロシージャを使用してノードを追加しているため、アプリケーションの実行時にデータの複数のコピーがあります。
これらのツリーを統合し、実際のデータを指す「マスター」ツリーを作成しますが、「スレーブ」ツリーは同じデータを指すようにします。
これを達成できるかどうか/どのように達成できるかは少しわかりません。マスターツリーをロードして、その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;
現時点では、ノードは正しい階層に追加されていますが、スレーブツリーのテキストは表示されていません。どんな助けでもいただければ幸いです。