Delphi 如何不将副本添加到TVirtualStringTree中?

Delphi 如何不将副本添加到TVirtualStringTree中?,delphi,virtualtreeview,tvirtualstringtree,Delphi,Virtualtreeview,Tvirtualstringtree,我有两个VirtualStringTree,第一个VST已经填充了数据,我想检查第二个VST并添加第一个VST中还没有的节点。或者我想从第二个VST添加那些不是第一个VST重复的节点 procedure Tcreatevtform.copy2tosimvt(vt: Tvirtualstringtree); var data: PMyRec; simvtdata: PMyRectF; rootnode, simvtnode: PVirtualNode; ty: string; be

我有两个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个索引变量,每个列表一个,从每个列表的开头开始
  • 根据排序顺序比较每个列表中的两个索引项。
    • 如果它们相等,则两个列表中都有相同的项。增加两个索引
    • 如果第一项小于第二项,则它不在第二个列表中。增加第一个索引
    • 如果第二项小于第一项,则它不在第一个列表中。增加第二个索引
  • 重复此操作,直到到达其中一个列表的末尾。其他列表中的所有剩余项不在第一个列表中

您可以向equals案例或第一个唯一案例或第二个唯一案例添加操作,以确定在这些案例中要执行的操作。在您的特定情况下,您需要使第二个唯一的情况向VST添加一个项。如果必须保留树结构,它可能会变得更复杂,但这是最基本的想法。

非常感谢。checksimduplicate应该重写。