2016-08-18 2 views
8

Существует простой вопрос об идее TSaveDialog и [ofOverwritePromt] на Delphi overwrite existing file on save dialog.Расширение файла TSaveDialog и [ofOverwritePromt] issue

Так что мой вопрос/сценарий выглядит следующим образом:

  • У меня есть TSaveDialog
  • Я поставил [ofOverwritePromt] в Options
  • Я установил фильтр «PDF (* .pdf) | * .pdf "
  • индекс фильтра устанавливается на 1

Так что теперь я выполняю программу и вызовите диалог. Если файл я выбираю с помощью мыши или клавиатуры (без ввода) существует, то диалог сохранения просит меня переписать с сообщением:

save dialog

Но если я те же действия, но введите имя файла как «Test» без указав расширение, диалог сохранения не подтверждает перезапись. Я знаю, что на самом деле он возвращает другое имя файла «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; 

Есть ли способ сделать это более изящным без настройки стандартного диалога?

ответ

13

Я предполагаю, что вы не устанавливаете 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; 

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

+0

спасибо! Как я мог пропустить эту собственность ... может быть, потому что это последний день перед отпуском: D –

+0

Добро пожаловать. Если вы счастливы, отметьте ответ как принятый. – Dsm