none
Schon wieder Drucken RRS feed

  • Frage

  • Hallo,

    das Thema lässt mich nicht los.
    Inzwischen haben ich grundsätzlich schon mal meinen Drucker zum Drucken gebracht und jetzt auch eine Vorlage zum Abschreiben gefungen, bei der Kopf- und Fuzeile gedruckt werden, Schriftfont und Schriftgröße übernommen werden und der Text so getrimmt wird, dass er die Seitenränder einhält. Grafiken schaffe ich noch nicht, kommt aber auch noch irgendwann ;-).

    Aktuell habe ich noch das Problem damit, dass die Schriftfarbe der Vorlage nicht übernommen wird weil ich fix Brushes.Black eingestellt habe.

    Hier der Code:

    Private Sub Druck(ByVal sender As Object, ByVal e As PrintPageEventArgs) _
        Handles doc.PrintPage
            Try
                Dim ft As Font = Textfenster.Font
                Dim fc As Color = Textfenster.ForeColor
                Dim form As New StringFormat()
                Dim außen, innen As RectangleF
                Dim zeichen, zeilen As Integer
    
                'umschreibendes Rechteck des Druckbereichs mit/ohne Kopfzeile
                außen = e.MarginBounds
                innen = RectangleF.Inflate(außen, 0, -2 * ft.GetHeight(e.Graphics))
    
                'Anzahl vollständig passender Druckzeilen ermitteln und Höhe anpassen
                Dim anzahlZeilen As Integer = innen.Height \ ft.GetHeight(e.Graphics)
                innen.Height = anzahlZeilen * Textfenster.Font.GetHeight(e.Graphics)
    
                'Seite drucken (automatisch abgeschnitten durch form)
                If nummer >= von AndAlso zuDrucken.Length >= 0 Then
                    'zu langen Text hinter dem Wort anpassen/umbrechen
                    form.Trimming = StringTrimming.Word
                    e.Graphics.DrawString(zuDrucken, ft, Brushes.Black, innen, form)
    
                    'Dateiname in der Kopfzeile anzeigen
                    form.Alignment = StringAlignment.Center
                    e.Graphics.DrawString(Text, ft, Brushes.Black, außen, form)
    
                    'Seitennummer  rechtsbündig in Fußzeile anzeigen
                    form.Alignment = StringAlignment.Far
                    e.Graphics.DrawString("S " & nummer, ft, Brushes.Black, außen, form)
                End If
    
                'Gedruckten Text aus Drucktext nehmen; zeichen:zeilen: Größe der Seite
                form.Trimming = StringTrimming.Word
                e.Graphics.MeasureString(zuDrucken, ft, innen.Size, form, zeichen, zeilen)
                zuDrucken = zuDrucken.Substring(zeichen)
                nummer += 1
                If nummer - 1 > von Then
                    Druck(sender, e)
                Else
                    e.HasMorePages = zuDrucken.Length > 0 AndAlso nummer <= bis
                End If
    
            Catch ex As Exception
    
            End Try
    

    Eigentlich wollte ich an dieser Stelle das Gleiche machen wir mit ft

    Dim fc As Color = Textfenster.ForeColor
    Also einfach im Code anstelle Brushes.Blach eben fc eingeben. Da scheitere ich aber. Was mache ich verkehrt?

     

     

    Liebe Grüße Stefan
    Montag, 5. April 2010 22:03

Antworten

  • Hallo Stefan,

    da unter Windows gemalt wird, verwendet man einen Pinsel und nicht die Farbe direkt.
    Deswegen muß einen zur Farbe passenden Pinsel erstellen:
    Dim foreBrush As Brush = new SolidBrush(Textfenster.ForeColor)
    und den jeweils an den Stellen einsetzen, wo Du derzeit Bruhes.Black stehen hast.
    Am Ende solltest Du den Brush wieder freigeben:
    foreBrush.Dispose()
    Gruß Elmar
    Montag, 5. April 2010 23:08
  • Hallo Stefan,

    der Fehler dürfte an Deinem rekursiven Aufruf am Ende liegen:

        If nummer - 1 > von Then
            Druck(sender, e)
        Else
            e.HasMorePages = zuDrucken.Length > 0 AndAlso nummer <= bis
        End If
    
    
    Der wiederholte Aufruf von Druck ist dort vermutlich überflüssig.
    Das PrintPage Ereignis wird solange aufgerufen, wie HasMorePages ein True zurückgibst.

    Da der Code sehr nach dem Galileo Buch aussieht 16.7 Mehrseitiger Text
    meckere ich mal darüber: Das ist da eher ungeschickt gelöst.

    Gruß Elmar

    • Als Antwort markiert Giftzwockel Mittwoch, 7. April 2010 19:50
    Dienstag, 6. April 2010 18:05

