创建新表单“主表单” - 如何?

问题描述 投票:0回答:1

我有一个包含两种表单的程序 - 一个“登录”表单和主申请表。

现在,首先显示登录表单(毕竟,如果不登录,程序不应该继续到第二个表单)。一旦登录凭据被接受,我就会在第二个表单上执行 ShowModal,然后 - 当第二个表单关闭时 - 退出程序。

这一切都很好,但是 - 如果用户最小化第二个表单,它不会转到任务栏,而是最小化到屏幕底部任务栏上方的一个小标题栏。

如何让 Windows 了解第二个窗体是“主”窗体,并且它应该像主窗体一样运行,并最小化到任务栏?

delphi delphi-12-athens
1个回答
0
投票

我建议采用一种不同的方法,将所有必要的代码封装在登录表单单元中,并保留 dpr 不变。

假设登录表单名为

TLoginForm

  1. 不要自动创建

    TLoginForm
    ,但将其保留在 dpr 使用子句中。

  2. 仅在登录成功时才使

    TLoginForm
    mrOK
    中返回
    ModalResult

  3. 将名为

    Execute
    的类方法添加到
    TLoginForm
    ,内容如下:

    class procedure TLoginForm.Execute;
    begin
      var instance := Self.Create(nil);
      try
        if instance.ShowModal <> mrOk then 
        begin
          Application.ShowMainForm := False;
          Application.Terminate;
        end;
      finally
        instance.Free;
      end;
    end;
    
  4. 将以下代码添加到登录表单单元的末尾:

    var
      SaveInitProc: Pointer = nil;
    
    procedure InitApplication;
    begin
      if SaveInitProc <> nil then TProcedure(SaveInitProc);
      TLoginForm.Execute;
    end;
    
    initialization
      SaveInitProc := InitProc;
      InitProc := @InitApplication;
    end.
    

这将在 dpr 的

Application.Initialize
调用中调用登录表单。如果登录失败,
Application.ShowMainForm := False
将禁止显示主窗体,
Application.Terminate
将在
Application.Run
中结束循环。

这种方式的优点主要在于它独立于主窗体,并且不会干扰 IDE 维护 dpr 文件。

© www.soinside.com 2019 - 2024. All rights reserved.