Уничтожьте объект во время события, названного упомянутым объектом

У меня есть кнопка. Его событие OnClick называет процедуру, которая уничтожает кнопку, но затем "поток" хочет возвратиться к событию OnClick, и я получаю нарушение прав доступа.

Я полностью озадачен!

6
задан Pmmlr 20 April 2010 в 16:59
поделиться

2 ответа

Вам нужно уничтожить кнопку после того, как завершится выполнение всего ее кода. Стандартный способ сделать это - опубликовать определяемое пользователем сообщение в форме и предоставить форме метод сообщения, который будет его интерпретировать. Например:

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, на которое в данный момент отвечает кнопка) не будет обработано.

11
ответ дан 9 December 2019 в 22:31
поделиться

Вместо этого вы можете просто включить таймер в событии OnClick, затем сначала записать событие Timer, чтобы отключить таймер, а затем вызвать процедуру, из которой вы сейчас вызываете событие OnClick. Настройте таймер отключенным и с коротким интервалом времени.

0
ответ дан 9 December 2019 в 22:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: