TWordApplication和Word碰撞

时间:2011-04-13 12:44:15

标签: delphi

我在Delphi中使用TWordApplication。我的应用程序打开新的单词实例并在其文档上创建一些内容。问题是我第一次运行我的应用程序,然后打开真正的单词exe。 Word exe没有打开新的单词实例,但它链接到我的应用程序实例。因此,当我的应用程序写入其文档时,所有文本都显示在用户可见的exe文字上。

WordApp := TWordApplication.Create(nil);
WordApp.ConnectKind := ckNewInstance;
(WordApp.Documents.Add(EmptyParam,EmptyParam,EmptyParam, varFalse ));

然后用户手动打开Word。

WordApp.Selection.Text := 'test test test';

用户在手动打开的Word中看到“测试测试”。

如果我第一次手动打开Word并启动我的应用程序就可以了。

3 个答案:

答案 0 :(得分:4)

这是Word的默认行为,它使用正在运行的实例。您需要做的是存储对要修改的文档的引用。因此,请勿使用ActiveDocument,而是使用您存储的文档。因为无法保证ActiveDocument是您认为的文档。

//starting Word
var
  App: TWordApplication;
  Doc: WordDocument;
begin
  App := TWordApplication.Create(nil);
  Doc := App.Documents.AddOld(EmptyVar, EmptyVar); //open new document

<..somewhere else..>
  //modifying Word
  Doc.DoWhateverIWant;  // <--see? no ActiveDocument, so you are not 
                      //             modifying the users doc

答案 1 :(得分:2)

确保使用

WordApp.ConnectKind := ckNewInstance;

打开你的单词应用程序。要么在代码中(如上所述),要么在设计时设置属性。这可确保您始终运行Word的新实例,并且除非您明确地将其显示,否则它将保持隐藏状态。 任何打开Word的用户将始终获得不同的Word实例,并且不会看到您在文档上放置的内容(除非您保存了它并打开了保存的文档)。

来自doc:

  

设置ConnectKind以指示如何   ConnectKind组件建立一个   连接。 ConnectKind建立   应用程序时的连接   run(如果AutoConnect为True,则为true)或   当应用程序调用Connect时   (或ConnectTo)方法。

下表列出了可能的值:

//Value                Meaning  
//ckRunningOrNew       Attach to a running server or create a new instance of the server.   
//ckNewInstance        Always create a new instance of the server.   
//ckRunningInstance    Only attach to a running instance of the server.   
//ckRemote             Bind to a remote instance of the server. When using this option,
//                     you must supply a value for RemoteMachineName.   
//ckAttachToInterface  Don't bind to the server. Instead, the application supplies an
//                     interface using the ConnectTo method, which is introduced in
//                     descendant classes. This option can't be used with the AutoConnect
//                     property.   

<强>更新

实际上,打开Word可能已经打开了一个不同的实例(这就是我为D5 / Word97记住它的方式),但是目前Word确实重用了应用程序打开的实例。因此,为了避免“刮掉用户手动打开的单词文档”,您确实需要避免使用ActiveDocument按照The_Fox的答案。

答案 2 :(得分:1)

根据http://support.microsoft.com/kb/210565,有几个命令行开关会导致Word启动一个新实例。我用过Word2003的那个是/ x