Textdatei drucken!



  • Hallo,
    danke 🕶 für eure Hilfe. Unten ist mein neuer Code, für alle die mal so was ähnliches machen müsse.

    // 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);
    
         // Seite auswerfen
         dcPrint.EndPage();
    
         // 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;
    }
    


  • He Supi! 🙂 👍

    Da grübelt man noch, wie (und ob) man den Beitrag in die Realität überträgt - und da fällt die Lösung vom Himmel. 😃 🙂

    Dankeschön

    PS: Der kommt in meine Sammelmappe mit guten Codeschnipseln. 😃



  • Danke 😉 ,
    versteh ich als Kompliment!

    Ade
    Walter



  • Hallo zusammen,
    in meiner Lösung vom 04 Nov 2003 10:16 war noch ein 🤡 Fehler! Habe vergessen

    dcPrint.EndPage();

    vor
    dcPrint.EndDoc();

    aufzurufen. Unter Windows 2000 halt aber trotzdem alles geklappt, nur unter Windows 98 nicht. Win98 hat garnicht gedruckt.

    Habe den Fehler in der Lösung behoben.

    Ade
    Walter



  • Grüßt euch,

    kann mir jemand von euch bitte sagen, wie ich das Bsp zum Laufen bekomme.
    Ich habe eine neues Proj. angelegt (MFC,dialogbasierend) und habe eine Funkt die genauso heißt wie im Code angelegt.
    Fehler kommen keine keine, aber passieren tu nichts.
    Anstatt dem:
    if(PrintFile.Open(sDatei, CFile::modeRead,NULL))
    hab ich das geschrieben:
    if(PrintFile.Open("C:\\TEST.doc", CFile::modeRead,NULL))

    Weiß das von euch jemand, woran das liegt?
    DANKE



  • Hi,
    schreib mir mal für welches Betriebssystem Du das machts. Was heißt es passiert nichts?

    Bis dann
    Walter



  • hallo Walter.Wiedmann
    der Vater des Threads 🙂

    für XP, oder muss ich dein code in die OnOk Funktion reinschreiben?
    danke



  • Hi,
    also am einfachsten zum Probieren ist es wenn Du den Inhalt der Funktion, also alles innerhalb der äußersten geschweiften Klammern beginnend mit

    bool bPrintOk = false;
    ...
    ...
    ...
    return 0;

    in der OnOk - Funktion einfügst. Die Funktion muss halt dann int zurückgeben.

    Noch eine Frage. Hast Du schon mal mit VC6 programmiert?

    Ade
    Walter

    PS: Nicht böse wegen der Frage sein, ist nur gut zu wissen, wie genau mach etwas beschreiben muss. Nicht dass ich hier versuche alles klein klein zu beschreiben und Du denkst dir, hält der mich für blöd!

    PPS: Du kannst mich aber auch gerne mal per ICQ kontaktieren, dann kann ich Dir schneller helfen.



  • hi
    okay werds morgen mal versuchen...hab ich mir so schon gedacht
    Ja, aber bin sozusagen "Anfänger"...
    danke
    Ich meld mich dann
    gruß



  • Ich dachte erst auch da passiert nichts, doch dann habe ich mal in der Datei ein paar Zeilen geschrieben, und bemerkt, das mein Drucker die ränder verschluckt.
    Demnach waren die ersten beiden Zeilen und der erste Buchstabe einfach nicht da.

    Habe es so gelöst!

    // 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(50,200,Groesse.cx+50,Groesse.cy*iZeilen+200); 
    // 50 und 200 sind meine verschlukten Ränder
    

    Jetzt ist für mich nurnoch interessant wie ich diesen Dialog umgehe, damit automatisch gedruckt wir.

    Sprich: Ich drücke In meiner Anwendung auf DRUCKEN und ohne weitere Nachfrage wird gedruckt.

    Wie geht das? 😕


Anmelden zum Antworten