Musisz zniszczyć przycisk po wykonaniu całego kodu. Standardowy sposób to zrobić, publikując w formularzu wiadomość zdefiniowaną przez użytkownika i podając formularz, który ją zinterpretuje. Na przykład:
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.
To działa, ponieważ wiadomość zostanie wprowadzony do systemu Windows Message Queue i nie wyjdzie, dopóki wszystko przed nim (w tym wiadomości kliknięcie, że przycisk jest obecnie w odpowiedzi na) zakończy przetwarzanie.
To działało ładnie, dzięki! Próbowałem zrobić "SendMessage", ale to nie zadziałało, więc zrezygnowałem z tego podejścia. "PostMessage" załatwił sprawę! – Pmmlr
@Pmmlr: Tak. SendMessage natychmiast przetwarza wiadomość, a PostMessage umieszcza ją w kolejce wiadomości, więc przed przetworzeniem musi poczekać na swoją kolej. –
@Pmmlr: Jest to ten sam sposób, co 'procedure TForm.Release' od Delphi 1:' PostMessage (Handle, CM_RELEASE, 0, 0); 'działa razem z' procedure TForm.CMRelease' która robi 'Free ', Ważna jest znajomość różnicy między' PostMessage' i 'SendMessage': dlatego to działa. To pytanie wyjaśnia bardziej szczegółowo PostMessage: http://stackoverflow.com/questions/2551435/postmessage-tutorial –