有人知道如何深度复制构建器组件吗?
我的印象是我可以使用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)
大多数VCL类根本不实现Assign()or 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;
}
}
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)