Unterschiede zwischen Windows 2000 und Windows 98 beim Drucken!!



  • Hallo,
    ich habe die untere Funktion, die ein Reportfile (reine Textdatei) auf einem Drucker ausgibt. Das Ganze funktioniert auch problemlos unter Windows 2000. Aber unter Windows 98 funktioniert es nicht 🙄 . Wenn ich unter Windows 98 den Druckauftrag in eine Datei schreiben lasse, erhalte ich immer eine Datei mit der Grösse von 0 Bytes.

    Hat jemand eine Idee, was unter Windows 98 geändert werden sollte, damit die Funktion wieder funktioniert. Der Drucker unter Windows 98 funkioniert, weil ich die Reportdatei mit einem normalen Editor problemlos drucken kann.

    // Drucken des Reportfiles 
    // Parameter: 
    // CString sDatei = Dateiname + Path der zu druckenden Reportdatei 
    // Rückgabewerte: 
    // 0 = Fehler frei 
    // 1 = Fehler aufgetretten 
    // 2 = Benutzerabbruch 
    int Test::PrintReportFile(CString sDatei) 
    { 
     bool bPrintOk = false; 
     int iZeilen = 0; 
     int iMaxLength = 0; 
     CString sPrintFile = ""; 
     CString sMaxLength = ""; 
    
     //Datei öffnen 
     CStdioFile PrintFile; 
     do 
     { 
      if(PrintFile.Open(sDatei, CFile::modeRead,NULL)) 
      { 
    
       CString sTemp; 
       //Zeile einlesen 
       while(PrintFile.ReadString(sTemp)) 
       { 
        //Anzahl der Zeichen in länster Zeile ermitteln 
        if(iMaxLength < sTemp.GetLength()) 
        { 
         iMaxLength = sTemp.GetLength(); 
         sMaxLength = sTemp; 
        } 
        //Anzahl der Zeilen ermitteln 
        iZeilen++; 
        //String anhängen 
        sPrintFile = sPrintFile + sTemp + "\n"; 
       } 
    
       // Ein CPrintDialog-Object konstruieren 
       CPrintDialog dlgPrint(FALSE,PD_ALLPAGES,this); 
    
       if (dlgPrint.DoModal()==IDOK) 
       { 
        //Den Drucker-DC vom Dialogfeld mit einem CDC-Objekt verbinden 
        CDC dcPrint; 
        dcPrint.Attach(dlgPrint.GetPrinterDC()); 
    
        // Eine DOCINFO-Struktur erzeugen und füllen 
        DOCINFO myPrintJob; 
        myPrintJob.cbSize = sizeof(myPrintJob); 
        myPrintJob.lpszDocName = "MeinDruckAuftrag"; 
        myPrintJob.lpszOutput = NULL; 
        myPrintJob.lpszDatatype = NULL; 
        myPrintJob.fwType = NULL; 
    
        // Ausdruck des Dokuments starten 
        if(dcPrint.StartDoc(&myPrintJob) >= 0) 
        { 
         //Eine Seite beginnen 
         dcPrint.StartPage(); 
    
         //Platzbedarf der längsten Zeile ermitteln 
         CSize Groesse = dcPrint.GetTextExtent(sMaxLength); 
    
         //Rechteck erstellen 
         //Maximale Zeilenlänge steht in Groesse.cx 
         //Maximale Dokumentlänge ist Groesse einer Zeile mal 
         //Anzahl der Zeilen (Groesse.cy*iZeilen) 
         CRect SeiteGroesse(0,0,Groesse.cx,Groesse.cy*iZeilen); 
    
         // Zeichnen beginnen 
         dcPrint.DrawText(sPrintFile,SeiteGroesse,DT_EXPANDTABS); 
    
         // Dokument schließen 
         dcPrint.EndDoc(); 
         // Drucken erfolgreich!! 
         bPrintOk = true; 
        } 
        else 
        { 
         if(MessageBox("Fehler beim drucken des Reports!\r\n" 
          "Nochmal versuchen?","DRUCKFEHlER", MB_ICONERROR | MB_YESNO) == IDNO) 
         { 
          //Funktion mit Fehler beenden 
          return 1; 
         } 
        } 
    
        //Druckergerätekontext löschen 
        dcPrint.DeleteDC(); 
       } 
       else 
       { 
        //Benutzer hat abgebrochen 
        return 2; 
       } 
      } 
      else 
      { 
       if(MessageBox("Fehler beim öffnen des Reports zum Drucken!\r\n" 
        "Nochmal versuchen?","DRUCKFEHlER", MB_ICONERROR | MB_YESNO) == IDNO) 
       { 
        //Funktion mit Fehler beenden 
        return 1; 
       } 
      } 
     }while(bPrintOk == false); 
     return 0; 
    }
    

    Danke
    Walter



  • Hallo,
    ich habe das Problem gefunden!

    Im Codeabschnitt

    // Zeichnen beginnen  
    dcPrint.DrawText(sPrintFile,SeiteGroesse,DT_EXPANDTABS);  
    
    // Dokument schließen  
    dcPrint.EndDoc();
    

    Fehlt die Zeile dcPrint.PageEnd(); die vor dcPrint.EndDoc(); gehört.

    Code sollte als folgendermassen aussehen:

    // Zeichnen beginnen  
    dcPrint.DrawText(sPrintFile,SeiteGroesse,DT_EXPANDTABS);  
    
    // Seite auswerfen
    dcPrint.EndPage();
    
    // Dokument schließen  
    dcPrint.EndDoc();
    

    Ade
    Walter


Anmelden zum Antworten