Delphi - 使用第二种形式时出现AV错误

时间:2014-01-15 22:44:28

标签: forms delphi access-violation

我有一个主窗体,当单击一个按钮时,它使用以下代码创建子窗体。要创建的表单(frmNewMember)已从自动创建表单列表中删除。

procedure TfrmMain.btnAddMemberClick(Sender: TObject);
var
  NewMemberForm: TForm;
begin
  NewMemberForm := TfrmNewMember.Create(Application);
  try
    NewMemberForm.ShowModal;
  finally
    NewMemberForm.Free;
  end;
end; 

当我尝试在表单中创建的过程中使用组件时,会出现AV。例如:

procedure DoSomething;
begin
  frmNewMember.edtPostcode.Text := 'TEST';
end;

这会引发读取错误为000003BC的AV。这是因为我试图访问不存在的frmNewMember实例吗?我确信这有一个简单的答案,但我搜遍了整个地方,似乎无法摆脱AV错误。

1 个答案:

答案 0 :(得分:0)

这是你的问题:

frmNewMember

这是Delphi IDE(un)为您帮助声明的全局变量。你从来没有分配它,所以它仍然是零。因此违反了访问权限。

您已停止使用自动创建,这是正确的做法。下一步是清除这些无用的全局变量的代码。一旦你完成了,你就不能再犯这个错误了。

您仍然需要将表单引用添加到该函数中。但现在您可以将其作为参数传递。或者使函数成为表单的一种方法。这也使你的代码更好,所以你继续获胜。

我认为这个问题是 VB的诅咒。添加了全局表单变量以允许Delphi模仿VB的行为。我们早就意识到VB在这方面很糟糕。但是我们仍然留下了这些可怕的全局。


旁白:

  • 局部变量也可以声明为TfrmNewMember。
  • 没有必要将Application传递给构造函数,因为您通过try / finally管理生命。通过nil代替。