Delphi _Document.SaveAs提示意外

Delphi _Document.SaveAs提示意外,delphi,com,ms-word,delphi-xe7,delphi-2006,Delphi,Com,Ms Word,Delphi Xe7,Delphi 2006,尝试使用下面的示例代码保存文档时,应将文档保存在给定位置。如果文件已经存在,它将抛出异常。到现在为止,一直都还不错。但在极少数情况下,.SaveAs方法会阻塞,它将打开MS Word另存为对话框(如果Word可见,否则必须使用任务管理器激活) 这种情况仅在装有Windows 10和Office 2016的1台PC上发生 问题在于,我不知道什么时候会出现一个对话框,文档中并没有提到它() 使用SaveAs提示对话框的条件是什么?在我的情况下,我永远不想看到这个对话框。尝试了后期和早期绑定,结果都一

尝试使用下面的示例代码保存文档时,应将文档保存在给定位置。如果文件已经存在,它将抛出异常。到现在为止,一直都还不错。但在极少数情况下,.SaveAs方法会阻塞,它将打开MS Word另存为对话框(如果Word可见,否则必须使用任务管理器激活)

这种情况仅在装有Windows 10和Office 2016的1台PC上发生

问题在于,我不知道什么时候会出现一个对话框,文档中并没有提到它()

使用SaveAs提示对话框的条件是什么?在我的情况下,我永远不想看到这个对话框。尝试了后期和早期绑定,结果都一样。这是一个可以通过代码解决的问题,还是Word中的某种设置

procedure Example(Sender: TObject);
var
  lWord : TWordApplication;
  lDoc : TWordDocument;
begin
  try
    lWord := TWordApplication.Create(Self);
    lWord.ConnectKind := ckNewInstance;
    lWord.Disconnect;
    lWord.Connect;
    lWord.Visible := True;
    lDoc := TWordDocument.Create(lWord);
    lDoc.SaveAs('C:\Temp\test.doc');
  except
  on e: exception 
  do
    begin
    //reResults.Lines.Add(e.Message);
    //reResults.Lines.Add(e.StackTrace);
    end;
  end;

  try
    lWord.Quit;
  finally
  end; 
end;

我不熟悉Delphi——我的专长是Word的对象模型。但是我注意到,您对Word.Application和Word.Document对象都使用了“Create”方法。假设这映射到VB world的“New”关键字,那么您的问题可能来自以这种方式实例化文档,而不是通过WordApplication.Documents.Add(同样,在VB语言中)来实例化文档。虽然Word将编译“新文档”,但它无法正确处理此类对象。应始终使用Documents.Add方法创建/实例化文档。另一个问题可能是您在SaveAs方法中分配的文件名。Word 2007和更高版本本机创建Office Open XML文档(*.docx)。*.doc扩展名属于旧的二进制文件格式的文档。Word 2007及更高版本要求文件类型具有正确的扩展名。如果两者不匹配,则可能触发“另存为”对话框。如果您想要旧的文件类型,那么还需要为方法提供FORMAT参数(Word.WdSaveFormat enum)。在使用Documents.Add的情况下,问题也存在,因此我认为这不是问题的根源。为了保存,我在示例中使用no参数,用于实际场景EmptyParam。我假设两者都将被断言为默认值(我猜wdFormatDocument找不到定义)。另一种情况——保存行为相同——打开一个文档并尝试将其保存到不同的位置。两者都测试docx,结果相同。我将尝试添加适当的格式枚举值,以确定它是否会影响。Word POV中的默认文档格式可能因机器而异(这是UI中的一个选项)。就Word而言,默认的文件格式不是旧的二进制文件*.doc,而是Office Open XML docx。因此,最好设置文件格式,特别是当它不是本机docx时。提示对话框一直显示。