Свойство "ofOverwritePrompt" для TSaveDialog не работает при использовании стилей VCL в Delphi 10.1 Berlin

  1. создать новое приложение VCL Forms
  2. на основной форме добавьте Tbutton и TSaveDialog

  3. установите" ofOverwritePrompt " в True в свойствах для SaveDialog1

  4. использование:

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      SaveDialog1.Execute();
    end;
    
  5. выполнить приложение. Нажмите кнопку, чтобы запустить диалог сохранения. Попробуйте сохранить в файл, который уже существует. Если вы хотите заменить файл, появится окно сообщения. нажать Cancel. Пока все в порядке. Закройте приложение.

  6. перейдите к Project / Options / Application / Appearance и выберите пользовательский стиль (например, Amakrits). Установите amakrits в качестве стиля по умолчанию.

  7. запустить приложение, как в #5 выше. Будет показан только небольшой фрагмент окна сообщения. Вам нужно будет нажать Enter, чтобы продолжить.

(использование TFileSaveDialog даст тот же результат)

если я компилирую и запускаю приложение с помощью Delphi XE8, все будет в порядке с момента сохранения диалоговое окно, похоже, использует стиль windows по умолчанию, даже если выбран другой стиль.

изменить: У меня есть Windows 10 pro. Источник скомпилирован как win32 с Delphi 10.1 Berlin. Поле заменить сообщение частично скрыто. Показана только небольшая верхняя левая часть, см. рисунок.

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-бит будет. Есть зацепки?

Edit: попытка с "GetSaveFileName (OFN)" также не будет работать для меня в win32 (win 64 в порядке):

enter image description here

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


Я не могу подтвердить проблему, и все выглядит хорошо здесь (32 бит executalbe, тематический с Amakrits, скомпилированный с 10.1 Berlin, на 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-тематический, новый проводник, как диалог сохранения, который отлично работает (для меня). Только два круглых, синих "назад" и "вперед" (<- и ->) кнопки в левом верхнем углу диалога выглядят немного странно.

но я не пробовал это с пользовательского масштабирования настройки (например, средний 125% В Панели управления - > панель дисплея и т. д.). Я думаю, это может повлиять на такие вещи.

обновление

Я просто пытался использовать SaveDialog1 (комментируя код OFN выше) с пользовательским масштабированием дисплея (125%). Все выглядело нормально, так что дело не в этом. Также, когда я использую код OFN, все выглядит нормально (на самом деле, лучше, т. е. нет диалога стиля XP, Но вместо этого настоящий диалог проводника).


Если я установил" Enable High-DPI " в true в Project/Options / Application, он будет работать (правильно отображаемое поле замены). Отключение его вызовет проблему (как в win32, так и в win64).


для записи у меня была точно такая же проблема (Delphi 10.1 Berlin, компиляция на Windows 10 64 бит, 100% настройки экрана, скомпилированные для 32-битной цели). Включение или отключение высокой осведомленности DPMI не помогло.

обходным путем является отключение стилей для диалоговых окон Перед выполнением TSaveDialog (или TOpenDialog) следующим образом:

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

сам диалог файла по-прежнему будет тематическим. Вы получите стандартные окна сообщений в стиле Windows в случае запроса на перезапись (или create prompt) всплывает, но они будут достаточно большими для пользователя, чтобы прочитать и щелкнуть их. После завершения диалога файлов можно снова включить диалоги стилей, при необходимости повторно добавив shDialogs в SystemHooks.