加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 当我在自己的OnClick处理程序中销毁一个按钮时,为什么

发布时间:2020-12-15 10:04:24 所属栏目:大数据 来源:网络整理
导读:我从我运行的网站上尝试了一个脚本 http://www.delphi-central.com/runtime.aspx并取得成功. private { Private declarations } procedure CustomButtonClick(Sender: TObject); procedure TForm1.AddNewButtonClick(Sender: TObject);var NewButton : TButt
我从我运行的网站上尝试了一个脚本
http://www.delphi-central.com/runtime.aspx并取得成功.
private
  { Private declarations }
  procedure CustomButtonClick(Sender: TObject);
procedure TForm1.AddNewButtonClick(Sender: TObject);
var
  NewButton : TButton;
begin 
  NewButton := TButton.create(self);

  with NewButton do
  begin
    Top    := 30;
    Width  := 60;
    Left   := Width * (self.ControlCount-2);
    Parent := self;
    OnClick := CustomButtonClick;
    Caption := 'Button '+ inttostr (self.ControlCount-2);
  end;  //With
end;

procedure TForm1.DeleteLastButtonClick(Sender: TObject);
begin
  if Self.ControlCount>2 then
    TButton (Controls[ControlCount-1]).destroy;
end;

procedure TForm1.CustomButtonClick(Sender: TObject); 
begin    
    ShowMessage(TButton(Sender).caption + ' Pressed'); 
end;

但如果我更改OnClick,

OnClick := CustomButtonClick; ==> OnClick := DeleteLastButtonClick;

它会生成一条错误消息.
怎么会发生这种情况…… ???

解决方法

事件处理程序由控件对象上的函数调用,一旦事件处理程序完成,它可能有更多代码要执行.如果删除该控件,则引用该对象的任何代码都可能引发访问冲突.

您需要做的是让程序在完成当前运行的所有代码后删除控件.为此,您需要发布消息.如果您不了解消息,这是一个学习的好机会.

您需要创建新的消息类型ID. WM_USER 1应该可以工作.其中一个参数将是要删除的控件的地址.在表单上设置一个处理该消息类型的消息处理程序,并释放消息参数中引用的控件.然后在事件处理程序中,将PostMessage消息发送给您的表单.这应该工作而不会导致访问冲突.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读