关于TClipboard复制粘贴含子对象的VCL
GetComponent之后,每次myEdit都为NULL,TMyPanel里会多一个TEdit,每次都会调用构造函数发生new。如果不移动MyEdit的位置不会发现多出一个,希望找出解决办法,下面是代码:
#ifndef Unit3H
#define Unit3H
//----------------H--------------------------------------------------
#include <ExtCtrls.hpp>
class TMyPanel : public TPanel
{
public:
__fastcall TMyPanel(Classes::TComponent * AOwner);
__fastcall ~TMyPanel();
TEdit *myEdit;
};
#endif
//---------------------------------------
#pragma hdrstop
#include "Unit3.h"
//---------------CPP-------------------------------------------------
#pragma package(smart_init)
__fastcall TMyPanel::TMyPanel(TComponent* Owner):TPanel(Owner)
{
myEdit = new TEdit(this);
myEdit->Parent = this;
myEdit->Left = 0;
myEdit->Top = 0;
}
__fastcall TMyPanel::~TMyPanel()
{
delete myEdit;
}
//-------------------------form H------------------------------------------
#ifndef Unit2H
#define Unit2H
//---------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Clipbrd.hpp>
#include "Unit3.h"
//---------------------------------------
class TForm2 : public TForm
{
__published:// IDE-managed Components
TButton *Button1;
TButton *Button2;
void __fastcall FormShow(TObject *Sender);
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
private:// User declarations
TClipboard *cl;
TMyPanel *MyPanel;
public:// User declarations
__fastcall TForm2(TComponent* Owner);
};
//---------------------------------------
extern PACKAGE TForm2 *Form2;
//---------------------------------------
#endif
//--------------------------form CPP-----------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
//---------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
cl = new TClipboard();
}
//---------------------------------------
void __fastcall TForm2::FormShow(TObject *Sender)
{
MyPanel = new TMyPanel(this);
MyPanel->Parent = this;
}
//---------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
cl->SetComponent(MyPanel);
}
//---------------------------------------
void __fastcall TForm2::Button2Click(TObject *Sender)
{
TClass classes =__classid(TMyPanel);
RegisterClass(classes);
classes =__classid(TEdit);
RegisterClass(classes);
TMyPanel *pPanel = static_cast<TMyPanel*>(cl->GetComponent(this,this));
pPanel->Left = MyPanel->Left+MyPanel->Width + 20;
pPanel->myEdit->Left = pPanel->myEdit->Left +pPanel-> myEdit->Width + 10;
UnRegisterClass(classes);
}
//---------------------------------------
[解决办法]
你这个问题是因为你的这个部分
__fastcall TMyPanel::TMyPanel(TComponent* Owner):TPanel(Owner){myEdit = new TEdit(this);myEdit->Parent = this;myEdit->Left = 0;myEdit->Top = 0;}
[解决办法]
你说的是对的,这个blog上写的代码其实也是一样产生了两个Edit的。看来要想完美的解决这个问题,应该是要完善这个类,至少我觉得那个edit的产生不能放到构造函数里面。