尝试打开另一个表单时发生访问冲突

Jam*_*son 2 delphi delphi-2010

当我的项目尝试使用该命令打开单独的表单时,我遇到了访问冲突.Show。

该代码应该打开login表单。但只输出一个访问冲突错误。

这是主窗体中的代码,并在其激活时运行:

procedure TForm4.FormActivate(Sender: TObject);
begin
  label1.BringToFront;
  DBMatch.Enabled := false;
  DBContestants.Enabled := false;
  btncreate.Enabled := false;
  DbNav.Enabled := false;
  login.Show;
end;
Run Code Online (Sandbox Code Playgroud)

下面的代码是表单的开头login:

unit login_form;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs ,StdCtrls, ExtCtrls, unit4,pngimage;

type
  Tlogin = class(TForm)
    edit_username: TEdit;
    edit_password: TEdit;
    btnlogin: TButton;
    btnForgotten: TButton;
    lUsername: TLabel;
    LPassword: TLabel;
    Imageside: TImage;
    procedure btnloginClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
  end;

var
  login: Tlogin;
  password,result:string;

implementation
{$R *.dfm}
 uses dmChess_u;
Run Code Online (Sandbox Code Playgroud)

这是主窗体上的错误之一

程序主文件的图像

Rem*_*eau 5

您的(MainForm) 对象是在创建对象Form4之前创建的。login很可能,该事件也在创建对象TForm.OnActivate之前被触发。login因此,当您尝试调用它时login,指针仍然存在。您可以使用调试器轻松验证这一点。nilShow

表单的OnActivate事件不是显示登录表单的好地方。每当表单获得输入焦点时就会触发该事件,这在表单的生命周期中可能会发生多次。

另外,通常最好不要在程序启动时自动创建 Form 对象,MainForm 除外。仅在实际需要时通过构造函数动态创建 Form 对象Create,并在不再需要时释放它们,例如:

login := Tlogin.Create(nil);
try
  login.ShowModal;
finally
  login.Free;
end;
Run Code Online (Sandbox Code Playgroud)

或者:

login := Tlogin.Create(Self);
login.Show;

...

// OnClose event handler
procedure TloginClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;
Run Code Online (Sandbox Code Playgroud)

但是,在这种特殊情况下,如果您希望用户在与 MainForm 交互之前登录,我建议在创建 MainForm 之前显示登录表单,例如:

Application.Initialize;

login := Tlogin.Create(nil);
try
  if login.ShowModal <> mrOk then
    Exit;
finally
  login.Free;
end;

Application.CreateForm(TForm4, Form4);
Application.Run;
Run Code Online (Sandbox Code Playgroud)