Announcement

Collapse
No announcement yet.

Seitenüberschreitung beim Drucken (VS2003)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Seitenüberschreitung beim Drucken (VS2003)

    Ich habe ein Problem beim drucken einer Textdatei. Zum einen weiß ich nicht, wie ich darauf reagieren soll, wenn die Zeile länger ist, als die Seite breit ist und zum anderen weiß ich nicht, wie ich dem Drucker sagen kann, das er nicht bei Position 0,0 anfangen soll zu drucken (weil das kann er ja eh nicht)

    Kann mir jemand sagen was ich ändern, bzw. einfügen muss?

    private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
    {
    if(myFont==null)
    myFont = new Font("Arial",20);
    if(myBrush==null)
    myBrush = Brushes.Black;

    String[] splitted = null;
    splitted = document.Split('\n');
    linesPerPage = (int)((double)e.MarginBounds.Height / myFont.GetHeight());
    totalPages = splitted.Length / linesPerPage;
    if((splitted.Length % linesPerPage) != 0)
    {
    totalPages++;
    }

    for(int i=0;i<linesPerPage;i++)
    {
    if(i+(linesPerPage*currentPage)>=splitted.Length)
    {
    break;
    }
    e.Graphics.DrawString(splitted[i+(linesPerPage*currentPage)], myFont, myBrush,x,y+(i*myFont.GetHeight()));
    }



    if(currentPage+1<totalPages) // +1 weil sonst 1 Seite zu viel gezählt wird.
    {
    e.HasMorePages = true;
    currentPage++;
    }
    else
    {
    e.HasMorePages = false;
    }
    }

  • #2
    ok, das Problem mit der Duckposition hab ich behoben

    es fehlten lediglich die Anweisungen

    x = e.MarginBounds.Left;
    y = e.MarginBounds.Top;

    Aber mit dem Text der länger ist als das blatt breit, komm ich nicht weite

    Comment


    • #3
      Ich liebe es, wenn Leute Kommentare abgeben, die keine Ahnung haben. Trotzdem verstoße ich jetzt mal gegen meine eigene Regel:

      Kann es sein, dass es dafür gar keinen Automatismus gibt? Ich habe in anderen Programmiersprachen ein solches Problem schon öfters gehabt und musste den Zeilenumbruch immer manuell errechnen und durchführen. D.h. Zeilenlänge gegen Seitenbreite prüfen und Leerzeichen für Leerzeichen (d.h. Wort für Wort) durchgehen.

      Ich hoffe, dass das heutzutage (und vor allem mit .NET) besser geht

      Comment


      • #4
        > Ich hoffe, dass das heutzutage (und vor allem mit .NET) besser geht.

        Für viele Druckaufgaben reichen (käufliche) Reportingtools aus. Und dort gibt es solche schönden dinge wie Memoboxen/felder die alles selbstständig durchführen

        Comment


        • #5
          Hallo,

          &gt;Aber mit dem Text der länger ist als das blatt breit, komm ich nicht weiter ..

          wenn die Textdatei in das <i>RichTextBox</i>-Control geladen wird und dort der Zeilenumbruch aktiv ist, stehen die zu druckenden Zeilen in der RichTextBox-Eigenschaft <b>Lines</b> bereit.

          Ein Beispiel ist über die folgende URL zu finden: <i>http://www.codeguru.com/Csharp/Csharp/cs_controls/richtext/article.php/c4781</i>

          Alternativ kann der notwendige Zeilenumbruch auch über die <b>Graphics</b>-Methode <b>MeasureString</b> selbst ermittelt werden. Über die <b>Substring</b>-Methode kopiert die Druckfunktion dann nur den Teil der Zeichenkette, der auf die Seite passt (auch wenn das dann nicht in jedem Fall eine korrekte Trennstelle sein wird)

          Comment


          • #6
            ich hab es jetzt so gelöst, das ich den String, der "zu lang" ist, in seine einzelnen Wörter aufsplitte und diese dann solange wieder zusammensetze zu einem String, wie es noch in die Zeile passt.

            hier mal mein Code (funktioniert aber noch nicht zufriedenstellend)

            String[] splitter = null;
            splitter = document.Split('\n');
            ArrayList splitted = new ArrayList(splitter);

            int counter = 0;
            foreach(string s in splitter)
            {
            SizeF stringSize = new SizeF();
            stringSize = e.Graphics.MeasureString(s,myFont);
            if(stringSize.Width>e.MarginBounds.Width)
            {
            String[] splitter2 = s.Split(' ');
            ArrayList splitted2 = new ArrayList(splitter2);

            int currentWord = 0;
            string newString = "";
            for(int i=currentWord; i<splitted2.Count; i++)
            {
            if((e.Graphics.MeasureString(newString+splitted2[i], myFont)).Width<=e.MarginBounds.Width)
            {
            newString+=splitted2[i]+" ";
            }
            else
            {
            i--;
            splitted.Insert(counter,newString);
            newString = "";
            counter++;
            }
            }
            if (newString!= "")
            {
            splitted.Insert(counter,newString);
            }
            counter++;
            splitted.RemoveAt(counter);
            //counter--;
            }

            Comment

            Working...
            X