首页 文章

在Delphi 10.1 Berlin中使用VCL样式时,TSaveDialog的属性“ofOverwritePrompt”不起作用

提问于
浏览
7
  • 创建一个新的VCL Forms应用程序

  • 在主窗体上添加Tbutton和TSaveDialog

  • 在SaveDialog1的属性中将“ofOverwritePrompt”设置为True

  • 使用:

procedure TForm1.Button1Click(Sender: TObject);
begin
  SaveDialog1.Execute();
end;
  • 运行应用程序 . 按按钮执行保存对话框 . 尝试保存到已存在的文件 . 如果要替换文件,则会出现一个消息框 . 按取消 . 到目前为止都很好 . 关闭应用程序 .

  • 转到项目/选项/应用程序/外观并选择自定义样式(例如Amakrits) . 将Amakrits设置为默认样式 .

  • 运行应用程序,如上面的#5 . 只会显示消息框的一小部分 . 您必须按Enter键才能继续 .

(使用TFileSaveDialog会得到相同的结果)

如果我使用Delphi XE8编译并运行应用程序就可以了,因为即使选择了另一种样式,保存对话框窗口似乎也使用默认的窗口样式 .

编辑:我有Windows 10专业版 . 使用Delphi 10.1 Berlin编译为win32的源代码 . 替换消息框部分隐藏 . 仅显示左上方的小部分,请参见图 .

The replace message box is partly hidden. Only a small top left part is shown.

这里用XE8 win32编译:

enter image description here

PS . 我使用默认的100%比例因子 .

使用win64(Delphi 10.1 Berlin)编译似乎没问题:

enter image description here

因此,编译为win32对我来说不起作用,但64位会 . 有线索吗?

编辑:尝试使用“GetSaveFileName(OFN)”也不适合我在win32(胜利64是好的):

enter image description here

4 回答

  • 1

    您可以使用VCL Styles Utils项目的对话框样式代码来避免此问题 .

    只需将这些单位添加到您的项目中 .

    uses
      Vcl.Styles.Utils.Menus, //Popup and Shell Menus (class #32768)
      Vcl.Styles.Utils.Forms, //dialogs box (class #32770)
      Vcl.Styles.Utils.StdCtrls, //buttons, static, and so on
      Vcl.Styles.Utils.ComCtrls, //SysTreeView32, SysListView32
      Vcl.Styles.Utils.ScreenTips, //tooltips_class32 class
      Vcl.Styles.Utils.SysControls,
      Vcl.Styles.Utils.SysStyleHook;
    
    {$R *.dfm}
    
    procedure TForm26.Button1Click(Sender: TObject);
    begin
      UseLatestCommonDialogs := false;
      SaveDialog1.Execute();
    end;
    

    enter image description here

  • 1

    我无法确认这个问题,所有这些看起来都很好,(32位执行,以Amakrits为主题,使用10.1柏林编译,在Windows 7上,100%缩放)但你可以试试这个:

    uses ... Winapi.CommDlg;
    
    ...
    
    var
      OFN: TOpenFileName;
    begin
      FillChar(OFN, SizeOf(OFN), 0);
      OFN.lStructSize := SizeOf(OFN);
      OFN.nMaxFile := MAX_PATH;
      OFN.Flags := OFN_OVERWRITEPROMPT or OFN_HIDEREADONLY or OFN_ENABLESIZING or OFN_EXPLORER;
      GetSaveFileName(OFN);
    end;
    

    结果是以Amakrits为主题的新的类似资源管理器的保存对话框,对我来说效果很好 . 只有对话框左上角的两个圆形蓝色"back"和"forth"( <--> )按钮看起来有点奇怪 .

    但我没有尝试使用自定义缩放设置(例如,控制面板中的中等125% - >显示面板等) . 我认为这可能会影响这些事情 .

    更新

    我只是尝试使用自定义显示缩放(125%)的 SaveDialog1 (用上面的OFN代码注释掉) . 一切都很好看,所以不是这样 . 此外,当我使用OFN代码时,一切看起来都很好(实际上,更好,即没有XP风格的对话框,而是一个真正的类似资源管理器的对话框) .

  • 4

    如果我在Project / Options / Application中将“Enable High-DPI”设置为true,它将起作用(替换正确显示的框) . 禁用它将导致问题(在win32和win64中) .

  • 2

    为了记录,我有完全相同的问题(Delphi 10.1柏林,在Windows 10 64位编译,100%屏幕设置,编译为32位目标) . 启用或禁用高DPMI感知没有帮助 .

    解决方法是在执行TSaveDialog(或TOpenDialog)之前禁用对话框的样式,如下所示:

    TStyleManager.SystemHooks := TStyleManager.SystemHooks - [shDialogs];
    

    文件对话框本身仍然是主题 . 如果弹出覆盖提示(或创建提示),您将获得标准的Windows样式消息框,但它们足够大,用户可以阅读并单击它们 . 文件对话框完成后,如果需要,可以通过将shDialogs重新添加到SystemHooks来再次启用样式化对话框 .

相关问题