2016-08-18 9 views
8

Istnieje już proste pytanie dotyczące idei TSaveDialog i [ofOverwritePromt] pod adresem Delphi overwrite existing file on save dialog.Rozszerzenie pliku TSaveDialog i wydanie [ofOverwritePromt]

Więc mój problem/scenariusz jest następujący:

  • mam TSaveDialog
  • ustawić [ofOverwritePromt] w Options
  • ustawić filtr „PDF (* .pdf) | * .pdf "
  • indeks Filtr jest ustawiony na 1

Więc teraz uruchomić program i wywołać okno. Jeśli plik I wybierz z myszy lub klawiatury (bez wpisywania) istnieje wtedy zapisać okno pyta nadpisać z komunikatem:

save dialog

Ale jeśli robię te same czynności, ale wpisz nazwę pliku jak „test” bez określenie rozszerzenia okno dialogowe zapisu nie potwierdza nadpisania. Wiem, że faktycznie zwraca inną nazwę pliku "C: \ Users \ xxx \ Desktop \ Test" zamiast "C: \ Users \ xxx \ Desktop \ Test.pdf". To niby nie miłe, jeśli okno prosi o zapisanie pliku, ale trzeba wpisywać rozszerzenia .. Więc zazwyczaj obsłużyć to tak:

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; 

Czy istnieje sposób, aby to zrobić bardziej elegancki bez dostosowywania standardowego okna dialogowego?

Odpowiedz

13

Domyślam się, że nie ustawiono DefaultExt, dlatego otrzymasz puste rozszerzenie zwrócone. Użyj tej właściwości i nie dostaniesz problemu. Jeśli używasz wielu filtrów, użyj zdarzenia OnFilterChange. Oto jeden sposób, aby to zrobić:

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; 

Oznacza to również, że nie musisz sprawdzać rozszerzenia i go zmieniać!

+0

Dziękuję bardzo! Jak mógłbym tę nieruchomość spudłować ... może dlatego, że to ostatni dzień przed wakacjami: D –

+0

Nie ma za co. Jeśli jesteś szczęśliwy, zaznacz odpowiedź jako zaakceptowaną. – Dsm