gpt4 book ai didi

delphi - 如何不向 TVirtualStringTree 添加重复项?

转载 作者:行者123 更新时间:2023-12-03 15:53:05 31 4
gpt4 key购买 nike

我有两个 VirtualStringTree,第一个 VST 已填充数据,我想检查第二个 VST 并添加第一个 VST 中尚未存在的节点。或者我想添加第二个 VST 中不与第一个 VST 重复的节点。

procedure Tcreatevtform.copy2tosimvt(vt: Tvirtualstringtree);
var
data: PMyRec;
simvtdata: PMyRectF;
rootnode, simvtnode: PVirtualNode;
ty: string;
begin
rootnode := vt.GetFirst; //vt is second virtualstringtree
while Assigned(rootnode) do
begin
data := vt.GetNodeData(rootnode);
ty := data^.caption;
if checksimduplicate(ty)=false then
begin
simvtnode := similarvt.AddChild(nil); //similarvt is the first virtualstringtree
simvtdata := similarvt.GetNodeData(simvtnode);
simvtdata^.caption := data^.caption;
end;
rootnode := vt.GetNext(rootnode,false);
end;
end;

function Tcreatevtform.checksimduplicate(t: string): boolean;
var
data: PMyRectf;
rootnode: PVirtualNode;
typew: string;
begin
Result := False;
rootnode := similarvt.GetFirst;
while Assigned(rootnode) do
begin
data := similarvt.GetNodeData(rootnode);
typew := data^.caption; // problem here, typew is always a constant or it is always the first
if t=typew then
begin
// node's caption of vt (letter 'a' is the first node's caption in my
// app. So this function is always false.
Result := True;
Break;
end;
similarvt.GetNext(rootnode, False);
end;
end;

我正在使用 D7。

最佳答案

使用列表比较算法可以轻松找到一个列表中但不是第二个列表中的所有项目。基本思想如下:

  • 对两个列表进行排序
  • 采用 2 个索引变量,每个列表一个,并从每个列表的开头开始
  • 根据排序顺序比较每个列表中的两个索引项。
    • 如果它们相等,则两个列表中都包含相同的项目。增加两个索引。
    • 如果第一项小于第二项,则它不在第二个列表中。增加第一个索引。
    • 如果第二个项目小于第一个项目,则它不在第一个列表中。增加第二个索引。
  • 重复此操作,直至到达其中一个列表的末尾。另一个列表中的所有剩余项目都不在第一个列表中。

您可以向等于情况或第一个唯一或第二个唯一情况添加操作,以确定在这些情况下要执行的操作。在您的具体情况下,您需要让第二个唯一的情况向 VST 添加一个项目。如果您必须保留树结构,它可能会变得更加复杂,但这是基本思想。

关于delphi - 如何不向 TVirtualStringTree 添加重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7456514/

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