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

Mic*_*ael 2 forms delphi

告诉我,问题出在哪里:

第一种形式:

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

第二种形式:

procedure TAbout.Button1Click(Sender: TObject);
begin
 About.Close;
end;
Run Code Online (Sandbox Code Playgroud)

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

And*_*and 11

虽然Doug是对的,但最简单的解决方案是只做出改变

procedure TAbout.Button1Click(Sender: TObject);
begin
  Close;
end;
Run Code Online (Sandbox Code Playgroud)

无论如何,这是该程序的"正确"版本.如果单击Button1当前TAbout表单(即Self),您自然希望关闭当前TAbout表单(即Self).并且在课堂上Close是短手Self.CloseTAbout.

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

procedure TForm2.N6Click(Sender: TObject);
begin
  About.ShowModal;
end;
Run Code Online (Sandbox Code Playgroud)

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

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

任何情况下,你想

procedure TAbout.Button1Click(Sender: TObject);
begin
  Close; // same thing as Self.Close;
end;
Run Code Online (Sandbox Code Playgroud)


Dou*_*oug 7

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

但在关于形式,当你尝试调用CloseAbout变量使用全局变量,在这种情况下仍然未初始化.

尝试删除本地About声明,它应该工作.

  • 是的,Doug得到了错误纠正的原因.是的,建议的解决方案是有效的,但它确实不对.你通过在本地程序中使用全局变量创建和释放`TAbout`对象来射击自己.看我的回答. (5认同)