销毁调用onKeyDown事件的元素

时间:2015-07-30 15:39:43

标签: freepascal

我目前正在与Free Pascal合作,我遇到了处理onKeyDown事件的问题。事实是,每当我尝试使用onKeyDown事件来销毁(ex:element.Free)元素(包括调用事件的元素)时,我都会收到SIGSEV异常。我已经尝试过改变元素焦点,然后才排除" Free"过程,但无济于事。

有没有办法顺利删除(免费)元素而无需获得" SIGSEV"例外?我已经成功地使用按钮来排除相同的方法,但是现在我需要将其设置为使用onKeyDown事件,因此需要设置的元素之一" Free"恰好在触发onKeyDown事件时关注焦点。

希望这很清楚,如果你需要一些事情,请告诉我,

的奥斯卡

1 个答案:

答案 0 :(得分:3)

原因:

据我了解你正在尝试像

这样的东西
procedure TElement.OnKeyPress(...);
begin
  Free;
end;

这里有几个答案为什么你不能在其事件处理程序中销毁对象。简而言之:在调用事件处理程序之后,对象可能想要做某事,如果它已经被你破坏了 - 在这种情况下你将拥有SIGSEGV。

解决方案:

你必须推迟销毁对象。有几种情况:使用PostMessage,使用Application.QueueAsyncCall等。

有一个简单的例子:

type
    TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
    private
        procedure FreeButton(Data: PtrInt);
    public
    end;

var
    Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
    Application.QueueAsyncCall(@FreeButton, PtrInt(Button1));
end;

procedure TForm1.FreeButton(Data: PtrInt);
begin
    TButton(Data).Free;
end;

Read more about Application.QueueAsyncCall.