[英]Deleting dynamically created control borland 6 c++ builder
我在Borland C ++ Builder 6中删除动态创建的按钮时遇到问题。
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner) {
TButton *but = new TButton(this);
but->Left = 100;
but->Top = 100;
but->OnClick = click;
Form1->InsertControl(but);
}
void __fastcall TForm1::click(TObject *Sender) {
delete Sender;
}
当我单击创建的按钮时,出现错误“模块'rtl60.bpl'中地址40005905的访问冲突,读取地址00000018”
我知道为按钮分配一个删除它的方法是错误的,但是我真的需要通过按一下按钮来删除按钮
您的代码中有两个错误。
当调用TForm1
构造函数时,尚未分配全局Form1
变量,因此您的Form1->InsertControl(but)
语句无效并且很可能崩溃。 使用this->
代替Form1->
。 但是,您不应直接调用InsertControl()
,而应设置按钮的Parent
属性:
but->Parent = this;
在事件处理程序运行时delete
事件的Sender
者是不安全的。 处理程序退出后,RTL仍需要访问该对象(如AccessViolation错误所示)。 您将不得不延迟delete
,例如使用短计时器:
void __fastcall TForm1::DeleteButtonTimerElapsed(TObject *Sender) { TObject *obj = reinterpret_cast<TObject*>(DeleteButtonTimer->Tag); DeleteButtonTimer->Tag = 0; DeleteButtonTimer->Enabled = false; delete obj; } void __fastcall TForm1::click(TObject *Sender) { DeleteButtonTimer->Tag = reinterpret_cast<int>(Sender); DeleteButtonTimer->Enabled = true; }
或使用PostMessage()
向自己发布自定义消息(我更喜欢这种方法):
#define WM_DELETE_OBJECT (WM_USER + 1) void __fastcall TForm1::WndProc(TMessage &Message) { if (Message.Msg == WM_DELETE_OBJECT) delete reinterpret_cast<TObject*>(Message.LParam); else TForm::WndProc(Message); } void __fastcall TForm1::click(TObject *Sender) { TButton *btn = static_cast<TButton*>(Sender); btn->OnClick = NULL; PostMessage(Handle, WM_DELETE_OBJECT, 0, reinterpret_cast<LPARAM>(Sender)); }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.