表单关闭时发生简单代码和错误

时间:2011-06-06 22:01:02

标签: forms delphi

告诉我,问题出在哪里:

第一种形式:

procedure TForm2.N6Click(Sender: TObject);
var About:TAbout;
begin
 About:=TAbout.Create(Application);
 try
   About.ShowModal;
 finally
   About.Free;
 end;
end;

第二种形式:

procedure TAbout.Button1Click(Sender: TObject);
begin
 About.Close;
end;

on About.Close我收到错误:EAccessViolation。我没有对表单关于做任何其他事情,关于代码是空的,只需点击按钮。

2 个答案:

答案 0 :(得分:11)

虽然Doug是对的,但最简单的解决方案是仅进行更改

procedure TAbout.Button1Click(Sender: TObject);
begin
  Close;
end;

无论如何都是程序的“正确”版本。如果您点击当前Button1表单的TAbout(即Self),您自然希望关闭当前的TAbout表单(即Self )。在Close班级内Self.CloseTAbout的简写。

TAbout是表单的。您可以创建此类的任意数量的实例,即所谓的对象。通常,项目中存在全局About变量,并且在应用程序启动时会自动创建此对象。为了表明这一点,你只需要做

procedure TForm2.N6Click(Sender: TObject);
begin
  About.ShowModal;
end;

另一种方法是禁用自动创建About表单(项目/选项),然后在每次需要时创建一个新实例。然后你做

procedure TForm2.N6Click(Sender: TObject);
var About:TAbout;
begin
  About := TAbout.Create(nil);
  try
    About.ShowModal;
  finally
    About.Free;
  end;
end;

任何案例中,您需要

procedure TAbout.Button1Click(Sender: TObject);
begin
  Close; // same thing as Self.Close;
end;

答案 1 :(得分:7)

当您在TForm2.N6Click方法中声明About变量时,不使用全局关于全局变量。

但是在“关于”表单中,当您尝试在Close变量上调用About时,您将使用全局变量,在这种情况下,该变量仍然未初始化。

尝试删除本地About声明,它应该有效。