TFileSaveDialog — fdoCreatePrompt не показывает подсказку?

я положилTFileSaveDialogв форме в C++ Builder и установите параметрыfdoOverWritePrompt,fdoStrictFileTypes,fdoPathMustExist, иfdoCreatePrompt.

Когда открывается диалоговое окно и я выбираю существующий файл, он спрашивает, хочу ли я перезаписать его, как следует. Однако, если я введу случайное имя, которого не существует, и нажму « Сохранить », диалоговое окно просто закроется — приглашения на подтверждение, если его можно создать, не будет.

Есть идеи, почему это происходит?

1 ответ

OFN_CREATEPROMPT, соответствующий

учитывается только для диалогового окна «Открыть» и никогда для диалогового окна «Сохранить». Попробуйте то же самое сTFileOpenDialogи вы получите эту подсказку.

Доказательство для других типов диалогов:

      var
  sd: TSaveDialog;
  od: TOpenDialog;
begin
  sd:= TSaveDialog.Create( self );
  sd.Options:= [ofCreatePrompt];  // Has no effect: no typed-in filename triggers this
  sd.Execute();
  sd.Free;

  od:= TOpenDialog.Create( self );
  od.Options:= [ofCreatePrompt];  // When trying to OPEN a not yet existing file
  od.Execute();
  od.Free;

Почему? Логично, что при сохранении файла в большинстве случаев вы все равно хотите создать новый файл (выбрать несуществующее имя файла) - зачем подтверждать это еще раз, когда у вас уже есть кнопка «Сохранить » ? Сохранение файла подразумевает, что файл создан. Подтверждение перезаписи/изменения существующего файла встречается реже.

Если вы все еще хотите такого поведения, вам придется сделать это самостоятельно: используйтеOnCanCloseсобытие, а затем проверьте выбранное/введенное имя файла:

      procedure TForm1.SaveDialog1CanClose(Sender: TObject; var CanClose: Boolean);
begin
  if not FileExists( SaveDialog1.FileName ) then begin
    // Reject closing the window for every choice but "Yes"
    CanClose:= MessageBox( SaveDialog1.Handle, 'Create it?', 'Does not exist yet', MB_YESNO )= IDYES;
  end;
end;
Другие вопросы по тегам