Расширение файла 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;

Это также означает, что вам не нужно проверять расширение и менять его!

Другие вопросы по тегам