2010-07-29 89 views
5

我试过一个脚本,我从一个网站运行 http://www.delphi-central.com/runtime.aspx并成功。当我在自己的OnClick处理程序中销毁按钮时,为什么我的程序崩溃?


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; 

它会产生一个错误信息。 这怎么可能发生......?

+5

如果你想摧毁一座建筑物 - 你会**在**或** **以外的地方吗? – Alex 2010-07-29 13:06:21

+1

让你的第一个问题变得不合时宜,可能会让你很沮丧。这个问题真的“不清楚或没用”吗? – mjn 2010-07-29 17:26:03

+0

@约瑟夫:梅森的回答是对的,你可以看看TForm(在Forms.pas中)它是如何做类似的事情的;查找程序Release和CMRelease,以及常量CM_Release。 – 2010-07-29 18:58:46

回答

5

当然,它发展迅速 - 这是当你切断你正在坐的分支时可能发生的事情。

您不能杀死该控件产生的事件处理函数内的控件。

请注意,您正在使用的示例是而不是指向CustomButtonClick的删除例程!

+0

我想我知道你的意思,你可以给一个小脚本,让我更好理解? – 2010-07-29 14:51:27

+0

什么脚本?问题在于你正在做一些无法完成的事情,这段时间。看看梅森的答案,以便正确地做到这一点。 – 2010-07-30 00:18:09

+0

让我以这种方式把它给你吧约瑟夫:请进入一个电话亭,然后当你在电话亭内时,请下令让电话亭上重10吨。现在你明白了吗? – 2010-07-30 13:07:56

6

事件处理程序由控件对象上的函数调用,并且事件处理程序完成后可以执行更多代码。如果您删除该控件,则引用该对象的任何代码都可能引发访问冲突。

你需要做的是让你的程序删除控制它完成了它所有的代码,它正在运行。为此,您需要发布消息。如果你不了解消息,这是一个很好的学习机会。

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

+0

谢谢惠勒.. 好吧,你是什么意思“新消息类型ID”?也许你可以给我一个我更懂的脚本。 – 2010-07-29 15:02:47

+0

如果我只是发布一个代码示例供您复制和粘贴,您实际上不会了解有关使用消息的任何信息,然后在下次发布消息时可能会派上用场,您不知道该做什么。这就是为什么StackOverflow真的不是“请给我工作代码”网站。如果你仔细查看它,这真的很简单,而且我知道你所了解的所有原理后,你就会知道你所需要的一切。 – 2010-07-29 15:11:06

+3

现在我知道你的意思了,我收到一篇关于你的意思的文章“http://www.cryer.co.uk/brian/delphi/howto_send_custom_window_message.htm” 我学到了更多 非常感谢...... – 2010-07-29 16:49:24

1

当您释放鼠标按钮/键后,系统必须以某种方式重新绘制按钮时,很容易想到看到原因。由于您在点击过程中已经删除了按钮对象,因此这会失败。

因此,您需要找到一种方式来在onClick事件处理发生并成功完成后以某种方式删除该按钮。

+0

那么...怎么?任何建议? – 2010-07-29 15:04:41

相关问题