6
A
回答
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
您可以改爲在OnClick事件中啓用計時器,然後先寫入Timer事件以禁用計時器,然後從OnClick事件中調用當前正在調用的過程。設置定時器禁用並且間隔時間較短。
這很好,謝謝! 我試圖做一個「SendMessage」,但它不起作用,所以我放棄了這種方法。 「PostMessage」做到了! – Pmmlr 2010-04-20 17:41:17
@Pmmlr:是的。 SendMessage會立即處理消息,而PostMessage會將其發佈到消息隊列中,以便在處理之前必須等待。 – 2010-04-20 18:11:28
@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