c++ - 删除动态创建的控件 borland 6 c++ builder

标签 c++ c++builder c++builder-6

我在 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. 在事件处理程序运行时删除事件的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));
    }
    

关于c++ - 删除动态创建的控件 borland 6 c++ builder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34443446/

相关文章:

c++ - 如何解决 [Linker Error] Unresolved external in Borland C++ builder 6

c++ - 使用 C++ Builder 实现 Active Directory

c++ - C++/CLI 中的值类

c++ - 宏作为预处理器指令的参数

c# - 如何从 C# 将 PWCHAR 传递到 C++ dll

c++ - 从 ini 文件中读取十六进制字符

我可以在 Delphi 中使用 C 头文件吗?

c++builder - Borland C++Builder 6 有调试日志工具吗?

c++ - VCL 中的 Application.DispatcherUnhandledException

c++ - 用cocos2d-x绘制平滑的贝塞尔曲线