我在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并启动我的应用程序就可以了。
答案 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