Delphi - 使用OLE会导致Word中的错误

时间:2014-08-26 12:30:57

标签: delphi ole

Delphi XE6。我有一个文本片段的应用程序,它存储在本地数据库(ABS DB)中。某些代码段可能是直接文本,其他代码段可能包含格式。如果代码段包含格式,则代码段为MS Word格式。

用户可以通过两种方式查看代码段,在我的应用内部,或通过调用MS-Word,并自动将代码段加载到那里, - 它是相同的SNIPPET ..

问题:如果代码段被加载到我的应用程序中的TOLEContainer中,它显示正常没有问题...如果代码段被生成关闭到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的一些命令之外,此流程几乎与In in viewing相同。

    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会这样做。

1 个答案:

答案 0 :(得分:3)

这是因为在使用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)。 之后,您可以将生成的文件存储在数据库中。