2016-08-18 102 views
8

有一个关于TSaveDialog和[ofOverwritePromt]的想法在Delphi overwrite existing file on save dialog的简单问题。TSaveDialog文件扩展名和[ofOverwritePromt]问题

所以我的问题/场景如下:

  • 我有一个TSaveDialog
  • 我设置[ofOverwritePromt]Options
  • 我设置了过滤器“PDF(* .PDF)| * .PDF “
  • 筛选指标被设定为1

所以现在我执行程序并调用对话框。如果我的鼠标或键盘选择(而无需键入)该文件存在,那么保存对话框,询问我的消息覆盖:

save dialog

但是,如果我做同样的动作,但输入类似“测试”的文件名,而不指定保存对话框没有确认覆盖的扩展名。 我知道实际上它会返回另一个文件名“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