2016-08-18 38 views
8

すでにTSaveDialogと[ofOverwritePromt]の考え方については、Delphi overwrite existing file on save dialogに簡単な質問があります。TSaveDialogファイルの拡張子と[ofOverwritePromt]の問題

だから私の問題/シナリオは以下の通りです:

  • を私は「PDF(* .PDF)にフィルタを設定私はOptions
  • [ofOverwritePromt]を設定TSaveDialog
  • 持って| * .PDFを「
  • フィルタ索引は、だから今、私はプログラムを実行し、ダイアログを呼び出す1

に設定されています。私は(入力しない)、マウスやキーボードを使用したSELECTファイルが存在する場合、ダイアログはメッセージで上書きするために私に尋ね保存:

save dialog

しかし、私は同じアクションを行いますが、せずに「試験」のようなファイル名を入力した場合保存ダイアログで拡張子を指定しても上書きは確認されません。 実際には、 "C:\ Users \ xxx \ Desktop \ Test.pdf"ではなく、 "C:\ Users \ xxx \ Desktop \ Test"という別のファイル名を返します。 だから通常、私はこのようにそれを扱う...ダイアログがファイルを保存するように要求されます場合は一種の素敵ではないですが、拡張子を入力する必要があります。

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イベントを使用してください。これを行う1つの方法は次のとおりです。

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

関連する問題