![]() |
Datenbank: Access • Version: 2000 • Zugriff über: ADO
Wordapplication mehrfach öffnen und schließen
Ich möchte eine Worddatei öffnen etwas hineinschreiben und anzeigen.
Danach soll die Datei entweder weiter geöffnet bleiben um sie später mit anderen Daten zu beschreiben und anzuzeigen oder sie wird geschlossen und das Programm beendet. Das geht alles solange gut, bis der Anwender eingreift und das Word selbst schließt. Dann bekomme ich Probleme wenn ich die Wordapplication1 vom Programm schließen will und auch, wenn ich sie danach nochmal öffnen will. Hier mal etwas Code für das öffnen und schließen:
Delphi-Quellcode:
Die IF Assigned() Abfrage scheint nicht zu funktionieren wenn Word schon geschlossen ist.
//******************************************************************************
//***************** Word öffnen ************************************************ //****************************************************************************** Procedure ConnectToWord; Begin With Form1 Do Begin if not Assigned(Wordapplication1) then WordApplication1.Create(nil); Try WordApplication1.Connect; Except Showmessage('Word konnte nicht gestartet werden'); exit; End; WordApplication1.Documents.OpenOld(FileName, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam); WordDocument1.ConnectTo(WordApplication1.ActiveDocument); End; End; //****************************************************************************** //***************** Word Beenden *********************************************** //****************************************************************************** Procedure WordBeenden; Begin With Form1 Do Begin WordApplication1.Visible := True; WordApplication1.Activate; showmessage('Weiter mit OK'); Try Feld := False; If Assigned(WordApplication1) Then Begin WordApplication1.Quit(Feld); WordApplication1.Disconnect; WordApplication1.Free; End; Except End; End; End; wie macht man das richtig ? |
Re: Wordapplication mehrfach öffnen und schließen
Du mußt nach dem Schließen von Word die Referenzvariable aus Nil setzen.
|
Re: Wordapplication mehrfach öffnen und schließen
Danke für die Hilfe, aber was ist bei mir die Referenzvariable, ist das Wordapplication1 ?
|
Re: Wordapplication mehrfach öffnen und schließen
Ja. Sie zeigt ja nach dem Zerstören der Instanz immer noch auf die Speicheradresse. Das assigned überprüft ja nicht die Existenz sondern die Adresse und erkennt deshalb nicht, das das Objekt nicht mehr existiert.
|
Re: Wordapplication mehrfach öffnen und schließen
Ok, nun kann ich aber nicht sagen wordapplication:=nil wie gebe ich die Adresse frei ?
Außerdem bringt mir das etwas bei meinem Problem, dass der Anwender das Word schließt und ich davon nichts mitbekomme ? Wie prüfe ich ob das Word noch da ist ? |
Re: Wordapplication mehrfach öffnen und schließen
Ich bekomme immer die OLE-Exception: 'Der RPC-Serverist nicht verfügbar'
|
Re: Wordapplication mehrfach öffnen und schließen
Wenn ich beim Word beenden noch das
WordApplication1:=nil; hinzufüge, dann komme ich beim nächsten Word Connect in den Aufruf WordApplication1.Create(Nil); hinein, da Wordapplication1 jetzt nicht mehr assigned ist. Dort bekomme ich dann aber einen 'Zugriffsfehler in Modul...' beim WordApplication1.Create(Nil); |
Re: Wordapplication mehrfach öffnen und schließen
So habe ich es schließlich gelöst.
Es funktioniert nicht immer hundertprozentig aber meistens schon. Habe bisher keine Beschwerden mehr gehört.
Delphi-Quellcode:
//******************************************************************************
//***************** Word öffnen ************************************************ //****************************************************************************** Procedure ConnectToWord(sichtbar: Boolean); Var wFalse, TempFile: OleVariant; Ziel, Dateiname: String; Begin wFalse := False; { Check if file exists } If Not FileExists(Filename) Then Begin ShowMessage('Das Dokument ist nicht vorhanden'); Exit; End; With Form1 Do Begin // else // WordOpen := True; Try If (Not aktiv('Word.Application')) Then Begin // WordApplication1.Connect; // WordDocument1.Create(Form1); WordOpen := False; End; WordApplication1.Connect; Except { on E: Exception do begin E.Message := 'Das MS-Word Programm ist nicht verfügbar'; raise; end;} Showmessage('Word konnte nicht gestartet werden'); exit; End; If WordOpen Then WordDocument1.Close(wFalse); If Aendern Then Begin // Kopie von Worddatei anlegen und damit arbeiten bei Replace Dateiname := FrmVerwaltungBriefe.BGrid.Cells[2, StrToInt(BriefIndex)]; Ziel := AppPath + '$TempDoc.doc'; Tools.CopyFile(Dateiname, Ziel); TempFile := Ziel; WordApplication1.Documents.OpenOld(TempFile, wFalse, wFalse, wFalse, EmptyParam, EmptyParam, wFalse, EmptyParam, EmptyParam, EmptyParam); End Else // Wenn 'Brief laden' aufgerufen wurde, dann mit Orginaldatei arbeiten WordApplication1.Documents.OpenOld(FileName, wFalse, wFalse, wFalse, EmptyParam, EmptyParam, wFalse, EmptyParam, EmptyParam, EmptyParam); WordDocument1.ConnectTo(WordApplication1.ActiveDocument); WordApplication1.Visible := sichtbar; WordOpen := True; //WordApplication1.Activate; End; End; //****************************************************************************** //***************** Word Beenden *********************************************** //****************************************************************************** Procedure WordBeenden; Begin With Form1 Do Begin If WordOpen Then Begin Try WordApplication1.Quit; WordApplication1.Disconnect; Except End; End; End; End; |
Re: Wordapplication mehrfach öffnen und schließen
Hier noch der Knackpunkt: das Programm "Active" stellt fest ob ein Programm aktiv ist.
Habe ich in einem Forum gefunden.
Delphi-Quellcode:
//******************************************************************************
//********************** Abfrage ob Programm aktiv ist ************************* //****************************************************************************** Function aktiv(ProgID: String): Boolean; Var rclsid: TGUID; ppunk: IUnknown; Begin rclsid := ProgIDToClassID(ProgID); result := GetActiveObject(rclsid, Nil, ppunk) = 0; End; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz