我有一个包含两种表单的程序 - 一个“登录”表单和主申请表。
现在,首先显示登录表单(毕竟,如果不登录,程序不应该继续到第二个表单)。一旦登录凭据被接受,我就会在第二个表单上执行 ShowModal,然后 - 当第二个表单关闭时 - 退出程序。
这一切都很好,但是 - 如果用户最小化第二个表单,它不会转到任务栏,而是最小化到屏幕底部任务栏上方的一个小标题栏。
如何让 Windows 了解第二个窗体是“主”窗体,并且它应该像主窗体一样运行,并最小化到任务栏?
我建议采用一种不同的方法,将所有必要的代码封装在登录表单单元中,并保留 dpr 不变。
假设登录表单名为
TLoginForm
。
不要自动创建
TLoginForm
,但将其保留在 dpr 使用子句中。
仅在登录成功时才使
TLoginForm
在mrOK
中返回ModalResult
。
将名为
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;
将以下代码添加到登录表单单元的末尾:
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 文件。