【问题标题】:Delphi: inherited Create gives Access violationDelphi:继承的 Create 给出访问冲突
【发布时间】:2020-03-17 13:52:11
【问题描述】:

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

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'

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

非常欢迎任何建议。

【问题讨论】:

    标签: forms constructor owner inherited tcomponent


    【解决方案1】:

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

    在设计这个特定的表单时,我使用了几个 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 带有消息 'c0000005 ACCESS_VIOLATION"

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

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

    【讨论】:

      猜你喜欢
      • 2016-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多