我有两个VirtualStringTrees,第一个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。
答案 0 :(得分:4)
使用列表比较算法可以轻松查找一个列表中但不是一秒钟内的所有项目。这是基本的想法:
您可以向equals案例添加操作,或者在第一个唯一或第二个唯一案例中添加操作,以确定在这些情况下要执行的操作。在您的特定情况下,您将要使第二个唯一案例向VST添加项目。如果你必须保留树结构,它可能会变得更复杂,但这是基本的想法。