Большинство классов 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;
}
}
Или:
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;
}
}