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)
这是主窗体上的错误之一
您的(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)