Delphi:继承的Create导致访问冲突

问题描述 投票:0回答:1

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

FormTypeA := TFormTypeA.Create(Application);

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

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

在“继承的Create(AOwner);”行上我收到访问冲突:“ Project ThisApplication.exe引发了带有消息'c0000005 ACCESS_VIOLATION的异常类$ C0000005”

我根本不知道在代码中寻找解决问题的位置。如我所写,其他形式使用相同的结构并且可以正常工作。

任何建议都会很受欢迎。

forms constructor owner inherited tcomponent
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”

我知道,每个人都会打错字。这个讨厌。

我花了相当长的时间才能找到答案。我希望这个描述对其他人有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.