Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Wordapplication mehrfach öffnen und schließen (https://www.delphipraxis.net/88843-wordapplication-mehrfach-oeffnen-und-schliessen.html)

Smiley 21. Mär 2007 21:53

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:
//******************************************************************************
//***************** 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;
Die IF Assigned() Abfrage scheint nicht zu funktionieren wenn Word schon geschlossen ist.

wie macht man das richtig ?

mkinzler 22. Mär 2007 06:55

Re: Wordapplication mehrfach öffnen und schließen
 
Du mußt nach dem Schließen von Word die Referenzvariable aus Nil setzen.

Smiley 22. Mär 2007 15:42

Re: Wordapplication mehrfach öffnen und schließen
 
Danke für die Hilfe, aber was ist bei mir die Referenzvariable, ist das Wordapplication1 ?

mkinzler 22. Mär 2007 15:44

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.

Smiley 22. Mär 2007 15:50

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 ?

Smiley 22. Mär 2007 15:58

Re: Wordapplication mehrfach öffnen und schließen
 
Ich bekomme immer die OLE-Exception: 'Der RPC-Serverist nicht verfügbar'

Smiley 22. Mär 2007 16:59

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);

Smiley 9. Apr 2008 13:30

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;

Smiley 9. Apr 2008 13:34

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 06:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz