Delphi 为什么有时显示隐藏形式会失火?

Delphi 为什么有时显示隐藏形式会失火?,delphi,delphi-xe4,Delphi,Delphi Xe4,我的表格1是主要表格。我使用它登录的目的和之后,我不需要它 我把它藏起来了。如果登录成功,单击按钮,将调用form3 procedure TForm1.AdvGlowButton1Click(Sender: TObject); begin ABSQuery4.Active:=false; ABSQuery4.SQL.Clear; ABSQuery4.SQL.Add('select .....bla,bla,bla....'); ABSQuery4.Open; if ABSQuery4.Field

我的表格1是主要表格。我使用它登录的目的和之后,我不需要它 我把它藏起来了。如果登录成功,单击按钮,将调用form3

procedure TForm1.AdvGlowButton1Click(Sender: TObject);
begin
ABSQuery4.Active:=false;
ABSQuery4.SQL.Clear;
ABSQuery4.SQL.Add('select .....bla,bla,bla....');
ABSQuery4.Open;
if ABSQuery4.FieldByName('passsword').AsString<>''
then  begin
Form3.Show;
Form1.Hide;
end else begin
cxTextedit1.Text := '';
showmessage('wrong password');
end;
end;
因为我需要Form3的应用程序图标,所以我有:

procedure TForm3.CreateParams(var Params: TCreateParams) ;
begin
  inherited;
  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
  Params.WndParent := 0;
end;
你能告诉我我是不是把事情搞砸了,还是有更好的办法
使窗体正常运行

有一种更好的方法可以做到这一点。首先,您应该为表单指定有意义的名称

您真正的问题是您的主窗体被隐藏,因为您将其用作登录窗体。这样做会使生活变得不必要的困难和复杂

因此,主要的建议是,您应该使真正的主窗体成为Delphi主窗体。Delphi主窗体是使用
Application.CreateForm
创建的第一个窗体。我建议您只调用一次
Application.CreateForm
,以创建主表单

这可能会让您想知道如何创建其他表单。就像其他对象一样,您只需使用标准构造函数创建它们

因此,您的.dpr文件代码可能如下所示:

Application.Initialize;
LoginForm := TLoginForm.Create(nil);
try
  if LoginForm.ShowModal <> mrOK then
    exit;
finally
  LoginForm.Free;
end;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
Application.Initialize;
LoginForm:=tloginfo.Create(无);
尝试
如果LoginForm.showmortal mrOK,则
出口
最后
免费登录信息;
结束;
Application.CreateForm(TMainForm,MainForm);
应用程序。运行;

一旦进行了此更改,您将发现不需要采取步骤将主窗体强制放到任务栏上

有一种更好的方法可以做到这一点。首先,您应该为表单指定有意义的名称

您真正的问题是您的主窗体被隐藏,因为您将其用作登录窗体。这样做会使生活变得不必要的困难和复杂

因此,主要的建议是,您应该使真正的主窗体成为Delphi主窗体。Delphi主窗体是使用
Application.CreateForm
创建的第一个窗体。我建议您只调用一次
Application.CreateForm
,以创建主表单

这可能会让您想知道如何创建其他表单。就像其他对象一样,您只需使用标准构造函数创建它们

因此,您的.dpr文件代码可能如下所示:

Application.Initialize;
LoginForm := TLoginForm.Create(nil);
try
  if LoginForm.ShowModal <> mrOK then
    exit;
finally
  LoginForm.Free;
end;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
Application.Initialize;
LoginForm:=tloginfo.Create(无);
尝试
如果LoginForm.showmortal mrOK,则
出口
最后
免费登录信息;
结束;
Application.CreateForm(TMainForm,MainForm);
应用程序。运行;

一旦进行了此更改,您将发现不需要采取步骤将主窗体强制放到任务栏上

有一种更好的方法可以做到这一点。首先,您应该为表单指定有意义的名称

您真正的问题是您的主窗体被隐藏,因为您将其用作登录窗体。这样做会使生活变得不必要的困难和复杂

因此,主要的建议是,您应该使真正的主窗体成为Delphi主窗体。Delphi主窗体是使用
Application.CreateForm
创建的第一个窗体。我建议您只调用一次
Application.CreateForm
,以创建主表单

这可能会让您想知道如何创建其他表单。就像其他对象一样,您只需使用标准构造函数创建它们

因此,您的.dpr文件代码可能如下所示:

Application.Initialize;
LoginForm := TLoginForm.Create(nil);
try
  if LoginForm.ShowModal <> mrOK then
    exit;
finally
  LoginForm.Free;
end;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
Application.Initialize;
LoginForm:=tloginfo.Create(无);
尝试
如果LoginForm.showmortal mrOK,则
出口
最后
免费登录信息;
结束;
Application.CreateForm(TMainForm,MainForm);
应用程序。运行;

一旦进行了此更改,您将发现不需要采取步骤将主窗体强制放到任务栏上

有一种更好的方法可以做到这一点。首先,您应该为表单指定有意义的名称

您真正的问题是您的主窗体被隐藏,因为您将其用作登录窗体。这样做会使生活变得不必要的困难和复杂

因此,主要的建议是,您应该使真正的主窗体成为Delphi主窗体。Delphi主窗体是使用
Application.CreateForm
创建的第一个窗体。我建议您只调用一次
Application.CreateForm
,以创建主表单

这可能会让您想知道如何创建其他表单。就像其他对象一样,您只需使用标准构造函数创建它们

因此,您的.dpr文件代码可能如下所示:

Application.Initialize;
LoginForm := TLoginForm.Create(nil);
try
  if LoginForm.ShowModal <> mrOK then
    exit;
finally
  LoginForm.Free;
end;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
Application.Initialize;
LoginForm:=tloginfo.Create(无);
尝试
如果LoginForm.showmortal mrOK,则
出口
最后
免费登录信息;
结束;
Application.CreateForm(TMainForm,MainForm);
应用程序。运行;


一旦进行了此更改,您将发现不需要采取步骤将主窗体强制放到任务栏上

旁白:创建一个无主窗体和添加WS_EX_APPWINDOW都没有意义。做一个就足够了。所以我应该删除:Params.ExStyle:=Params.ExStyle或WS_EX_APPWINDOW??如果你按照我答案中的建议去做,你根本就不需要它。我需要重写所有内容,但首先我会尝试使用两个表单来看看它是如何工作的。问题是我也需要从主表单中调出这个登录表单。。。这是一个登录/注销系统,没问题。您可以随时创建和显示表单。旁白:创建一个无主表单和添加WS_EX_APPWINDOW都没有意义。做一个就足够了。所以我应该删除:Params.ExStyle:=Params.ExStyle或WS_EX_APPWINDOW??如果你按照我答案中的建议去做,你根本就不需要它。我需要重写所有内容,但首先我会尝试使用两个表单来看看它是如何工作的。问题是我也需要从主表单中调出这个登录表单。。。这是一个登录/注销系统,没问题。您可以随时创建和显示表单。旁白:创建一个无主表单和添加WS_EX_APPWINDOW都没有意义。做一个就足够了。所以我应该删除:Params.ExStyle:=Params.ExStyle或WS_EX_APPWI