8
  1. 创建一个新的 VCL Forms 应用程序
  2. 在主窗体上添加一个 Tbutton 和一个 TSaveDialog

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

  4. 利用:

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

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

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

(使用 TFileSaveDialog 将给出相同的结果)

如果我使用 Delphi XE8 编译和运行应用程序,它会没问题,因为即使选择了另一种样式,保存对话框窗口似乎也使用默认的窗口样式。

编辑:我有 Windows 10 专业版。使用 Delphi 10.1 Berlin 编译为 win32 的源代码。替换消息框部分隐藏。只显示了一个小的左上部分,见图。

替换消息框部分隐藏。 只显示了一个小的左上部分。

这里是用 XE8 win32 编译的:

在此处输入图像描述

附言。我使用默认的 100% 比例因子。

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

在此处输入图像描述

所以,编译到 win32 对我不起作用,但 64 位会。有什么线索吗?

编辑:在 win32 中尝试使用“GetSaveFileName(OFN)”对我也不起作用(win 64 可以):

在此处输入图像描述

4

4 回答 4

4

您可以使用项目的对话框样式代码来避免此问题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;

在此处输入图像描述

于 2016-07-23T06:49:19.867 回答
2

我无法确认问题,这里看起来一切正常(32 位可执行文件,以 Amakrits 为主题,在 Windows 7 上使用 10.1 Berlin 编译,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 为主题的新的类似 Explorer 的保存对话框,它工作正常(对我来说)。只有对话框左上方的两个圆形蓝色“后退”和“前进”(<-->)按钮看起来有点奇怪。

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

更新

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

于 2016-07-20T17:26:43.933 回答
1

如果我在项目/选项/应用程序中将“启用高 DPI”设置为 true,它将起作用(替换框正确显示)。禁用它会导致问题(在 win32 和 win64 中)。

于 2016-07-22T06:58:35.610 回答
1

作为记录,我遇到了完全相同的问题(Delphi 10.1 Berlin,在 Windows 10 64 位上编译,100% 屏幕设置,为 32 位目标编译)。启用或禁用高 DPMI 意识没有帮助。

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

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

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

于 2018-07-10T16:54:21.350 回答