首先,非常感谢TLama的所有解释和指导。我必须接受他的回答,因为我已经在此基础上构建了我的答案。我只是将其发布为答案,以便另一个 Lazarus 初学者可能会发现这很有用。无论如何,我并不是说这是最好的事情,但这是我现在想做的事情。也就是当某个异常发生时,我想捕获它并处理它。
鉴于,
- 我正在动态创建一组 TPanel 看起来像按钮
- 每个 TPanel 都为其分配了一个 mouseclick 事件
假设有 10 个这样的“按钮”(实际上是 TPanel)。
问题:当我第一次单击第一个按钮时,我可以单击另一个(例如:第 5 个)。但是,如果我首先单击第 5 个或第一个以外的任何其他内容,则程序会引发“访问冲突”错误。但是请注意,尽管关于数据损坏和其他东西的丑陋警告,该程序不会崩溃。所以用户可以简单地点击确定并继续。奇怪的是,随着随后的点击,这个问题减少了!我知道这很有趣。
现在,正如 TLama 所解释的,在单击按钮后释放鼠标时会发生错误。
但这是我的问题......我没有 mouseup 事件。这是帕斯卡的一部分。
所以现在,我想忽略 mouseup 事件(至少现在是这样)。一定会有更好的办法。
但还有另一个问题。我不能忽视我没有的!而且我没有 mouseup 事件。所以我最终决定在应用程序级别捕获这个错误,如下所示:
在主窗体上,我输入了以下代码:
procedure TfrmMainForm.CatchErr(Sender: TObject; e:exception);
begin
if e.Message <> 'Access violation' then ShowMessage('MOL: ' + e.Message);
end;
然后在创建表单时,我输入了这个:
Application.OnException:=@CatchErr;
而且(现在)我可以绕过这个问题。
再一次,正如 TLama 所指出的,这不是一个好的建议。尽管如此,这是我想做的。
更难的是,该错误发生在 control.inc 中的 mouseup 中。这不是我的档案。相反,它是拉撒路的一部分。我认为如果我们有办法告诉 Lazarus 为代码中的 TPanel 删除该事件会更好。我认为它涉及为它重写一个派生类,我现在不知道这对我有什么好处:)
再次感谢特拉玛!