EAccessViolation异常!!! (详细,有图)

EAccessViolation exception!!! (detailed, With images)

好吧,我又来了,试图解决一个老问题。

简而言之,当我尝试释放一个没有任何所有者且之前没有被释放过的模态形式时,我得到了一个 AV。

frmItensVenda := TfrmItensVenda.Create(nil);
                frmItensVenda.vtipo := vtipo;
                frmItensVenda.vcontrole := strtoint(edit1.Text);
                frmItensVenda.Ednota.Text := Edit5.Text;
                frmitensvenda.lbvend.Caption := combobox3.Text;
                frmitensvenda.lbnome.Caption := combobox1x.Text;
                frmItensVenda.limite := limite;
                if label10.caption <> '' then
                    frmItensVenda.vcli := strtoint(label10.caption);
                frmItensVenda.ShowModal;
                Frmitensvenda.Close;
                frmItensVenda.Free;

如果我只是激活它然后关闭(什么都不做),则不会发生 AV。在 'free' 命令之前放置一个断点,如果我将鼠标光标放在它上面,它会显示表单内的变量。

但是如果我在网格中插入一项,在同一位置使用断点,当我将光标移动到同一行时,它不再显示变量,而是显示 'inacessible value'。

如果我继续 运行ning 代码,因为下一行有 'free' 命令,我会得到一个 AV。 是什么让我相信该过程中有一些代码正在做一些代码意想不到的事情,但我可以告诉你,那里没有 'free' 或类似的命令到有问题的表格。

我的解决方案(临时)是只注释 '.free' 命令,但是如果我 运行 MadException 我在关闭应用程序时遇到内存泄漏(嘿,任何东西都比这个 EAccessViolation 更好现在对我来说..)
有什么建议吗?

OP : frmItensVenda is a global variable automatic created(but not initialized).

我看到你了frmItensVenda := TfrmItensVenda.Create(nil);

在您的 .dpr 文件中查找 Application.CreateForm(TfrmItensVenda, frmItensVenda);
如果它在那里,您将创建一个新实例!

{$R *.RES}

begin
  Application.Initialize;
  Application.Title := 'AServer';
  ...
  Application.CreateForm(TfrmItensVenda, frmItensVenda);
  ...
  Application.Run;
end.

是的,动态表单管理确实必须(特别是在大型应用程序中。)。

遇到大 Forms 的问题时,我的部分解决方案是尽可能创建动态。
仅在需要时才释放它们。


  frmItensVenda := TfrmItensVenda.Create(nil);
  frmItensVenda.ShowModal;

OP : My solution(temporary) was to just comment the '.free' command,

不要那样做:改用

  frmItensVenda.Release;

"Method Release" 删除表单并释放其关联的内存。

发布程序;

描述

通过释放,您可以从内存中删除表格。

发布是在表单及其子组件的事件处理程序执行完成之前采用的表单。

在所有事件处理程序中,应使用 release 而不是 free 以避免访问冲突。

您需要使用 Release 的情况是您正处于事件处理程序(例如 OnClick)的中间,在这种情况下,事件后的进一步处理将必须访问表单。

在这种情况下,调用 Release 而不是发布一条 WM_RELEASE 消息,该消息不会释放事件,直到事件处理程序完成并且控制权已返回到消息泵(ProcessMessages/Application.运行).

虽然看了delphi帮助,还是推荐使用release命令

至于释放v.s免费方法。我的理解是 "Release" 特定于表单,并允许与表单相关的偶数处理程序在释放资源之前完成。

而 "Free" 是从内存中释放对象的通用方法(因此也适用于表单。)

好的,终于找到答案了。 问题是一个全局数组。 它被宣布
vm1 : array[1..100] of currency;
但它在位置 0.
处被分配了一个值 令我绝望的是,当我试图释放表单时,分配变量时没有错误。 当你找到它时很简单.. (!!!) 好吧,至少我想通了。感谢大家的支持!