【问题标题】:FMX: Modal forms not staying on top (Windows)FMX:模态表单不在顶部(Windows)
【发布时间】:2022-01-07 07:03:06
【问题描述】:

在某些情况下,应该是模态的表单或对话框没有停留在顶部。我正在使用 10.4 为 Windows 构建。这是一个涉及两个表单和一个 TSaveDialog 的简单示例。

复制问题:

  • 在 Windows 中运行应用程序
  • 单击“显示窗口”按钮(您应该会看到 Form2)
  • 单击“显示保存对话框”按钮(您应该会看到保存对话框)
  • 单击不属于应用程序的另一个窗口,例如资源管理器窗口
  • 单击表格 2。 Form1 现在将在前面

如果您重复此操作但首先最大化 Form1,那么用户在不从任务管理器关闭程序或使用一些专业的 windows 知识的情况下解决问题并不容易。

表格1:

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 480
  ClientWidth = 640
  Position = ScreenCenter
  FormFactor.Width = 320
  FormFactor.Height = 480
  FormFactor.Devices = [Desktop]
  DesignerMasterStyle = 0
  object Button1: TButton
    Position.X = 264.000000000000000000
    Position.Y = 168.000000000000000000
    Size.Width = 97.000000000000000000
    Size.Height = 33.000000000000000000
    Size.PlatformDefault = False
    Text = 'Show Window'
    OnClick = Button1Click
  end
end

表格2:

object Form2: TForm2
  Left = 0
  Top = 0
  Caption = 'Form2'
  ClientHeight = 333
  ClientWidth = 489
  Position = ScreenCenter
  FormFactor.Width = 320
  FormFactor.Height = 480
  FormFactor.Devices = [Desktop]
  DesignerMasterStyle = 0
  object Button1: TButton
    Position.X = 184.000000000000000000
    Position.Y = 136.000000000000000000
    Size.Width = 113.000000000000000000
    Size.Height = 41.000000000000000000
    Size.PlatformDefault = False
    Text = 'Show Save Dialog'
    OnClick = Button1Click
  end
  object SaveDialog1: TSaveDialog
    Left = 80
    Top = 40
  end
end

单元1:

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, Unit2,
  FMX.Controls.Presentation, FMX.StdCtrls;

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

var
  Form1: TForm1;

implementation

{$R *.fmx}

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

end.

单元2:

unit Unit2;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls;

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

var
  Form2: TForm2;

implementation

{$R *.fmx}

procedure TForm2.Button1Click(Sender: TObject);
begin
  SaveDialog1.Execute;
end;

end.

我没有在 VCL 应用程序中看到这种行为(模式窗口始终位于顶部)。我还在 FMX 应用程序中看到了使用 ShowModal 显示的表单甚至使用 ShowMessage 创建的消息窗口的问题。使用 TDialogServiceSync.ShowMessage 似乎有助于防止这种情况发生,但即便如此,一些用户也会遇到同样的问题。

为什么会发生这种情况,我可以做些什么来解决它?

【问题讨论】:

    标签: delphi firemonkey delphi-10.4-sydney


    【解决方案1】:

    尝试设置父级。

    喜欢:

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Form2.parent := form1;
      Form2.Show;
    end;
    

    我得到了很好的结果,但在 OSX 中它不起作用。

    【讨论】:

    • 谢谢。这至少对我的示例有帮助。
    【解决方案2】:

    您可以将Form2FormStyle 设置为StayOnTop

    FormStyle 是 TFormStyle 中定义的 Normal、Popup 或 StayOnTop 值之一。

    正常:通常的形式。这种形式可以有活动状态并支持z-order。

    Popup:这种形式不能被激活。此类型的所有表单都属于 PopupForms 列表。

    StayOnTop:此表单保留在桌面和应用程序中其他表单的顶部,但也将 FormStyle 设置为 StayOnTop 的任何其他表单除外。如果一个 StayOnTop 表单启动另一个表单,则这两个表单都不会始终保持在最前面。

    https://docwiki.embarcadero.com/Libraries/Sydney/en/FMX.Types.TFormStyle

    【讨论】:

    • 我同意 Bas van der Linden。显示表单 Modaly 并不意味着它将保持在顶部。您需要先将FormStyle 设置为StayOnTop。现在,由于对话框也只是模态表单,因此对话框表单不必停留在另一个模态表单之上。在 VCL 中,您可以将附加参数传递给对话框,告诉它哪个是其父窗体,因此它始终位于其上方。但不幸的是,FMX 中没有这样的选项
    • 这就是问题所在。 TSaveDialog 没有 FormStyle 属性。
    • 这个答案的问题是我可能不希望 Form2 始终保持领先。我可能希望显示两种形式并在两者之间切换。但是当显示保存对话框时,我希望它始终保持在最前面。不幸的是,TSaveDialog 没有 FormStyle 属性。不过,爱德华兹的回答解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多