如何深度复制Builder组件,例如TPanel,TButton等

Yos*_*Yos 2 c++ c++builder

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

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

我正在使用Assign,但是它不喜欢它用于TPanel(对于Graphics :: TBitmap可以正常工作)。我得到的错误是“无法将TPanel分配给TPanel”?

有人对我应该怎么做有任何想法吗?一段代码如下:

CConfigComponentPanel::CConfigComponentPanel( const CConfigComponentPanel& rkConfigComponentPanel ):
CConfigComponent( rkConfigComponentPanel ),
m_pkPanel( new TPanel(this) )
{
    m_pkPanel->Assign( rkConfigComponentPanel.m_pkPanel );
}
Run Code Online (Sandbox Code Playgroud)

Rem*_*eau 5

大多数VCL类根本不实现Assign()or AssignTo()方法。通常,只有非可视工具类做(TStringListTFontTGraphic后代,等)。深入复制组件(尤其是可视组件)的唯一方法是使用其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;
    }
} 
Run Code Online (Sandbox Code Playgroud)

要么:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)