2010-04-20 13 views

Odpowiedz

11

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.

+0

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

+0

@Pmmlr: Tak. SendMessage natychmiast przetwarza wiadomość, a PostMessage umieszcza ją w kolejce wiadomości, więc przed przetworzeniem musi poczekać na swoją kolej. –

+4

@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 –

0

Zamiast tego można po prostu włączyć licznik czasu w zdarzeniu OnClick, a następnie najpierw zapisać zdarzenie czasomierza, aby wyłączyć licznik czasu, a następnie wywołać procedurę, którą aktualnie wywołujesz ze zdarzenia OnClick. Ustaw timer wyłączony i na krótki czas.

Powiązane problemy