2010-04-20 89 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事件中調用當前正在調用的過程。設置定時器禁用並且間隔時間較短。