【发布时间】:2013-02-16 11:55:23
【问题描述】:
如何将所有节点从一个 VirtualTreeView 复制到另一个? 我尝试使用 CopyTo 功能,但数据为空,为什么? 数据包含对记录的引用(像往常一样)。
我也尝试使用@Cosmin Prund 在他现已删除的答案中建议的OnNodeCopying 事件,但它会崩溃:
procedure TDataBaseForm.SourceTreeViewNodeCopying(Sender: TBaseVirtualTree;
Node, Target: PVirtualNode; var Allowed: Boolean);
var
SourceNodeData, DestNodeData: PNodeDataForCompare;
begin
SourceNodeData := Sender.GetNodeData(Node);
DestNodeData := VirtualStringTree1.GetNodeData(Target);
if Assigned(SourceNodeData) then
begin
DestNodeData^ := SourceNodeData^;
end;
Allowed := true;
end;
【问题讨论】:
-
我怎样才能让您在我的问题中包含代码?我是 stackoverflow 的新手。
-
这只是一个修辞 :-) 我已经包含了 @Cosmin 的评论中的代码(现已删除的答案),但请 edit your question 并包含您的确切错误消息得到,当你使用该代码时。而且,欢迎使用 StackOverflow!
-
如果你说“它崩溃了”,那么我只能说:“好吧,修复它!”。如果您告诉我们发生了什么异常、错误消息是什么以及发生在哪一行,我们或许可以帮助您修复它。
-
CopyTo的工作方式有点麻烦:所有要复制的节点首先流式传输到内存中的流,然后重新创建。在重新创建节点时,会调用OnNodeCopying,但使用无用的参数:Node是新创建的节点,Target是传递给CopyTo()的Target节点。这就是为什么我删除了我的答案,不幸的是,这是一个糟糕的“线索”。您需要原始节点 + 新节点才能复制数据,但您会获得新节点和用作目标的节点。 -
另一种想法是实现
OnSaveNode和OnLoadNode以将节点保存/读取到VirtualTreeView 使用的流中。我认为这两个会使 VT 的复制工作,但我没有时间测试,我不想提供其他可能不起作用的部分答案。