有人能帮我在C++Builder中使用VirtualTree吗?
我有一个包含记录的VT1
:
和包含记录的VT2
:
我将值从VT1
复制到VT2
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
?这是正确的吗?
((PTreeData)VT2->GetNodeData(ParentNodeTarget)) = ((PTreeData)VT1->GetNodeData(ParentNodeSource))
发布于 2018-07-24 06:57:46
你可以让编译器为你做,而不是手动复制单个字段,假设TreeData
是一个实现了operator=
的struct
或class
(特别是由编译器生成的默认operator=
),例如:
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*
指针,例如:
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));
}
https://stackoverflow.com/questions/51477342
复制相似问题