Word OLE > PrintOut und Quit ein Pausenproblem



  • Hallo zusammen,

    ich erstelle eine RTF Datei und lade diese mittels OLE in Word.
    Das klappt auch fehlerfrei. Mit PrintOut drucke ich diese dann aus
    und beende nun Word mit Quit. Und hier habe ich das Problem:
    Wenn ich nicht mittels Debugmouds (Einzelsteps) die Befehle abarbeite,
    also das Programm nicht direkt durchlaufen lasse, dann funktioniert das
    PrintOut nicht mehr, da scheinbar das nachfolgende Quit das PrintOut abbricht:

    //----------------------------------------------------------------------------
    //----- WORD OLE -----
    //----------------------------------------------------------------------------
    Boolean WordOle(int p1,int p2,int p3,AnsiString pt1,AnsiString pt2,AnsiString pt3)
    {try {                                                                          // Fehlerroutine Start
     AnsiString z1,zFile,zPfad,zInfo,zData;                                         // Vars definieren
    
     // Version: 1.00   23.03.2012                                                  //
    
     // p1: 1=Ausgabe über Word                                                     //
     // p2: 0=nur Anzeige  1=Anzeige und Drucken                                    //
     // p3: 0=unsichtbarer Vorgang  1=sichtbarer Vorgang                            //
    
     zInfo=pt1;                                                                     // Titel
     zFile=pt2;                                                                     // RTF Datei
     zData=pt3;                                                                     // Datensatz
    
     if(Form1->oPrgComp) {                                                          // nur im IDE
      z1=   "pt1  \t: "+zInfo+"\r";                                                 //
      z1=z1+"pt2  \t: "+zFile+"\r";                                                 //
      z1=z1+"pt3  \t: "+zData+"\r";                                                 //
      Application->MessageBoxA(z1.c_str(),"Sicherheitshinweis",MB_OK | MB_ICONINFORMATION); // Info geben
     }
    
     if(zFile.Length()==0) { return false; }                                        // Keine Dateiübergabe, Abbruch
    
     Screen->Cursor=crHourGlass; Application->ProcessMessages();                    // Sanduhr
    
     if(FileExists(zFile)==false) {                                                 // Datei nicht gefunden?
      Screen->Cursor=crDefault;  Application->ProcessMessages();                    // Pfeil
      z1=   "Datei für MS Word nicht gefunden!?\r\r";                               //
      z1=z1+zFile;                                                                  //
      if(p3==1 || Form1->oPrgComp) { Application->MessageBoxA(z1.c_str(),"Sicherheitshinweis",MB_OK | MB_ICONINFORMATION); } // Info geben
      return false;                                                                 // und Abbruch
     }                                                                              // ende if(FileExists
    
     Variant MsWord,vDocum,vFont;                                                   // Vars definieren
    
     MsWord=CreateOleObject("Word.Application");                                    // Word OLE anmelden
     MsWord.OlePropertySet("Visible",p3==1);                                        // Word jetzt sichtbar machen
    
     vDocum=MsWord.OlePropertyGet("Documents");                                     // neue Objet Dokument erzeugen
     vDocum.OleProcedure("Open",zFile.c_str());                                     // Datei in Word laden
     Application->ProcessMessages();                                                // events abarbeiten
    
     if(p2==1) {                                                                    // ANZEIGEN UND DRUCKEN
      MsWord.OleProcedure("PrintOut");                                              // Dokument ausdrucken
      Application->ProcessMessages();                                               // events abarbeiten
    
      //hier ist mein Problem: Wie bekomme ich eine Rückantwort, das das Drucken erfolgt ist
      //oder gibt es eine Art Queue, wo ich an Word meine Befehle übermitteln kann?
    
      MsWord.OleFunction("Quit",0);                                                 // Word schliessen
      Application->ProcessMessages();                                               // events abarbeiten
     }                                                                              // ende if(p2==1
    
     MsWord=Unassigned;                                                             // und Object auflösen
    
     Screen->Cursor=crDefault;   Application->ProcessMessages();                    // Pfeil
    
     } catch(Exception& e) { MessageBox(NULL, e.Message.c_str(), "FunktionAllgemein.h::WordOle", MB_OK | MB_ICONSTOP); return false; }  // Fehler anzeigen
    }
    

    Habe viel gegoogelt und hier gesucht, aber leider nichts gefunden bzw. erkannt.

    Danke im Voraus für Ideen und Tipps 👍

    Gruss Stefan



  • Vielleich mal diesen Ansatz verfolgen:
    http://www.bytesandmore.de/rad/index.htm?http://www.bytesandmore.de/rad/cpp/snipp/sc06023.php
    Auf jeden Fall wird dort das Dokument noch erst wieder geschlossen, bevor Word beendet wird.



  • Hallo W.Posur,

    danke für Deinen Tipp. Werde ich mal nach Ostern mir in Ruhe anschauen.

    Zwischenzeitlich habe ich eine kleine Lösung gefunden:

    Eine kleine Pause von 1 Sekunde zwischen dem Befehl PrintOut und Quit
    führt zum Erfolg. Ich bin damit allerdings nicht zufrieden, da ich nicht
    weiß, ob das wirklich auf jedem PC sauber funktioniert.

    Sollte ich mit den anderen Hinweisen eine bessere Lösung finden, werde ich
    sie hier posten.

    Frohe Ostern 😋
    Stefan


Anmelden zum Antworten