2011-04-13 2 views
3

델파이에서 TWordApplication을 사용하고 있습니다. 내 응용 프로그램은 새로운 단어의 인스턴스를 열고 문서에 무언가를 만듭니다. 문제는 내가 처음으로 내 응용 프로그램을 실행하고 다음에 실제 단어 exe를 열 때입니다. Word exe는 새 단어 인스턴스를 열지 못했지만 내 앱 인스턴스에 연결됩니다. 그래서 내 애플 리케이션이 문서에 쓸 때 모든 텍스트는 사용자가 볼 수있는 exe 단어에 나타난다.TWordApplication 및 Word 충돌

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

그런 다음 사용자가 수동으로 Word를 엽니 다.

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

수동으로 열린 Word에서 'test test test'를 볼 수 있습니다.

처음 Word를 수동으로 열고 내 응용 프로그램을 시작하면 모두 정상입니다.

답변

2

은 워드 응용 프로그램을 엽니 다

WordApp.ConnectKind := ckNewInstance; 

를 사용해야합니다. 코드에서 (위와 같이) 또는 디자인 타임에 속성을 설정하십시오. 이렇게하면 항상 Word의 새 인스턴스가 실행되고 명시 적으로 표시되지 않는 한 숨겨진 상태로 유지됩니다. Word를 여는 사용자는 항상 Word의 다른 인스턴스를 가져오고 저장 한 문서를 열지 않고 저장 한 문서를 볼 수 없습니다. 다큐먼트에서

다음 ConnectKind 구성 요소가 연결을 설정하는 방법

설정 ConnectKind을 나타냅니다. ConnectKind는 응용 프로그램이 실행 (AutoConnect가 True이면 true) 또는 (응용 프로그램이 연결 (또는 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. 

업데이트

사실을 말씀 (그건 내가 D5/Word97에 대한 기억하는 방법) 다른 인스턴스를 열 수도 열어, 하지만 Word는 실제로 응용 프로그램에서 연 인스턴스를 다시 사용합니다. 따라서 "사용자가 수동으로 열어 놓은 단어 문서 전체를 긁지 않으려면"The_Fox의 답변에 따라 ActiveDocument를 사용하지 않아야합니다.

+0

으로 설정했습니다. 하지만 요점은 아닙니다. Iam이 내 앱을 시작합니다. 새 인스턴스가 만들어집니다. Word.exe를 시작하면 Word 창이 나타납니다. 그리고 Word.exe는 새로운 인스턴스를 시작하지 않았습니다. 그래서 내 응용 프로그램은 Word 창에 씁니다. – userbb

+0

그런 다음 귀하의 질문에 대한 내 의견에서 말했듯이 : 귀하의 코드를 보여주십시오. 우리는 당신이 무엇을하고 있는지 우리에게 보여주지 않으면, 당신이 clair의 영광이 아니며 당신을 도울 수 없습니다. 그리고 사용자가 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 
+0

+1 Word가 시작, 연결 또는 시작되는 방법에 관계없이 현재 볼 수있는 문서 전체에 "긁힘"을 피하는 방법입니다. –

+0

Word의 재사용을 확신하지는 않지만 실행 * 숨겨진 * 인스턴스 ... (아직 :-) –

+0

확신합니다. 그런 식으로 (D5/Word97) 기억하지 않지만 Word (2007)는 이제 확실히 응용 프로그램에 의해 열리는 숨겨진 인스턴스를 다시 사용합니다. –