FMX:模态形式没有停留在顶部(Windows)



在一些情况下,本应是模态的窗体或对话框没有处于顶部。我正在使用10.4为Windows构建。下面是一个涉及两个表单和一个TSaveDialog的简单示例。

复制问题:

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

如果您重复此操作,但首先最大化Form1,那么如果不从任务管理器关闭程序或使用一些专家窗口知识,用户就不容易解决问题。

表格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

第一单元:

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.

第二单元:

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似乎有助于防止这种情况,但即使这样,一些用户也会遇到同样的问题。

为什么会发生这种情况?我能做些什么来解决吗?

尝试设置父级。

类似:

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

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

您可以将Form2FormStyle设置为StayOnTop

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

普通:普通形式。这种形式可以具有活动状态并支持z顺序。

弹出:这样的窗体不能处于活动状态。此类型的所有表单都属于PopupForms列表。

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

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

相关内容

  • 没有找到相关文章

最新更新