我目前正在与Free Pascal合作,我遇到了处理onKeyDown事件的问题。事实是,每当我尝试使用onKeyDown事件来销毁(ex:element.Free)元素(包括调用事件的元素)时,我都会收到SIGSEV异常。我已经尝试过改变元素焦点,然后才排除" Free"过程,但无济于事。
有没有办法顺利删除(免费)元素而无需获得" SIGSEV"例外?我已经成功地使用按钮来排除相同的方法,但是现在我需要将其设置为使用onKeyDown事件,因此需要设置的元素之一" Free"恰好在触发onKeyDown事件时关注焦点。
希望这很清楚,如果你需要一些事情,请告诉我,
的奥斯卡
答案 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;