У меня есть кнопка. Его событие OnClick называет процедуру, которая уничтожает кнопку, но затем "поток" хочет возвратиться к событию OnClick, и я получаю нарушение прав доступа.
Я полностью озадачен!
Вам нужно уничтожить кнопку после того, как завершится выполнение всего ее кода. Стандартный способ сделать это - опубликовать определяемое пользователем сообщение в форме и предоставить форме метод сообщения, который будет его интерпретировать. Например:
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 и не выводится до тех пор, пока все перед ним (включая сообщение Click, на которое в данный момент отвечает кнопка) не будет обработано.
Вместо этого вы можете просто включить таймер в событии OnClick, затем сначала записать событие Timer, чтобы отключить таймер, а затем вызвать процедуру, из которой вы сейчас вызываете событие OnClick. Настройте таймер отключенным и с коротким интервалом времени.