繁体   English   中英

删除动态创建的控件Borland 6 C ++ Builder

[英]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”

我知道为按钮分配一个删除它的方法是错误的,但是我真的需要通过按一下按钮来删除按钮

您的代码中有两个错误。

  1. 当调用TForm1构造函数时,尚未分配全局Form1变量,因此您的Form1->InsertControl(but)语句无效并且很可能崩溃。 使用this->代替Form1-> 但是,您不应直接调用InsertControl() ,而应设置按钮的Parent属性:

     but->Parent = this; 
  2. 在事件处理程序运行时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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM