gpt4 book ai didi

delphi - 任务栏上显示多个实例的 SDI 应用程序

转载 作者:行者123 更新时间:2023-12-02 03:59:23 25 4
gpt4 key购买 nike

我使用 Delphi Berlin VCL 模板创建了一个 SDI 应用程序。我可以通过对 File|New 进行编程来创建其他实例,如下所示:

procedure TSDIAppForm.FileNew1Execute(Sender: TObject);
var
LNewDoc: TSDIAppForm;
begin
LNewDoc := TSDIAppForm.Create(Application);
LNewDoc.Show;
end;

任务栏上仅显示所有者表单。此外,关闭所有者表单也会关闭所有实例。如何取消链接其他实例,以便它们独立运行并单独显示在任务栏上?

最佳答案

关闭作为 Application.MainForm 分配的 TForm 会退出应用程序,这是设计使然。

如果您希望 MainForm 像任何其他 SDI 窗口一样运行,并且在其他 SDI 窗口仍然打开的情况下独立关闭而不退出应用程序,则必须创建一个单独的 TForm 充当真正的 MainForm ,然后对用户隐藏它(在 Application.Run() 启动时将 Application.ShowMainForm 设置为 false code> 被调用),然后您可以根据需要创建 TSDIAppForm 对象。当最后一个TSDIAppForm对象关闭时,您可以关闭MainForm,或直接调用Application.Terminate()来退出应用程序。

要为每个 TSDIAppForm 提供自己的任务栏按钮,您需要重写虚拟 CreateParams() 方法:

How can I get taskbar buttons for forms that aren't the main form?

试试这个:

begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TMyRealMainForm, MyRealMainForm);
Application.CreateForm(TSDIAppForm, SDIAppForm);
SDIAppForm.Visible := True;
Application.ShowMainForm := False;
Application.Run;
end.

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

procedure TSDIAppForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;

procedure TSDIAppForm.FormDestroy(Sender: TObject);
begin
if Screen.FormCount = 2 then // only this Form and the MainForm
Application.Terminate;
end;

procedure TSDIAppForm.FileNew1Execute(Sender: TObject);
var
LNewDoc: TSDIAppForm;
begin
LNewDoc := TSDIAppForm.Create(Application);
LNewDoc.Show;
end;

关于delphi - 任务栏上显示多个实例的 SDI 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37887192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com