Alle Antworten

  • Hallo Stefan,

    da unter Windows gemalt wird, verwendet man einen Pinsel und nicht die Farbe direkt.
    Deswegen muß einen zur Farbe passenden Pinsel erstellen:
    Dim foreBrush As Brush = new SolidBrush(Textfenster.ForeColor)
    und den jeweils an den Stellen einsetzen, wo Du derzeit Bruhes.Black stehen hast.
    Am Ende solltest Du den Brush wieder freigeben:
    foreBrush.Dispose()
    Gruß Elmar
    Montag, 5. April 2010 23:08
  • Hallo Elmar,

    danke. Die Idee mit As Brush hatte ich heute früh auch schon. Beim Rest hätte ich mir wieder die "Ohren" gebrochen.

     


    Liebe Grüße Stefan
    Dienstag, 6. April 2010 09:07
  • Hallo Elmar,

    nun habe ich die Schriftfarbe mit entsprechend deiner Antwort eingebunden und das funktionitert auch.

    Dafür bekomme ich nun beim Drucken mehrseitiger Dokumente die meldung.

    Eine nicht behandelte Ausnahme des Typs "System.StackOverflowException" ist in Drucken mit Komfort.exe aufgetreten. Stellen Sie sicher, dass sich keine Endlosschleife ergibt. Das hat aber nichts mit dem neuen Code zu tun wie ich herausgefunden habe, denn wenn ich den Teil weglasse und mit dem alten Code mehrseitige Vorlagen drucken möchte, passiert dasselbe.

    Gibt es da eine typische Fehlerquelle?


    Liebe Grüße Stefan
    Dienstag, 6. April 2010 17:35
  • Hallo Stefan,

    der Fehler dürfte an Deinem rekursiven Aufruf am Ende liegen:

        If nummer - 1 > von Then
            Druck(sender, e)
        Else
            e.HasMorePages = zuDrucken.Length > 0 AndAlso nummer <= bis
        End If
    
    
    Der wiederholte Aufruf von Druck ist dort vermutlich überflüssig.
    Das PrintPage Ereignis wird solange aufgerufen, wie HasMorePages ein True zurückgibst.

    Da der Code sehr nach dem Galileo Buch aussieht 16.7 Mehrseitiger Text
    meckere ich mal darüber: Das ist da eher ungeschickt gelöst.

    Gruß Elmar

    • Als Antwort markiert Giftzwockel Mittwoch, 7. April 2010 19:50
    Dienstag, 6. April 2010 18:05
  • Hallo Elmar,

    erwischt. Genau aus diesem Buch habe ich den Text. Allerdings war ich nicht so clever und habe den online gesucht sonder abgetippt.
    Aber dabei kann man ja auch was lernen.
    Danek für deinen Hinweis, ich habe die If-Then-Schleife dahingehend ignoriert und nur die Zeile:

    e.HasMorePages = zuDrucken.Length > 0 AndAlso nummer <= bis

    übrig gelassen und es geht. Nicht das ich wirklich alles verstehe was ich abgeschrieben habe, aber es geht.
    Das ihr MVPs allerdings schon an einem Code die Quelle erkennt ... Kompliment.
    Als nächstes versuche ich mich dann daran, auch noch Grafik ausdrucken zu können.


    Liebe Grüße Stefan
    Mittwoch, 7. April 2010 19:50
  • Hallo Stefan,

    auf den Code bin ich durch reinen Zufall gestoßen,
    als ich nach einem besseren Beispiel gesucht hatte.
    Rekursiver Code stößt einem an solcher Stelle immer auf ;-)

    Ein Treffer dabei, der allerdings schon in die Jahre gekommen ist
    und sich an DataTables orientiert: Printing Reports in Windows Forms

    Gruß Elmar

    Donnerstag, 8. April 2010 10:27