我已经阅读了关于这个问题的多个帖子,似乎没有一个人对我的问题得出了正确的结论。 (也许我正试图看看最近是否出现过任何问题。)
我有一个处理承诺的小型慈善机构应用程序。在这样做时,它需要使用和打印文档。
事情是,如果Word在后台打开,应用程序线程将挂起并且不会响应Word的关闭,我必须手动回滚并关闭单词。当然,一切正常,但我无法保证最终用户将关闭Word,即使我将指令放在用户手册中。
我对速度并不太感兴趣,但我想如果它可以增强,那将是一个不错的小奖励。
是否已为Delphi发布了允许我打开,编辑,打印和保存文档的库?如果没有,有没有办法以这样的方式使用Word Automation,它在打开时不会与Word的另一个打开句柄冲突?
答案 0 :(得分:5)
如果您使用GetActiveOleObject
,您将获得正在运行的Word实例。
通过使用CreateOleObject
,您将获得一个新实例,不应该被其他正在运行的实例所困扰。
如果您使用TWordApplication
包装器,则可以将ConnectKind
设置为ckNewInstance
来完成此操作。默认情况下,TWordApplication将尝试连接正在运行的实例。
答案 1 :(得分: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;
答案 2 :(得分:0)
如果您想打开编辑和打印Word文档,并且不介意使用RTF格式进行操作,请调查TRichView。
它将生成RTF格式的丰富文档,这是MS word支持的格式之一。我不认为它直接读取.DOC文件,但您可以将.DOC和.DOCX转换为RTF,对于大多数简单文件,但转换中会丢失某些高级格式化功能。
它的优点是无需任何MS Word副本就可以在要进行文档处理的机器上安装。对于收据和其他简单文件的制作,这将是最可靠的技术;根本不要直接使用Word。