gpt4 book ai didi

delphi - 使用 1 个数据副本同步多个 VirtualStringTree

转载 作者:行者123 更新时间:2023-12-01 17:47:42 25 4
gpt4 key购买 nike

我有一个显示在 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;

从属树获取CellText的过程

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;

目前,节点已添加到正确的层次结构中,但从属树没有出现任何文本。任何帮助将不胜感激。

最佳答案

我不知道为什么您的奴隶树中没有出现任何文本,但我想提出以下建议。

可能更容易的是使用树和代码创建一个框架,并在表单上重用该框架。树的每个实例只需加载相同的数据(无需复制节点)。

通过为框架/树的特定实例编写新的事件处理程序,可以通过视觉形式继承来实现细微的修改。如果需要,您还可以从框架继承,创建一个新类。

关于delphi - 使用 1 个数据副本同步多个 VirtualStringTree,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7884950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com