C++ 如何深度复制构建器组件,如TPanel、TButton等

C++ 如何深度复制构建器组件,如TPanel、TButton等,c++,c++builder,C++,C++builder,有人知道如何深度复制构建器组件吗 我的印象是我可以使用赋值函数,因为他们没有可用的复制构造函数 我正在使用Assign,但它不喜欢将其用于TPanel(适用于Graphics::TBitmap)。我得到的错误是“无法将TPanel分配给TPanel” 有人知道我该怎么做吗?下面是一段代码: CConfigComponentPanel::CConfigComponentPanel( const CConfigComponentPanel& rkConfigComponentPanel ):

有人知道如何深度复制构建器组件吗

我的印象是我可以使用赋值函数,因为他们没有可用的复制构造函数

我正在使用Assign,但它不喜欢将其用于TPanel(适用于Graphics::TBitmap)。我得到的错误是“无法将TPanel分配给TPanel”

有人知道我该怎么做吗?下面是一段代码:

CConfigComponentPanel::CConfigComponentPanel( const CConfigComponentPanel& rkConfigComponentPanel ):
CConfigComponent( rkConfigComponentPanel ),
m_pkPanel( new TPanel(this) )
{
    m_pkPanel->Assign( rkConfigComponentPanel.m_pkPanel );
}
大多数VCL类根本不实现
Assign()
AssignTo()
方法。通常,只有非可视的实用程序类才会这样做(
TStringList
TFont
TGraphic
子体等)。深入复制组件(尤其是可视化组件)的唯一方法是使用其RTTI循环其属性,将其值从一个组件实例复制到另一个组件实例,如果存在子控件,则递归地一次复制一个。为此,请使用
TStream::WriteComponent()
TStream::ReadComponent()
方法将组件及其子组件保存到内存中的临时DFM,并从中读取。这样,RTL将为您处理RTTI访问。例如:

CConfigComponentPanel::CConfigComponentPanel( const CConfigComponentPanel& rkConfigComponentPanel )
    : CConfigComponent( rkConfigComponentPanel ), m_pkPanel( new TPanel(this) ) 
{ 
    TMemoryStream *Strm = new TMemoryStream;
    try
    {
        Strm->WriteComponent( rkConfigComponentPanel.m_pkPanel );
        Strm->Position = 0;
        Strm->ReadComponent( m_pkPanel );
    }
    __finally
    {
        delete Strm;
    }
} 
或:


嗨,谢谢你的回答,你的回答很有道理。但是,当运行此代码时,我得到一个“未找到类TPanel”错误?我在某个地方读到应该调用RegisterClass,但这会导致编译错误吗?我使用Borland C++ Builder 2007。我在尝试使用InsertComponent函数时也遇到了一个错误,除非这是我需要编写的函数?如果确实找不到
TPanel
,则
rkConfigComponentPanel.m_pkPanel
也无法在运行时实例化(假设它是在设计时放置在
TForm
上的组件)。设计时组件在运行时自动注册,以便在DFM流期间可以找到它们
InsertComponent()
t组件
的一种方法。假设,由于您最初是以
m_pkPanel
的所有者身份传递
this
,因此
CConfigComponentPanel
TComponent
的后代。
t组件.Create()
构造函数在内部调用
AOwner.InsertComponent(Self)
。如果您有编译器错误,请显示它们。他们的意思是你的代码中有错误。嗨,我的组件是一个类的一部分,它不是dfm。我想这就是造成我问题的原因。我认为我的设计将不得不改变以解决这个问题,因为它可能告诉我,设计一开始就不太正确。我使用VCL的方式并不打算使用。为了解决这个问题,我使用了指针而不是实例,这样我的复制构造函数就不会被调用,从而避免了对深度复制的需要。谢谢大家的帮助,因为我学到了一些新东西。乔
CConfigComponentPanel::CConfigComponentPanel( const CConfigComponentPanel& rkConfigComponentPanel )
    : CConfigComponent( rkConfigComponentPanel ), m_pkPanel( NULL ) 
{ 
    TMemoryStream *Strm = new TMemoryStream;
    try
    {
        Strm->WriteComponent( rkConfigComponentPanel.m_pkPanel );
        Strm->Position = 0;
        m_pkPanel = (TPanel*) Strm->ReadComponent( NULL );
        InsertComponent( m_pkPanel );
    }
    __finally
    {
        delete Strm;
    }
}