TFileSaveDialog — fdoCreatePrompt не показывает подсказку?
я положилTFileSaveDialog
в форме в C++ Builder и установите параметрыfdoOverWritePrompt
,fdoStrictFileTypes
,fdoPathMustExist
, иfdoCreatePrompt
.
Когда открывается диалоговое окно и я выбираю существующий файл, он спрашивает, хочу ли я перезаписать его, как следует. Однако, если я введу случайное имя, которого не существует, и нажму « Сохранить », диалоговое окно просто закроется — приглашения на подтверждение, если его можно создать, не будет.
Есть идеи, почему это происходит?
1 ответ
OFN_CREATEPROMPT
, соответствующий
-
TFileSaveDialog
'sfdoCreatePrompt
или TSaveDialog
'sofCreatePrompt
)
учитывается только для диалогового окна «Открыть» и никогда для диалогового окна «Сохранить». Попробуйте то же самое с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;