Verständnisfrage zur Druckfunktion des Frameworks

  • VB.NET

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

    Verständnisfrage zur Druckfunktion des Frameworks

    Hallo ihr lieben. Jetzt versuch ichs nochmal ordentlich :o)
    Ich nutze den VB eigenen Printing Naespace um druckbare Rechnungen zu erzeugen.
    Hierzu habe ich eine UC "UCRechnung" erstellt, auf der der User Artikel (Rechnungspositionen) eingibt oder auswählt. Meine Klasse "Rechnungerstellung" ist dann für die Vorschau und den Druck verantwortlich.
    Zu meinem (100% funktionierenden) Code habe ich eine Frage, bzw. ein Verständnissproblem mit der PrintDocument Klasse:

    ersmal der Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub CreateInvoice(Print As Boolean) ' Print wird gesetzt je nachdem ob der User auf Vorschau oder Drucken klickt - es wird jedoch vor dem Drucken IMMER erst eine Vorschau angezeigt
    2. '[...]
    3. Dim PrintDocument2 = New PrintDocument
    4. Dim InvoiceClass As New Rechnungserstellung(_ListOfInvoicePositions, GetInvoiceType, CompanyDataLeft, CompanyDataRight,
    5. CustomerDataLeft, CustomerDataRight, DTPRechnungsDatum.Value, SettingsRow.VolleSteuer,
    6. SettingsRow.ErmaessigteSteuer, CBXbezahlt.Checked, PrintDocument2, _Printer)
    7. If Print Then
    8. For i = 1 To _PrintingAmount
    9. PrintDocument2.Print()
    10. Next
    11. Else
    12. AddHandler InvoiceClass.CreateionFinsihed, AddressOf ShowWebView 'Edit falls hier jemand drüber stolpert, es wird kein WebView angezeigt, sondern die gesamt Seitenzahl in einer Variable gespeichert und auf der Form angezeigt
    13. ' den Namen der Sub habe ich gerade geändert.
    14. PrintPreviewControl1.Document = PrintDocument2
    15. PrintPreviewControl1.Zoom = 0.6
    16. LBLZoomFaktor.Text = "60%"
    17. End If
    18. End Sub


    Frage1: Ich übergebe das PrintDocument2 an meine Rechnungserstellung Klasse. Es wird durch die Klasse geändert und ändert sich auch in der Sub CreateInvoice.
    Um das zu erreichen habe ich zuerst innerhalb meiner Klasse eine Funktion geschrieben, die ein PrintDocument zurückgibt. Habe aber festgestellt, dass dies gar nicht nötig ist. Warum ist das so?
    Also wenn ich eine integer Variable habe, diese wird einer Klasse übergeben, damit sie durch irgendwelche Rechnerei geändert wird, brauche ich eine Funktion. Hier nicht.

    Frage2: bezieht sich auf die boolean Prüfung am Ende der obigen Sub:
    Egal ob Print oder Not Print, es wird immer ein neues PrintDocument erzeugt.
    Nun ist es bei mir aber so, dass erst nach Erstellung und Ansicht (des Users) der Vorschau gedruckt werden kann.
    Ich möchte also immer ein schon bestehendes PrintDocument drucken, erstelle dies aber immer neu.

    Hierfür habe ich versucht ein PrintDocument auf die Form zu ziehen und dieses dann zu verwenden. Das Ergebnis war aber, dass ein und das selbe Dokument einfach mehrfach beschrieben wurden.
    Ist es normal, dass das Dokument jedes mal neu erstellt wird? Oder habe ich hier einen Fehler?

    Falls jemand die Solution braucht, hänge ich sie ran. Den Code findet ihr in der UCRechnung, sowie in der Klasse Rechnungserstellung (beide im Hauptordner)

    Dateien
    • Theo.zip

      (17,67 MB, 4 mal heruntergeladen, zuletzt: )
    Das ist eben ein Unterschied zwischen Wertetypen und Referenztypen.

    VB.NET-Quellcode

    1. Dim Foo As Integer = 0
    2. Dim Bar As New Button
    3. MeineMethode(Foo, Bar)
    4. MessageBox.Show(Foo.ToString) '-> 0; Foo wird in der Methode NICHT geändert, da Wertetyp
    5. MessageBox.Show(Bar.Text) '-> "bla"; Bar wird in der Methode geändert, da Referenztyp
    6. '…
    7. Private Sub MeineMethode(EinInteger As Integer, EinButton As Button)
    8. EinInteger = 5 'VS meckert hier, dass das nix bringt
    9. EinButton.Text = "bla" 'das hier ändert was
    10. End Sub


    ##########

    Ich verwende das PrintDocument grundsätzlich anders als Du. Ich zieh mir eins auf das Form und dann noch ein PrintPreviewControl dazu. Letzterem weise ich im Designer das PrintDocument zu. Wenn ich ne Vorschau will, lass ich den Code MeinPrintPreviewControl.InvalidatePreview ausführen. Das ruft den Print-EventHandler des PrintDocuments aus und erstellt so die Vorschau. Will ich tatsächlich nen Ausdruck, ruf ich MeinPrintDocument.Print auf. Ich erstelle also im Code manuell nie ein PrintDocument selbst.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @DerSmurf Vielleicht siehst Du mal hier rein, das geht konform mit der Print-Philosophie des Frameworks:
    Drucken mehrseitiger Dokumente
    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!

    Neu

    Ich habs aus zwei Gründen anders gelöst.
    1. Finde ich das Control PrintPreviewControl optisch ziemlich übel. Gerade, wenn das ganze mittels Touch bedient werden soll.
    2. Wollte ich den PrintDocument erstell Code in eine extra Klasse auslagern. Ich dachte das sei sauberer, weil ja doch recht viel Code im PrintEvent auftaucht.

    Ist denn mein Code unsauber, so wie er ist?
    Denn sowohl @VaporiZed als auch @RodFromGermany raten mir ja nunmal zur Verwendung des PrintDocuments, in Verbindung mit dem PrintPreviewControl im Designer.

    Neu

    DerSmurf schrieb:

    in Verbindung mit dem PrintPreviewControl im Designer.
    Nö.
    Ich nutze den PreviewDialog, allerdings ist da ein PreviewControl 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!