Seitenvorschub klappt nicht !

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Seitenvorschub klappt nicht !

    Hi,

    ich habe ein recht trivales Problem: ich will mehrere Seiten auf meinem Drucker ausgeben. Dazu benötige ich einen "Seitenvorschub".

    Das sollte doch eigentlich ein Klacks sein ... aber irgendwie funktionieren die üblichen Tips aus dem Netz bei mir nicht. So habe ich das versucht:

    VB.NET-Quellcode

    1. Private WithEvents myPrintDocument As New PrintDocument
    2. Private Sub cmdPrint_Click(sender As Object, e As EventArgs) Handles cmdPrint.Click
    3. 'Select printer
    4. Dim locPD As New PrintDialog()
    5. Dim locDR As DialogResult = locPD.ShowDialog()
    6. If locDR = DialogResult.Cancel Then Return
    7. 'Start printer
    8. myPrintDocument.PrinterSettings = locPD.PrinterSettings
    9. myPrintDocument.Print()
    10. End Sub
    11. Private Sub myPrintDocument_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles myPrintDocument.PrintPage
    12. numPages = CInt(txtNumberOfPages.Text)
    13. Dim blnHexaddr As Boolean = radHexOffset.Checked
    14. Dim blnShowChars As Boolean = chkShowChars.Checked
    15. Dim maxBytes As Integer = FormBase.FileByteArray.Count
    16. For currentPage As Integer = 1 To numPages
    17. GeneratePage(FormBase,
    18. e.Graphics,
    19. PageSize,
    20. currentPage,
    21. numPages,
    22. blnHexaddr,
    23. blnShowChars,
    24. maxBytes)
    25. If currentPage < numPages Then e.HasMorePages = True '<-- This does not work !
    26. Next
    27. e.HasMorePages = False
    28. End Sub


    Die Routine zum Drucken der Page sieht wie folgt aus:

    VB.NET-Quellcode

    1. Public Sub GeneratePage(FormHexEdit As frmMain,
    2. g As Graphics,
    3. PageSize As Integer,
    4. currentPage As Integer,
    5. numPages As Integer,
    6. blnHexAddr As Boolean,
    7. blnShowChars As Boolean,
    8. maxBytes As Integer)
    9. g.PageUnit = GraphicsUnit.Millimeter
    10. 'Define fonts
    11. Dim locFontRegular As New Font(FontFamily.GenericSerif, 12, FontStyle.Regular)
    12. Dim locFontCourier As New Font("Courier New", 12, FontStyle.Regular)
    13. 'Define print offsets
    14. Dim locOffset_X As Single = 10.0F ' 10 mm
    15. Dim locOffset_Y As Single = 10.0F ' 10 mm
    16. Dim locPen As New Pen(Color.Black, 0.25F)
    17. Dim locStringFormat As StringFormat = DirectCast(StringFormat.GenericTypographic.Clone, StringFormat)
    18. Dim PageWidth As Single = 192
    19. 'Write headlines
    20. Dim strHeader As String = "HexEdit Print "
    21. locStringFormat.LineAlignment = StringAlignment.Near
    22. locStringFormat.Alignment = StringAlignment.Near
    23. g.DrawString(strHeader,
    24. locFontRegular, Brushes.Black,
    25. New RectangleF(locOffset_X, locOffset_Y, PageWidth, 183.0F / 3.0F),
    26. locStringFormat)
    27. ...


    Wenn ich nur eine Seite drucke schnuckt das auch ganz hervorragend ... wenn ich aber zwei oder mehr Seiten drucke, werden die AUFEINANDER gedruckt, d.h. der Seitenvorschub klappt nicht !

    Was mache ich denn falsch ?

    LG
    Peter
    @Peter329 Gugst Du hier: Drucken mehrseitiger Dokumente
    Für jede Seite einzeln wird das PrintPage-Event aufgerufen.
    Dort musst Du wissen, wo es bei der nächsten Seite weitergeht.
    Und wenn die Seite voll ist, verlässt Du die PrintPage-Routine und setzt die HasMorePages-Property, dann weiß das System, dass es mit der nächsten Seite weiter geht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Jau, danke !

    Das ist tatsächlich ein bissl ungewöhnlich. e.HasMorePages = True schreibt nicht nur einen Seitenvorschub, sondern ruft auch das Event PrintPage noch einmal auf.

    Man braucht also keine Schleife zu kodieren, sondern setzt nur e.HasMorePages auf True ... und wenn man den Druck beenden will, dann verkneift man sich das. Denn per Default steht e.HasMorePages automatisch auf False.

    Na, das muss man wissen. Und dann funzt die Sache. Herzlichen Dank nochmal für deine Hilfe !

    LG
    Peter
    @Peter329 Ganz einfach, wenn man das weiß.
    Arbeite mal das Tut durch, um das besser kennenzulernen, da sind noch einige Feinheiten drinne.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!