在关闭登录表单时尝试显示的mainform

use*_*050 7 delphi

这是*.dpr:

program Project1;

uses
  Vcl.Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}
var
  MainForm: TForm1;

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Login;
  Application.Run;
end.
Run Code Online (Sandbox Code Playgroud)

登录表格 :

unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm2 = class(TForm)
    Button1: TButton;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

procedure Login;

implementation

{$R *.dfm}

Uses Unit1;


procedure Login;
begin
  with TForm2.Create(nil) do
  try
    Application.MainForm.Hide;
    if ShowModal = mrOK then
      Application.MainForm.Show
    else
      Application.Terminate;
  finally
    Free;
  end;
end;

end.
Run Code Online (Sandbox Code Playgroud)

主要表格:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

Uses Unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
Login;
end;

end.
Run Code Online (Sandbox Code Playgroud)

两个按钮都设置为模态:mrOK.登录表单不是自动创建的,而是在可用表单列表中.

问题是:如果您关闭登录表单(不单击按钮)一瞬间主表单显示然后关闭(当然,应用程序也关闭).它发生得非常快.看起来像一个闪烁.

当我关闭登录表单时,如何宣布我的主表单尝试显示自己?

另外,设置:

Application.MainFormOnTaskbar := False;
Run Code Online (Sandbox Code Playgroud)

无济于事......

Dal*_*kar 5

您不应在显示登录之前隐藏主窗体,而应使用初始化应用程序以隐藏主窗体开始.要做到这一点,只需Application.ShowMainForm := false在创建主窗体之前添加.

Application.Run关闭登录表单后执行的操作将根据Application.ShowMainForm默认为true 的变量值显示或不显示主表单.因此,这将引入闪烁,因为主要表单将在应用程序终止之前显示.

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.ShowMainForm := false;
  Application.CreateForm(TForm1, Form1);
  Login;
  Application.Run;
end.
Run Code Online (Sandbox Code Playgroud)

  • 一般来说,这种方法设计不好.如果您不希望用户看到"MainForm",那么就不要在第一时间创建它.如果`Login`失败,你可以立即退出应用程序,甚至不要调用`Application.Run`.如果`Login`需要使用来自`MainForm`的代码,则该代码应该在`Login`本身,或者至少移动到`MainForm`之外的另一个类/单元.`Login`和`MainForm`不应该彼此了解. (4认同)