保存对话框文件扩展名和[ofOverwritePromt]问题

9

已经有一个关于TSaveDialog和[ofOverwritePromt]的简单问题在Delphi overwrite existing file on save dialog上。

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

  • 我有一个TSaveDialog
  • 我在Options中设置了[ofOverwritePromt]
  • 我将过滤器设置为“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;

有没有更加优雅的方式来做到这一点,而不需要自定义标准对话框
1个回答

15

我猜测您没有设置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;

这也意味着您不需要检查扩展名并更改它!


非常感谢!我怎么会错过那个属性呢……也许是因为今天是放假前的最后一天 :D - Z.B.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接