繁体   English   中英

TSaveDialog文件扩展名和[ofOverwritePromt]问题

[英]TSaveDialog file extension and [ofOverwritePromt] issue

关于TSaveDialog和Delphi的 [ofOverwritePromt]的概念已经存在一个简单的问题,它会在保存对话框中覆盖现有文件

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

  • 我有一个TSaveDialog
  • 我在Options设置了[ofOverwritePromt]
  • 我将过滤器设置为“PDF(* .pdf)| * .pdf”
  • 过滤器索引设置为1

所以现在我执行程序并调用对话框。 如果我选择WITH MOUSE或KEYBOARD(没有输入)的文件存在,则保存对话框要求我用消息覆盖:

保存对话框

但是,如果我执行相同的操作但输入文件名如'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;

有没有办法在没有自定义标准对话框的情况下更优雅?

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

这也意味着您无需检查扩展并进行更改!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM