首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在C++Builder中将VirtualTree记录从一个VT引用到另一个VT?

如何在C++Builder中将VirtualTree记录从一个VT引用到另一个VT?
EN

Stack Overflow用户
提问于 2018-07-23 19:06:32
回答 1查看 58关注 0票数 1

有人能帮我在C++Builder中使用VirtualTree吗?

我有一个包含记录的VT1

和包含记录的VT2

我将值从VT1复制到VT2

代码语言:javascript
复制
void __fastcall TForm3::CopyItemsFromVT1ToVT2(TVirtualStringTree *VT_List, PVirtualNode NodeList, TVirtualStringTree *VT_Tree, PVirtualNode NodeTree) {
   ((PTreeData)VT_Tree->GetNodeData(NodeTree))->Id=((TForm1::PTreeData)VT_List->GetNodeData(NodeList))->Id;
   ((PTreeData)VT_Tree->GetNodeData(NodeTree))->Type=((TForm1::PTreeData)VT_List->GetNodeData(NodeList))->Type;
   ((PTreeData)VT_Tree->GetNodeData(NodeTree))->Date=((TForm1::PTreeData)VT_List->GetNodeData(NodeList))->Date;
   ((PTreeData)VT_Tree->GetNodeData(NodeTree))->Time=((TForm1::PTreeData)VT_List->GetNodeData(NodeList))->Time;
   ((PTreeData)VT_Tree->GetNodeData(NodeTree))->Char_Code=((TForm1::PTreeData)VT_List->GetNodeData(NodeList))->Char_Code;
   ((PTreeData)VT_Tree->GetNodeData(NodeTree))->Number_Code=((TForm1::PTreeData)VT_List->GetNodeData(NodeList))->Number_Code;
   ((PTreeData)VT_Tree->GetNodeData(NodeTree))->Message=((TForm1::PTreeData)VT_List->GetNodeData(NodeList))->Message;
}

如何才能将记录从VT1引用到VT2?这是正确的吗?

代码语言:javascript
复制
((PTreeData)VT2->GetNodeData(ParentNodeTarget)) = ((PTreeData)VT1->GetNodeData(ParentNodeSource))
EN

回答 1

Stack Overflow用户

发布于 2018-07-24 06:57:46

你可以让编译器为你做,而不是手动复制单个字段,假设TreeData是一个实现了operator=structclass (特别是由编译器生成的默认operator=),例如:

代码语言:javascript
复制
struct TreeData
{
    ...
};
typedef TreeData *PTreeData;

...

VT1->NodeDataSize = sizeof(TreeData);
VT2->NodeDataSize = sizeof(TreeData);

...

void __fastcall TForm3::CopyItemsFromVT1ToVT2(TVirtualStringTree *VT_List, PVirtualNode NodeList, TVirtualStringTree *VT_Tree, PVirtualNode NodeTree)
{
    *static_cast<PTreeData>(VT_Tree->GetNodeData(NodeTree)) = *static_cast<PTreeData>(VT_List->GetNodeData(NodeList));
}

但是,如果您希望VT2节点只指向与VT1节点相同的数据,而不制作副本,那么您需要在任何节点之外分配TreeData实例,然后只在节点内存储TreeData*指针,例如:

代码语言:javascript
复制
struct TreeData
{
    ...
};
typedef TreeData *PTreeData, **PPTreeData;

...

VT1->NodeDataSize = sizeof(PTreeData);
VT2->NodeDataSize = sizeof(PTreeData);

...

PTreeData data = new TreeData;
// initialize data as needed ...
*static_cast<PPTreeData>(VT1->GetNodeData(SomeNode)) = data;

...

// OnFreeNode event handler for VT1...
void __fastcall TForm3::VT1FreeNode(TBaseVirtualTree *Sender, PVirtualNode Node)
{
    delete *static_cast<PPTreeData>(Sender->GetNodeData(Node));
}

...

void __fastcall TForm3::CopyItemsFromVT1ToVT2(TVirtualStringTree *VT_List, PVirtualNode NodeList, TVirtualStringTree *VT_Tree, PVirtualNode NodeTree)
{
    *static_cast<PPTreeData>(VT_Tree->GetNodeData(NodeTree)) = *static_cast<PPTreeData>(VT_List->GetNodeData(NodeList));
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51477342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档