Расширение файла TSaveDialog и проблема [ofOverwritePromt]
Уже есть простой вопрос об идее TSaveDialog и [ofOverwritePromt] в Delphi перезаписать существующий файл в диалоговом окне сохранения.
Итак, моя проблема / сценарий выглядит следующим образом:
- у меня есть
TSaveDialog
- Я установил
[ofOverwritePromt]
вOptions
- Я установил фильтр на "PDF (*.pdf)|*.pdf"
- Индекс фильтра установлен в 1
Итак, теперь я запускаю программу и вызываю диалог. Если файл, который я выбрал WITH MOUSE или KEYBOARD (без ввода), существует, тогда диалог сохранения просит меня переписать сообщение:
Но если я выполняю те же действия, но набираю имя файла, например "Тест", не указывая расширение, диалог сохранения не подтверждает перезапись. Я знаю, что на самом деле он возвращает другое имя файла "C:\Users\xxx\Desktop\Test" вместо "C:\Users\xxx\Desktop\Test.pdf". Это не очень приятно, если диалоговое окно просит вас сохранить файл, но вам нужно ввести расширение. Поэтому обычно я обращаюсь с этим так:
repeat
{ Ask for the file if not silent }
if not dlgSave.Execute then
Exit;
{ Read the filename from the save dialog }
LTempFile := dlgSave.FileName;
if not SameText(ExtractFileExt(LTempFile), '.pdf') then
begin
{ Add the extension }
LTempFile := LTempFile + '.pdf';
{ As we bypassed the overwrite check in dialog do it now }
if FileExists(LTempFile) then
if MsgWarn(Format('%s already exists. Replace?', [ExtractFileName(LTempFile)]), mbOKCancel) <> mrOk then
Continue;
end;
Break;
until False;
Есть ли способ сделать это более элегантно, не настраивая стандартный диалог?
1 ответ
Я думаю, что вы не установите DefaultExt
Вот почему вы получаете пустое расширение. Используйте это свойство, и у вас не возникнет проблемы. Если вы используете несколько фильтров, используйте OnFilterChange
событие. Вот один из способов сделать это:
procedure TFormMain.SigSaveDialogMainTypeChange(Sender: TObject);
begin
case (Sender as TSaveDialog).FilterIndex of
0: (Sender as TSaveDialog).DefaultExt := 'pdf';
1: (Sender as TSaveDialog).DefaultExt := 'txt';
end;
end;
Это также означает, что вам не нужно проверять расширение и менять его!