6

我已经阅读了有关该问题的多篇文章,但似乎都没有对我的问题得出一个不错的结论。(也许我正在尝试查看最近是否出现了任何问题。)

我有一个处理承诺的小型慈善应用程序。为此,它需要处理和打印文档。

问题是,如果 Word 在后台打开,应用程序线程将挂起并且不会响应 Word 的关闭,我必须手动回滚并关闭 Word。当然,一切正常,但我无法保证最终用户会关闭 Word,即使我将说明放入用户手册中也是如此。

我对速度并不太在意,但我想如果可以增强它,那将是一个不错的小奖励。

是否为 Delphi 发布了任何允许我打开、编辑、打印和保存文档的库?如果没有,是否有办法使用 Word Automation,使其在打开时不会与 Word 的另一个打开句柄冲突?

4

3 回答 3

5

如果使用GetActiveOleObject,您将获得 Word 的运行实例。通过使用CreateOleObject,您将获得一个新实例,并且不应该被其他正在运行的实例所困扰。

如果您使用TWordApplication, 包装器,您可以设置ConnectKindckNewInstance完成此操作。默认情况下,TWordApplication 会尝试连接一个正在运行的实例。

于 2012-10-31T14:13:47.953 回答
1

如果您想打开编辑和打印 Word 文档,并且您不介意使用 RTF 格式来做您正在做的事情,请研究TRichView

它将生成 RTF 格式的丰富文档,这是 MS Word 支持的格式之一。我不认为它直接读取 .DOC 文件,但对于大多数简单文件,您可以将 .DOC 和 .DOCX 转换为 RTF,但某些高级格式化功能会在转换中丢失。

它的优点是无需在将要进行文档处理的机器上安装任何 MS Word 副本即可工作。对于收据和其他简单文件的制作,这将是最可靠的技术;根本不要直接使用 Word。

于 2012-11-01T12:59:15.533 回答
1
procedure PrintViaWord (const filename: string);
const
 wdUserTemplatesPath = 2;

var
  wrdApp, wrdDoc, wrdSel: variant;

begin
 wrdApp:= CreateOleObject ('Word.Application');   // create new instance
 sleep (5000);    // this fixes a bug in Word 2010 to do with opening templates
 wrdDoc:= wrdApp.documents.add (
          wrdApp.Options.DefaultFilePath[wdUserTemplatesPath] + '\mytemplate.dot');

 wrdDoc.Select;
 wrdSel:= wrdApp.selection;
 wrdApp.Options.CheckSpellingAsYouType:= 0;
 wrdSel.paragraphformat.alignment:= 1;
 wrdSel.typetext ('This is a program demonstrating how to open Word in the background'
                  + ' and add some text, print it, save it and exit Word');
 wrdDoc.SaveAs (filename + '.doc');
 wrdApp.ActivePrinter:= 'Konica Minolta 211';
 wrdApp.PrintOut;
 WrdDoc.SaveAs (filename + '.doc');
 wrdApp.quit;

 wrdSel:= unassigned;
 wrdDoc:= unassigned;
 wrdApp:= unassigned
end;
于 2012-11-01T15:52:45.987 回答