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