AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Wordapplication mehrfach öffnen und schließen
Thema durchsuchen
Ansicht
Themen-Optionen

Wordapplication mehrfach öffnen und schließen

Ein Thema von Smiley · begonnen am 21. Mär 2007 · letzter Beitrag vom 9. Apr 2008
Antwort Antwort
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#1

Wordapplication mehrfach öffnen und schließen

  Alt 21. Mär 2007, 21:53
Datenbank: Access • Version: 2000 • Zugriff über: ADO
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 ?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Wordapplication mehrfach öffnen und schließen

  Alt 22. Mär 2007, 06:55
Du mußt nach dem Schließen von Word die Referenzvariable aus Nil setzen.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Wordapplication mehrfach öffnen und schließen

  Alt 22. Mär 2007, 15:42
Danke für die Hilfe, aber was ist bei mir die Referenzvariable, ist das Wordapplication1 ?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Wordapplication mehrfach öffnen und schließen

  Alt 22. Mär 2007, 15:44
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Wordapplication mehrfach öffnen und schließen

  Alt 22. Mär 2007, 15:50
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Wordapplication mehrfach öffnen und schließen

  Alt 22. Mär 2007, 15:58
Ich bekomme immer die OLE-Exception: 'Der RPC-Serverist nicht verfügbar'
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Wordapplication mehrfach öffnen und schließen

  Alt 22. Mär 2007, 16:59
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);
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Wordapplication mehrfach öffnen und schließen

  Alt 9. Apr 2008, 13:30
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;
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Wordapplication mehrfach öffnen und schließen

  Alt 9. Apr 2008, 13:34
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;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:03 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