Probleme mit dem Drucken von XML

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

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Probleme mit dem Drucken von XML

    Moin moin

    Ich bekomme das hier mit dem Ausdruck von XML-Dateien nicht hin. Die Druckvorschau klappt nicht.
    Beim Drucken; Entweder wird nur eine Seite gedruckt, oder so wie jetzt alles übereinander...
    Das ganze Thema "drucken" ist echt kompliziert. ;(

    Spoiler anzeigen


    Der VB - Code nicht mehr gültig. neuer aktl. Code unten.

    Aufbau der XML-Datei

    XML-Quellcode

    1. <Notizen>
    2. <IDPerson>4</IDPerson>
    3. <Datum>16.06.2024</Datum>
    4. <HeadLine>Lorem Ipsum</HeadLine>
    5. <Message>Lorem ipsum dolor sit amet, consetetur sadipscing elitr</Message>
    6. </Notizen>

    Bilder
    • druck-1.jpg

      216,95 kB, 1.286×337, 222 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Amelie“ ()

    Amelie schrieb:

    Das ganze Thema "drucken" ist echt kompliziert.
    Hast Du mal hier reingeschaut:
    Drucken mehrseitiger Dokumente
    Was ist EnvAeraInstance?
    Was ist LoSaInstance?
    ====
    Wieso verwendest Du nicht die in den Designer-Tools angebotenen Objekte?
    Wieso erstellst Du in jeder Click-Routine eine separate PrintDocument-Instanz?
    Dialoge werden in einer Using-Anweisung instanziiert und zerstört.
    ...
    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!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

    Hallo
    Ja da habe ich schon öfters reingeschaut, hat auch für das drucken von DGV und Chart geholfen.
    Das andere sind 2 Instanzen von Singelton Klassen wo nur ein Wert geholt wird. Pfad wo die XML liegt usw...

    EDIT: 15:45 Uhr ... Ich glaube ich habs .... :S Mal ausgibig Testen.


    Es will einfach nicht mit dem Seitenumbruch funktionieren. :(
    Entweder kommt nur eine Seite wo dann Text fehlt ODER es werden 2 Seiten erstellt aber auf Seite 1 wird der Text abgeschnitten und Seite 2 bleibt bis auf die Seitenüberschrift leer!


    Code geändert!
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class PrintNotizen
    2. Private ReadOnly EnvAeraInstance As EnvironmentArea = EnvironmentArea.Instance
    3. Private WithEvents LoSaInstance As LoadSaveNotice = LoadSaveNotice.Instance
    4. Public Font As New Font("Segoe UI", 10, FontStyle.Regular)
    5. Private entries As New List(Of String)
    6. Private Const entriesPerPage As Integer = 10 ' Anzahl der Einträge pro Seite
    7. Private currentPageIndex As Integer = 0 ' Aktuelle Seitenzahl
    8. Private currentEntryIndex As Integer = 0 ' Aktueller Index für die Einträge
    9. Public Sub PrintNotiz()
    10. ' Pfad zur XML-Datei
    11. Dim xmlFilePath As String = Path.Combine(EnvAeraInstance.AppDataDirectory, LoSaInstance.Filename)
    12. Debug.WriteLine($"Datei: {xmlFilePath}")
    13. ' Prüfen, ob die Datei existiert
    14. If Not File.Exists(xmlFilePath) Then
    15. MessageBox.Show("XML-Datei nicht gefunden.", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    16. Return
    17. End If
    18. ' XML-Datei laden
    19. Dim xmlDoc As New XmlDocument()
    20. xmlDoc.Load(xmlFilePath)
    21. ' Daten aus der XML-Datei lesen und formatieren
    22. Dim stringBuilder As New StringBuilder()
    23. Dim root As XmlNode = xmlDoc.DocumentElement
    24. ' Die einzelnen Einträge sammeln
    25. For Each notiz As XmlNode In root.SelectNodes("Notizen")
    26. Dim idPerson As String = $"{notiz.SelectSingleNode("IDPerson").InnerText} {Environment.UserName}"
    27. Dim datum As String = notiz.SelectSingleNode("Datum").InnerText
    28. Dim headLine As String = notiz.SelectSingleNode("HeadLine").InnerText
    29. Dim message As String = notiz.SelectSingleNode("Message").InnerText
    30. stringBuilder.AppendLine($"ID: {idPerson} Datum: {datum}")
    31. stringBuilder.AppendLine($"Betreff: {headLine}")
    32. stringBuilder.AppendLine(message)
    33. stringBuilder.AppendLine($" ")
    34. ' Eintrag zur Liste hinzufügen
    35. 'entries.Add(stringBuilder.ToString().Trim())
    36. entries.Add(stringBuilder.ToString())
    37. stringBuilder.Clear()
    38. Next
    39. ' Druckvorgang initialisieren
    40. Dim printDoc As New PrintDocument()
    41. ' Seitenränder festlegen (in Hundertstel Zoll)
    42. printDoc.DefaultPageSettings.Margins.Left = 50
    43. printDoc.DefaultPageSettings.Margins.Right = 30
    44. printDoc.DefaultPageSettings.Margins.Top = 30
    45. printDoc.DefaultPageSettings.Margins.Bottom = 20
    46. AddHandler printDoc.PrintPage, AddressOf Me.PrintPageHandler
    47. ' Druckdialog anzeigen
    48. Dim printDialog As New PrintDialog()
    49. printDoc.DocumentName = LoSaInstance.Filename
    50. printDialog.Document = printDoc
    51. If printDialog.ShowDialog() = DialogResult.OK Then
    52. currentPageIndex = 0 ' Zurücksetzen der Seitenzählung
    53. currentEntryIndex = 0 ' Zurücksetzen des Eintragsindex
    54. printDoc.Print() ' Drucken initiieren
    55. End If
    56. End Sub
    57. Private Sub PrintPageHandler(sender As Object, e As PrintPageEventArgs)
    58. Dim startX As Single = e.MarginBounds.Left
    59. Dim startY As Single = e.MarginBounds.Top
    60. Dim lineHeight As Single = Me.Font.GetHeight(e.Graphics)
    61. Dim currentY As Single = startY
    62. ' Seitenüberschrift
    63. Dim headerText As String = $"Seitenüberschrift - Seite {currentPageIndex + 1}"
    64. Dim headerFont As New Font(Me.Font.FontFamily, 12, FontStyle.Bold)
    65. Dim headerBrush As New SolidBrush(Color.Gray)
    66. ' Zeichnen der Seitenüberschrift
    67. Dim headerSize As SizeF = e.Graphics.MeasureString(headerText, headerFont)
    68. Dim headerX As Single = startX + (e.MarginBounds.Width - headerSize.Width) / 2
    69. e.Graphics.DrawString(headerText, headerFont, headerBrush, headerX, currentY)
    70. currentY += headerSize.Height + lineHeight
    71. ' Text für diese Seite drucken
    72. Dim remainingLines As Integer = e.MarginBounds.Height \ CInt(lineHeight)
    73. Dim linesPrinted As Integer = 0
    74. While currentEntryIndex < entries.Count AndAlso linesPrinted < remainingLines
    75. Dim currentPageText As String = entries(currentEntryIndex)
    76. Dim lines() As String = SplitTextIntoLines(currentPageText, e.Graphics, e.MarginBounds.Width)
    77. For Each line As String In lines
    78. If linesPrinted < remainingLines Then
    79. Dim textSize As SizeF = e.Graphics.MeasureString(line, Me.Font)
    80. If currentY + textSize.Height <= e.MarginBounds.Bottom Then
    81. e.Graphics.DrawString(line, Me.Font, Brushes.Black, startX, currentY)
    82. currentY += textSize.Height
    83. linesPrinted += 1
    84. Else
    85. e.HasMorePages = True
    86. currentPageIndex += 1
    87. Return
    88. End If
    89. Else
    90. e.HasMorePages = True
    91. Return
    92. End If
    93. Next
    94. currentEntryIndex += 1
    95. End While
    96. ' Wenn alle Einträge gedruckt wurden
    97. If currentEntryIndex >= entries.Count Then
    98. e.HasMorePages = False
    99. End If
    100. End Sub
    101. Private Function SplitTextIntoLines(text As String, graphics As Graphics, maxWidth As Single) As String()
    102. Dim lines As New List(Of String)()
    103. Dim words() As String = text.Split(" "c)
    104. Dim currentLine As String = ""
    105. For Each word As String In words
    106. Dim testString As String = If(currentLine.Length = 0, word, $"{currentLine} {word}")
    107. Dim size As SizeF = graphics.MeasureString(testString, Me.Font)
    108. If size.Width <= maxWidth Then
    109. If currentLine.Length = 0 Then
    110. currentLine = word
    111. Else
    112. currentLine += " " & word
    113. End If
    114. Else
    115. lines.Add(currentLine)
    116. currentLine = word
    117. End If
    118. Next
    119. If currentLine.Length > 0 Then
    120. lines.Add(currentLine)
    121. End If
    122. Return lines.ToArray()
    123. End Function
    124. End Class

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @Amelie Poste so viel Code AndAlso Daten, dass ich Dein Druckbild reproduzieren kann.
    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!
    @Amelie Ich vermisse die Daten, die ich auf Deinem Print erkenne.
    Was ist

    VB.NET-Quellcode

    1. Private ReadOnly EnvAeraInstance As EnvironmentArea = EnvironmentArea.Instance
    2. Private WithEvents LoSaInstance As LoadSaveNotice = LoadSaveNotice.Instance
    ?
    Schreib da doch einfach Namen und Pfad hin, damit diejenigen, die Dir helfen wollen, es nicht so schwer haben.
    Was muss ich tun, dass ich Dein Druckbild reproduzieren kann?

    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!
    Ich hoffe das Ihr nun etwas damit anfangen könnt.
    Der Screenshoot zeigt das die Seitenumbrüche manchmal nicht so klappen wie es eigentlich sein soll.


    Vom Form rufe ich einfach mit einem Button das hier Public Sub PrintNotiz() in der Klasse auf, zum Drucken.

    Der Pfad zu den XML-Dateien ist eigentlich völlig egal.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. ' Ausgewähltes Datum für den Dateinamen der XML / Beispiel: 06-2024notizen.xml
    2. Public SelectedDate As DateTime = New DateTime(DateTime.Now.Year, DateTime.Now.Month, 1)
    3. ' Dateiname, der auf dem ausgewählten Datum basiert
    4. Public ReadOnly Filename As String = SelectedDate.ToString("MM-yyyy") & "notizen.xml"
    5. ' Verzeichnis für App-Daten wo die ganzen XML-Dateien bei mir liegen
    6. AppDataDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), DataFolder)
    7. ' Basisverzeichnis für die XML-Datei
    8. Public Xmlfilepath As String = Path.Combine(EnvAeraInstance.AppDataDirectory)


    Das XML File mit zur Zeit 20 Test Einträgen

    XML-Quellcode

    1. <?xml version="1.0" standalone="yes"?>
    2. <dsHealth>
    3. <Notizen>
    4. <IDPerson>1</IDPerson>
    5. <Datum>16.06.2024</Datum>
    6. <HeadLine>Löschen Ja/Nein</HeadLine>
    7. <Message>Mit dieser Änderung wird eine MessageBox angezeigt, die den Benutzer fragt, ob er den aktuellen Eintrag wirklich löschen möchte. Wenn der Benutzer auf "Ja" klickt, wird der Eintrag gelöscht, andernfalls bleibt der Eintrag bestehen.</Message>
    8. </Notizen>
    9. ...
    10. .....
    11. <Notizen>
    12. <IDPerson>19</IDPerson>
    13. <Datum>16.06.2024</Datum>
    14. <HeadLine>Eintrag 19</HeadLine>
    15. <Message>On the other hand, we denounce with righteous indignation and dislike men who are so beguiled and demoralized by the charms of pleasure of the moment, so blinded by desire, that they cannot foresee the pain and trouble that are bound to ensue; and equal blame belongs to those who fail in their duty </Message>
    16. </Notizen>
    17. <Notizen>
    18. <IDPerson>20</IDPerson>
    19. <Datum>16.06.2024</Datum>
    20. <HeadLine>Eintrag 20</HeadLine>
    21. <Message>On the other hand, we denounce with righteous indignation and dislike men who are so beguiled and demoralized by the charms of pleasure of the moment, so blinded by desire, that they cannot foresee the pain and trouble that are bound to ensue; and equal blame belongs to those who fail in their duty </Message>
    22. </Notizen>
    23. </dsHealth>

    Bilder
    • druck-1.jpg

      453,44 kB, 893×721, 136 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Der Screenshoot zeigt das die Seitenumbrüche manchmal nicht so klappen wie es eigentlich sein soll.
    Ich nehme mal an, dass Du möchtest, dass beim Seitenumbruch der erste Teil auf der vorigen, der zweite Teil auf der nächsten Seite erscheint, dass es also keinen Doppeldruck gibt.
    Füge Deiner List(Of String) entries keinen StringBuilder.ToString() hinzu, sondern die Zeilen selbst, denn
    StringBuilder.ToString() ist ein Mehrzeiler!
    Eventuell musst Du an dieser Stelle

    VB.NET-Quellcode

    1. Dim message As String = notiz.SelectSingleNode("Message").InnerText
    noch zerlegen, das musst Du ausprobieren.
    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!
    @RodFromGermany

    Irgendwie will das mit der Druckvorschau nicht funktionieren.
    TestDrucken.zip ist ohne "bin/obj" ;)

    Folgendes Problem:

    Ich rufe die Druckvorschau auf und klicke dort auf das "Druckersymbol" (siehe Bild). Dann wird zwar gedruckt ABER die Druckvorschau schlisst sich nicht.

    Habe es schon mit ​PrintDocDgv_EndPrint aber ohne Erfolg.


    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing.Printing
    2. Public Class FrmTestPrint
    3. Private rowIndex As Integer = 0
    4. Public Sub New()
    5. InitializeComponent()
    6. End Sub
    7. Private Sub FrmTestPrint_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    8. ' Beispiel-Daten für das DataGridView laden
    9. DataGridView1.Rows.Add("Produkt 1", 10, 100)
    10. DataGridView1.Rows.Add("Produkt 2", 5, 50)
    11. DataGridView1.Rows.Add("Produkt 3", 8, 80)
    12. End Sub
    13. Private Sub BtnPrintPreview_Click(sender As Object, e As EventArgs) Handles BtnPrintPreview.Click
    14. ShowPrintPreview()
    15. End Sub
    16. Private Sub BtnPrint_Click(sender As Object, e As EventArgs) Handles BtnPrint.Click
    17. PrintDataGrid()
    18. End Sub
    19. Private Sub PrintDocDgv_PrintPage(sender As Object, e As PrintPageEventArgs) Handles PrintDocDgv.PrintPage
    20. ' Logik zum Zeichnen des DataGridView-Inhalts auf die Druckseite
    21. Dim dgv As DataGridView = DataGridView1
    22. Dim g As Graphics = e.Graphics
    23. Dim rect As RectangleF
    24. Dim startX As Single = e.MarginBounds.Left
    25. Dim startY As Single = e.MarginBounds.Top
    26. Dim cellHeight As Integer = 0
    27. Dim columnIndex As Integer = 0
    28. ' Zeichne die Kopfzeile des DataGridViews
    29. For Each column As DataGridViewColumn In dgv.Columns
    30. rect = New RectangleF(startX, startY, column.Width, dgv.ColumnHeadersHeight)
    31. g.FillRectangle(Brushes.LightGray, rect)
    32. g.DrawRectangle(Pens.Black, rect.X, rect.Y, rect.Width, rect.Height)
    33. g.DrawString(column.HeaderText, dgv.Font, Brushes.Black, rect, New StringFormat())
    34. startX += rect.Width
    35. Next
    36. startY += dgv.ColumnHeadersHeight
    37. ' Zeichne die Zeilen des DataGridViews
    38. While rowIndex < dgv.Rows.Count
    39. Dim row As DataGridViewRow = dgv.Rows(rowIndex)
    40. startX = e.MarginBounds.Left
    41. For Each cell As DataGridViewCell In row.Cells
    42. rect = New RectangleF(startX, startY, cell.OwningColumn.Width, cell.Size.Height)
    43. g.DrawRectangle(Pens.Black, rect.X, rect.Y, rect.Width, rect.Height)
    44. g.DrawString(cell.FormattedValue.ToString(), dgv.Font, Brushes.Black, rect, New StringFormat())
    45. startX += rect.Width
    46. Next
    47. cellHeight = row.Height
    48. startY += cellHeight
    49. If startY + cellHeight > e.MarginBounds.Bottom Then
    50. e.HasMorePages = True
    51. rowIndex += 1
    52. Return
    53. End If
    54. rowIndex += 1
    55. End While
    56. rowIndex = 0
    57. e.HasMorePages = False
    58. End Sub
    59. Private Sub PrintDataGrid()
    60. PrintDialogDGV.Document = PrintDocDgv
    61. If PrintDialogDGV.ShowDialog() = DialogResult.OK Then
    62. PrintDocDgv.Print()
    63. End If
    64. End Sub
    65. Private Sub ShowPrintPreview()
    66. PrintDocDgv.DocumentName = "TestDGV"
    67. AddHandler PrintDocDgv.PrintPage, AddressOf PrintDocDgv_PrintPage
    68. PrintPreviewDialog.Document = PrintDocDgv
    69. If PrintPreviewDialog.ShowDialog() = DialogResult.OK Then
    70. PrintPreviewDialog.Close()
    71. End If
    72. End Sub
    73. Private Sub PrintDocDgv_EndPrint(sender As Object, e As PrintEventArgs) Handles PrintDocDgv.EndPrint
    74. Debug.WriteLine($"Im EndPrint")
    75. PrintPreviewDialog.Close()
    76. End Sub
    77. End Class

    Bilder
    • druck-2.jpg

      84,06 kB, 605×316, 51 mal angesehen
    Dateien
    • TestDrucken.zip

      (428,38 kB, 126 mal heruntergeladen, zuletzt: )
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Ich glaube, dass Du den PrintPreviewDialog (PPD) nicht verstanden hast. Der Standardablauf ist: Zuweisung des PrintDocuments an den PPD, bevorzugt über den Designer, nicht über den Code und dann einfach PPD.ShowDialog(Me). Sonst nichts mehr! Kein PrintDocument.Print, kein AddHandler oder sonstewas. Der PPD kümmert sich um das Drucken, sobald Du dort den Druck-Button anklickst. Der PPD ruft automatisch PrintDocument.Print auf. Und er schließt sich nicht automatisch, wenn gedruckt wurde, weil man als User das PrintDocument ggf. noch anders drucken will. Wenn man das alles nicht will, sondern einen automatischen Druck will, mach ich es während der Entwicklung des Programms so, dass ich den PPD verwende und den Druck anpasse und wenn die Druckcodeanweisungen im PrintDocument-PrintPage-EventHandler so sind, wie gewünscht, werfe ich den PPD weg und nutze für den Sofortdruck per PrintDialog.Print
    Im EndPrint-EventHandler darfst Du den PPD nicht schließen, weil der PPD die Druckdaten durch Aufruf von PrintDocument.Print nutzt, um die Vorschau zu erstellen. Und da durch PrintDocument.Print das PrintDocument seine Events wie BeginPrint, PrintPage und EndPrint auslöst, …
    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.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    @VaporiZed

    Ich glaube Du hast Recht. Habe das mit der "Druckvorschau" wohl falsch verstanden / interpretiert.
    Dann kann ich ja den Druckbereich in dem eigentlichen Programm so lassen wie ich ihn habe. :)

    Aber dazu noch eine Frage:
    Im Moment ist es so, wenn ich das Form mit dem DGV (DocStyle:Fill) größer ziehe wird es später im Druck auch größer.
    Muss ich da echt erst alles von Hand berechnen, damit das keine Auswirkungen auf den Druck hat :?: :S
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Warum sollte überhaupt das DGV so gedruckt werden, wie es aussieht? Bei mir das das GUI nichts mit dem Druck zu tun. Die Daten werden bei mir zwar in GUI und Druck dargestellt. Aber Monitor und Drucker/Papier sind zwei unterschiedliche Ausgabemedien, die unabhängig voneinander sein sollten. Das ist auch der Punkt mit der temporären PPD-Einbindung bei mir. Damit kann ich den Druckcode solange anpassen, bis die Vorschau meinen Wünschen entspricht. Aber die DGV/Tabellendarstellung in der App hat bei mir damit nix zu tun, weil oft Infos oder grafische Besonderheiten dabei sind, die ich entweder auf dem Monitor oder auf dem Druck nicht haben will.
    Wenn Du aber das DGV drucken willst, hast Du mehrere undschöne Möglichkeiten:
    • DockStyle.Fill rausnehmen
    • Screenshot machen und das Bild skalieren
    • alles selber berechnen und malen
    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.
    @DTF
    Das [tt]​DrawToBitmap[/tt hatte ich in der Tat schon mal kurz ausprobiert aber dann verworfen, weil mir das noch zu viel war.
    Wenn das Projekt hier erstamlö soweit fertig ist, werde ich mich damit nochmal befassen.

    @VaporiZed
    Blöde Frage: Wie kommst du dann an die Daten?
    Aus einer Datenbank, Bindinsource oder???
    Ich habe einige Daten ja ohne sowas, einfach nur simple XML-Dateien.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Wie kommst du dann an die Daten? […] Ich habe einige Daten […], einfach nur simple XML-Dateien.
    Ja gut, aber die XML-Datei muss ja auch irgendwie verarbeitet werden, bevor es weitergeht. Ich packe Rohdaten immer erst in geeignete Daten-Klasseninstanzen, nie in Controls direkt. Einfach weil ich weiß, dass irgendwann der Zeitpunkt kommt, an dem ich die Daten anderweitig brauche.
    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.