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

时间:2014-05-28 07:16:21

标签: delphi delphi-xe4

我的form1是主要形式。我用它来登录,在我不需要之后 我隐藏了它。如果登录成功,则在按钮单击时,将调用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,但Form1也可见。用于显示主要表格 从form3我用:

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form1.Show;
end

由于我需要Form3的应用程序图标,我有:

procedure TForm3.CreateParams(var Params: TCreateParams) ;
begin
  inherited;
  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
  Params.WndParent := 0;
end;

你能告诉我,我搞乱了什么,还是有更好的方法 使表格行为正常?

1 个答案:

答案 0 :(得分:3)

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

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

所以主要的建议是你应该让你真正的主要形式是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;

进行此更改后,您会发现不需要采取措施强制将主表单强加到任务栏上。