VB Drucken läuft auf Fehler

  • VB.NET

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

    VB Drucken läuft auf Fehler

    Hallo zusammen,

    ich habe folgendes Problem. Ich studiere Wirtschaftsingenieurswissenschaften im 2.Semester und muss für Informatik eine Applikation zur Behälterberechnung programmieren. Soweit so gut. Nun habe ich jedoch das Problem das der Druckvorgang permanent auf Fehler läuft und mein Form1 nicht gedruckt wird.

    Das erste ist die PrintForm und darunter befinden sich die beiden Vorgänge die den Druck starten sollen die sich im Main befinden.

    Gedacht war das ganze eigentlich so, das der Nutzer durch die ausgelöste Aktion den Druck mit dem PrintDialog startet. Der scheint hier jedoch gar nicht zu greifen.

    Beim Test hängt sich das Programm an der Stelle NotImplementedExeption auf und beendet.
    Der Ausdruck des Form1 ist dabei nicht erfolgt.

    Die Programmierung erfolgt mit Visual Studio 2013.
    Alles was ich bisher hier und im Forum gefunden habe verwirrt mich mehr als es mir hilft.

    Vielen Dank schon mal an jeden der mir einen Ratschlag geben kann.
    Gruß, Andi

    Visual Basic-Quellcode

    1. Class PrintForm
    2. Private _form1 As Form1
    3. Sub New(form1 As Form1)
    4. ' TODO: Complete member initialization
    5. _form1 = form1
    6. End Sub
    7. Property PrintAction As Object
    8. Sub Print()
    9. Throw New NotImplementedException()
    10. End Sub
    11. End Class
    12. Private Sub DruckenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles DruckenToolStripMenuItem.Click
    13. 'Form Drucken über Programmleiste
    14. Dim pf As New PrintForm(Me)
    15. pf.PrintAction = PrintToPrinter
    16. pf.Print()
    17. End Sub
    18. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    19. 'Form Drucken über Programm Button
    20. Dim pf As New PrintForm(Me)
    21. pf.PrintAction = PrintToPrinter
    22. pf.Print()
    23. End Sub
    Willkommen im Forum. :thumbup:

    CrashWorm schrieb:

    NotImplementedExeption
    Ich nehme mal an, Du kannst diese Fehlermeldung zumindest in den richtigen Kontext setzen, um zu verstehen, warum sie kommt (sie kommt nämlich, weil Du sdas so implementiert hast). ;)
    Gugst Du hier.
    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!
    Danke für deine schnelle Antwort.
    ​Ja, mir ist bewusst das ich diese Ausnahme angelegt habe.
    Danke für den Link. Der Aufruf des PrintDialog funktioniert.^^
    Ich versuche mir jetzt zu erarbeiten das mein Form1 im Querformat erscheint.
    Aktuell sehe ich ein weißes Blatt im Hochformat.
    Gruß, Andi

    CrashWorm schrieb:

    Querformat
    geht entweder über den PageSetupDialog oder direkt so:

    VB.NET-Quellcode

    1. PrintDocument1.DefaultPageSettings.Landscape = True
    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!

    CrashWorm schrieb:

    "Member Initialisatio
    Was meinst Du damit?
    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!

    CrashWorm schrieb:

    habe ich ein weißes Blatt.
    Ich wiederhole mich ungern.
    Gugst Du hier.
    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!
    Das ist ein Konstruktor:

    VB.NET-Quellcode

    1. Sub New(form1 As Form1)
    2. ' TODO: Complete member initialization
    3. _form1 = form1
    4. End Sub


    Und - wenn alles mit rechten Dingen zugeht - fehlt da der InitializeComponents-Aufruf, also probierma

    VB.NET-Quellcode

    1. Sub New(form1 As Form1)
    2. ' TODO: Complete member initialization
    3. InitializeComponents()
    4. _form1 = form1
    5. End Sub

    InitializeComponents() im Konstruktor aufzurufen ist eine etwas eigenartige Notwendigkeit von Windows.Forms.Forms, die man im FormDesigner erstellt hat.
    Nicht verstehen - einfach ausprobieren, obs dann besser ist.
    Erstmal vielen Dank für eure Hilfe. Ich habe jetzt allerdings auf eine für mich besser ansprechende Methode gewechselt indem ich über die Screenshots arbeite.
    ​Ich verstehe lediglich nicht warum mein Grafik nicht auf dem Blatt passend eingesetzt wird.
    Hat dazu jemand eine Idee? Die Margins sind ja auf 0?
    Auf den PrintDialog wird komplett verzichtet.

    Visual Basic-Quellcode

    1. ​Imports System.Drawing.Printing
    2. Public Class Form1
    3. Inherits System.Windows.Forms.Form
    4. #Region " Vom Windows Form Designer generierter Code "
    5. #End Region
    6. 'Variablen zum Drucken
    7. Private Const SRCCOPY As Integer = &HCC0020
    8. Private Declare Function BitBlt _
    9. Lib "gdi32.dll" ( _
    10. ByVal hdcDest As IntPtr, _
    11. ByVal x As Int32, _
    12. ByVal y As Int32, _
    13. ByVal Width As Int32, _
    14. ByVal Height As Int32, _
    15. ByVal hdcSrc As IntPtr, _
    16. ByVal xSrc As Int32, _
    17. ByVal ySrc As Int32, _
    18. ByVal dwRop As Int32 _
    19. ) As Boolean
    20. Private formImage As Bitmap
    21. Public Sub PrintForm()
    22. ' Graphics-Objekt für die Form erzeugen
    23. Dim formGraphics As Graphics = Me.CreateGraphics
    24. ' Kompatible Bitmap erzeugen und Graphics-Objekt abholen
    25. formImage = New Bitmap(Me.Width, Me.Height, formGraphics)
    26. Dim memGraphics As Graphics = Graphics.FromImage(formImage)
    27. ' Quell- und Ziel-DCs abholen
    28. Dim sourceDC As IntPtr = formGraphics.GetHdc
    29. Dim targetDC As IntPtr = memGraphics.GetHdc
    30. ' Kopieren ("Screenshot")
    31. BitBlt(targetDC, _
    32. 0, 0, Me.ClientRectangle.Width, Me.ClientRectangle.Height, _
    33. sourceDC, _
    34. Me.ClientRectangle.X, Me.ClientRectangle.Y, _
    35. SRCCOPY)
    36. ' DCs freigeben
    37. formGraphics.ReleaseHdc(sourceDC)
    38. formGraphics.Dispose()
    39. memGraphics.ReleaseHdc(targetDC)
    40. memGraphics.Dispose()
    41. ' Die Abbildung aus formImage ausdrucken:
    42. PrintDocument1.DefaultPageSettings.Landscape = True
    43. PrintDocument1.Print()
    44. formGraphics.Dispose()
    45. End Sub
    46. Private Sub PrintDocument1_PrintPage( _
    47. ByVal sender As System.Object, _
    48. ByVal e As System.Drawing.Printing.PrintPageEventArgs _
    49. ) Handles PrintDocument1.PrintPage
    50. ' Screenshot ausdrucken
    51. e.Graphics.DrawImage(formImage, 0, 0)
    52. End Sub
    Jou.

    CrashWorm schrieb:

    nicht auf dem Blatt passend eingesetzt wird
    Verwende Graphics-Methoden statt API.BitBlt. Teste das mit einer Bitmap in einer PictureBox.
    Nutze den PrintPreviewDialog.
    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!