告诉我,问题出在哪里:
第一种形式:
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。我没有对表单关于做任何其他事情,关于代码是空的,只需点击按钮。
答案 0 :(得分:11)
虽然Doug是对的,但最简单的解决方案是仅进行更改
procedure TAbout.Button1Click(Sender: TObject);
begin
Close;
end;
无论如何都是程序的“正确”版本。如果您点击当前Button1
表单的TAbout
(即Self
),您自然希望关闭当前的TAbout
表单(即Self
)。在Close
班级内Self.Close
是TAbout
的简写。
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
声明,它应该有效。