【问题标题】:Delphi - Using OLE causes error in WordDelphi - 使用 OLE 会导致 Word 中的错误
【发布时间】:2014-08-26 12:30:56
【问题描述】:

德尔福 XE6。我有一个文本 sn-ps 应用程序,它存储在本地数据库 (ABS DB) 中。一些 sn-ps 可能是纯文本,其他可能包含格式。如果 sn-ps 包含格式,则 sn-ps 是 MS Word 格式。

用户可以通过两种方式查看 sn-ps,在我的应用程序中,或者通过调用 MS-Word,并在其中自动加载 sn-p,- 这是相同的 SNIPPET ..

问题:如果将 sn-p 加载到我的应用程序中的 TOLEContainer 中,它会正常显示而没有问题...如果 sn-p 生成到 MSWord 中,我会收到错误...

“很抱歉。我们无法打开,因为我们发现其内容有问题。”我点击确定,然后得到“Word 在 中发现不可读的内容。您要恢复此文档的内容吗?...”我点击确定,一切正常。

我对“生成 MS WORD”的一般处理流程是......

           // FN is a temp file name          
          FileStream := TFileStream.Create(FN, fmCreate);
          BlobStream := dm_text.tEntries.CreateBlobStream(dm_text.tEntries.FieldByName('ANSWER_FMT'), bmRead);
          FileStream.CopyFrom(BlobStream, BlobStream.Size);
          BlobStream.Free;
          FileStream.Free;
          // Now open default association, which will be Word
          ShellExecute(Handle, 'open', PWideChar(FN), nil, nil, SW_SHOWNORMAL);

除了 TOleContainer 的一些命令之外,该流程几乎与就地查看相同。

    OleWord.Enabled := True;
    FileStream := TFileStream.Create(FN, fmCreate);
    BlobStream := tEntries.CreateBlobStream(tEntries.FieldByName('ANSWER_FMT'), bmRead);
    FileStream.CopyFrom(BlobStream, BlobStream.Size);
    BlobStream.Free;
    FileStream.Free;

    OleWord.LoadFromFile(FN);  
    OleWord.DoVerb(ovInPlaceActivate);

任何想法为什么会发生这种情况?这发生在多个版本的 MSWord 上。

附加信息: 两个例程都查看相同的数据,这些数据是从我的数据库中完全相同的行/列中提取的。我所做的是创建一个 TEMP 文件,然后通过 TOleContainer 加载它,它可以很好地加载它,或者通过 ShellExecute,它会给出一个错误。但是,如果我手动将 OLE 容器的 TEMP 文件加载到 MSWord 中,我会得到同样的错误。

所以-可能性... 1)。我的数据已损坏,即我如何保存它是错误的……但 Word 可以更正它。 2)。我有一个设置,以便 OLEContainer 不显示错误,但 Word 会显示。

【问题讨论】:

  • 我在问题中添加了其他信息......但是,通过 Ole Automation 加载它可能会“隐藏”错误。数据很好。 Word 只是出于某种原因在抱怨。
  • 如何发布二进制文件? (即 *.docx 文件)
  • 你用什么方法保存文件。 OleContainer.SaveToFile 或 OleContainer.SaveToDocument 还是别的什么?

标签: delphi ole


【解决方案1】:

这是因为在使用 OleContainer.SaveToFile 或 SaveAsDocument 时,您创建的不是 docx 文件,而是包含 docx 文件的 OleObject。当使用 OleContainer.SaveToFile 和 UseOldStreamFormat = True 时,甚至添加了一个 Delphi 特定的标头。 Word 幸运地检测到了这一点,并为您提供了恢复文件的选项。

如果您想要一个有效的 word 文档,请激活 OleContainer (OleContainer.DoVerb(ovPrimary),然后通过 Word 本身保存文档 (OleContainer.OleObject.SaveAs(MyFileName, wdFormatDocument, EmptyParam, EmptyParam, False)。 之后,您可以将生成的文件存储在数据库中。

【讨论】:

  • 这似乎可以做到......我确实必须改变我的加载方式,否则我会收到“无效的流错误”。新方法是.. OleWord.AutoActivate:=aaManual; OleWord.CreateObjectFromFile(FN,False);唯一奇怪的是,MsWord 在激活时似乎在后台闪烁。我可以防止吗?
  • 我在 CreateObjectFromFile 之后使用 Application.MainForm.BringToFront。这可以防止应用程序被停用。我没有其他东西可以防止闪烁。
猜你喜欢
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
  • 1970-01-01
相关资源
最近更新 更多