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