属性" ofOverwritePrompt"在Delphi 10.1 Berlin

时间:2016-07-20 15:43:43

标签: delphi vcl-styles delphi-10.1-berlin

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

  3. Set" ofOverwritePrompt"在SaveDialog1的属性中为True

  4. 使用:

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

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

  7. 按上述#5运行应用程序。只会显示消息框的一小部分。您必须按Enter键才能继续。
  8. (使用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

    聚苯乙烯。我使用默认的100%比例因子。

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

    enter image description here

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

    编辑:尝试使用" GetSaveFileName(OFN)"在win32中也不适用于我(胜利64是好的):

    enter image description here

4 个答案:

答案 0 :(得分: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;

enter image description here

答案 1 :(得分:2)

我无法确认这个问题,所有这些看起来都很好,(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为主题的新的类似Explorer的保存对话框,对我来说很好。只有对话框左上角的两个圆形,蓝色“后退”和“前进”(<-->)按钮看起来有点奇怪。

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

更新

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

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

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