2010-04-20 42 views

回答

11

您需要在所有代码完成执行后销毁该按钮。这样做的标准方法是将一个用户定义的消息发布到表单上,并为表单提供一个消息方法来解释它。例如:

unit Unit1; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls; 

const 
    WM_KILLCONTROL = WM_USER + 1; 

type 

    TForm1 = class(TForm) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    procedure KillControl(var message: TMessage); message WM_KILLCONTROL; 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

{ TForm1 } 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    PostMessage(self.Handle, WM_KILLCONTROL, 0, integer(Button1)) 
end; 

procedure TForm1.KillControl(var message: TMessage); 
var 
    control: TControl; 
begin 
    control := TObject(message.LParam) as TControl; 
    assert(control.Owner = self); 
    control.Free; 
end; 

end. 

这工作,因为消息被放入Windows的消息队列和它(包括该按钮当前响应点击消息)处理完毕不出来,直到一切。

+0

这很好,谢谢! 我试图做一个“SendMessage”,但它不起作用,所以我放弃了这种方法。 “PostMessage”做到了! – Pmmlr 2010-04-20 17:41:17

+0

@Pmmlr:是的。 SendMessage会立即处理消息,而PostMessage会将其发布到消息队列中,以便在处理之前必须等待。 – 2010-04-20 18:11:28

+4

@Pmmlr:自从Delphi 1:'PostMessage(Handle,CM_RELEASE,0,0);''它与'procedure TForm.CMRelease'一起工作的过程TForm.Release'一样, ',知道'PostMessage'和'SendMessage'之间的区别很重要:这就是它工作的原因。这个问题更详细地解释PostMessage:http://stackoverflow.com/questions/2551435/postmessage-tutorial – 2010-04-20 18:43:59

0

您可以改为在OnClick事件中启用计时器,然后先写入Timer事件以禁用计时器,然后从OnClick事件中调用当前正在调用的过程。设置定时器禁用并且间隔时间较短。