2010-04-20 19 views

Respuesta

11

Debe destruir el botón después de que todo su código haya terminado de ejecutarse. La forma estándar de hacer esto es publicar un mensaje definido por el usuario en el formulario y darle al formulario un método de mensaje que lo interpretará. Por ejemplo:

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. 

Esto funciona porque el mensaje se pone en la cola de mensajes de Windows y no sale hasta que todo antes de que (incluyendo el mensaje Haga clic en el botón que se encuentra actualmente respondiendo a) se haya completado el procesamiento.

+0

Esto funcionó muy bien, gracias! He intentado hacer un "Enviar mensaje" pero no funcionó, así que renuncié a este enfoque. "PostMessage" hizo el truco! – Pmmlr

+0

@Pmmlr: Sí. SendMessage procesa el mensaje de inmediato, mientras que PostMessage lo publica en la cola de mensajes, por lo que debe esperar su turno antes de procesarlo. –

+4

@Pmmlr: Esta es la misma forma que 'procedure TForm.Release' ha estado haciendo desde Delphi 1:' PostMessage (Handle, CM_RELEASE, 0, 0); 'funciona junto con el' procedure TForm.CMRelease' que hace 'Gratis ', Conocer la diferencia entre' PostMessage' y 'SendMessage' es importante: es por eso que funciona. Esta pregunta explica PostMessage con más detalle: http://stackoverflow.com/questions/2551435/postmessage-tutorial –

0

En su lugar, podría simplemente activar un temporizador en el evento OnClick, luego escribir el evento Timer primero para deshabilitar el temporizador y luego llamar al procedimiento que está llamando actualmente desde el evento OnClick. Configure el temporizador desactivado y con un corto intervalo de tiempo.

Cuestiones relacionadas