0

我制作了一个应用程序,可以打开其他几个表单来处理任务。所有表格都可以正常工作,除了一个。我对所有表单都使用相同的代码。就像是:

FormTypeA := TFormTypeA.Create(Application);

在 Create 构造函数中,我添加了一些代码来初始化表单。它包含如下行:

constructor TFormTypeA.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  more code ...
end;

就行“继承的Create(AOwner);” 我收到访问冲突:“Project ThisApplication.exe 引发异常类 $C0000005,消息为‘c0000005 ACCESS_VIOLATION’

我根本不知道在哪里查看我的代码来解决问题。正如我所写,其他形式使用相同的结构并且工作正常。

任何建议都会非常受欢迎。

4

1 回答 1

0

好的。这就是发生的事情。

在设计这个特定的表单时,我使用了几个 TGridPanel。这些面板由列和行组成。由这个网格创建的单元格可以用 VCL 对象填充。一旦您将这些对象放在表单上,​​您就必须将它们绘制到所需的 GridPanel。之后,您必须通过在对象检查器中键入所需的行和列来指定正确的单元格。

到目前为止,一切都很好。

一旦您下定决心并想要更改某个对象的单元格位置,这种工作方式就会变得不那么结构化。对象移动到下一个位置,但这并不总是免费的,所以它们也会移动,所以事情很快就会变得混乱。

为避免这种情况,您可以使用表单的文本版本。如何?右键单击表单并选择以文本形式查看。转到正确的位置并进行更正。完成后,再次右键单击并选择以表单形式查看。

这种工作方式存在风险,那就是:错字

许多会被编译器捕获,但不是这个:

ControlCollection = <
  item
    Column = 0
    Control = SomeControlA
    Row = 0
  end
  item
    Column = -1  <------ Fatal!
    Row = 0
  end
  item
    Column = 0
    Control = SomeControlB
  end
end>

致命线是列(或行)的负值。这很明显。没有负列号。这就是您编写代码时发生的情况。

如果您返回表单,则不会收到错误或警告。编译的时候?安静。但是跑步?“带有消息‘c0000005 ACCESS_VIOLATION’的异常类 $C0000005”

我知道,每个人都会打错字。这个很恶心

我花了很长时间才发现这一点。我希望这个描述对其他人有帮助。

于 2019-11-26T20:55:05.823 回答