delphi 问题关闭最小化的形式从Windows任务栏与消息对话框

lstz6jyr  于 2023-05-12  发布在  Windows
关注(0)|答案(1)|浏览(212)

下面的演示应用程序在用户尝试关闭窗体时询问用户是否真的要关闭。
当表单没有最小化时,这工作正常。但是,如果他们试图在表单最小化时从任务栏关闭应用程序,则应用程序将被锁定,并且只能从任务管理器关闭。
模态警告消息似乎显示但不可见。因为他们不能关闭模态消息框,所以他们根本不能关闭它,即使在恢复窗口之后。
请注意,使用TApplication.MessageBox的具有类似代码的VCL应用程序不会出现问题。从任务栏单击X后,消息框立即出现,并且可以关闭应用程序。
还要注意的是,在 Delphi 10中制作的类似的FMX应用程序没有这个问题。
有没有人有任何解决方案的想法?
在显示消息框和调用Application.ProcessMessages之前,我尝试将窗体的WindowState强制设置为wsNormal,但没有任何改变。
我使用同步消息框是因为这是为了防止应用程序中未保存的工作丢失。我不希望用户在消息框中单击“是”之前能够关闭应用程序。
DFM:

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 347
  ClientWidth = 437
  FormFactor.Width = 320
  FormFactor.Height = 480
  FormFactor.Devices = [Desktop]
  OnClose = FormClose
  DesignerMasterStyle = 0
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;

type
  TForm1 = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

uses
  FMX.DialogService.Sync;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if TDialogServiceSync.MessageDialog(
           'Are you sure you want to close?', TMsgDlgType.mtWarning,
           [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo],
           TMsgDlgBtn.mbYes, 0) = mrNo then
    Action := TCloseAction.caNone;
end;

end.
o7jaxewo

o7jaxewo1#

这是 Delphi 11中的一个bug,目前正在调查中。然而,解决方法相当简单。在消息框前显示窗体。

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  Show; // Make sure the form isn't minimized

  if TDialogServiceSync.MessageDialog(
           'Are you sure you want to close?', TMsgDlgType.mtWarning,
           [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo],
           TMsgDlgBtn.mbYes, 0) = mrNo then
    CanClose := False;
end;

相关问题