VB.NET RICHTEXTBOX Formatierung (mit Leerzeichen auffüllen)

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

Es gibt 38 Antworten in diesem Thema. Der letzte Beitrag () ist von jnpanzer.

    VB.NET RICHTEXTBOX Formatierung (mit Leerzeichen auffüllen)

    Hallo.

    Ich habe ien kleines Problem wo ich nicht wirklich weiter komme.
    In der RICHTEXTBOX möcht ich den Text pro Zeile zentrieren.
    Leider setzt der Befehl keine Leerzeichen.

    VB.NET-Quellcode

    1. RichTextBox1.SelectionAlignment = HorizontalAlignment.Center


    Deshalb müsste ich da was selbst basteln.
    Ich müsste Leerzeichen Links vom Text einfügen.

    Beispiel (Sternchen Symbolisiert die Leerzeichen)

    **********HELLO WORLD
    ******DAS MUSS JETZT ABER
    ************KLAPPEN

    VB.NET-Quellcode

    1. Dim xy As Integer = 0
    2. Dim xy1 As Integer = 0
    3. Dim EINLESE_TXT As String ""
    4. Dim INSERT_TXT As String =""
    5. Dim WS As String = ""
    6. ' Anzahl Zeichen in der ersten Zeile
    7. xy = rt_nachricht.Lines(1).Length
    8. 'Anzahl der Leerzeichen berechnen Länge des Text- Zeilenlänge geteilt durch zwei
    9. xy1 = CInt((29 - xy) / 2)
    10. 'Schleife um die Leerzeichen einzufügen
    11. For xy1 = 1 To xy1
    12. WS = WS & " "
    13. Next
    14. ' Text der Zeile 1 auslesen
    15. EINLESE_TXT = rt_nachricht.Lines(0)
    16. ' Text mit Leerzeichen zusammenfügen
    17. INSERT_TXT = WS & "" & EINLESE_TXT
    18. 'löschem der ersten Zeile in der RTCHTEXTBOX
    19. rt_nachricht.Text = rt_nachricht.Text.Remove(0, rt_nachricht.Lines(0).Length)
    20. 'Text wieder in die Zeile einfügen
    21. rt_nachricht.Text = rt_nachricht.Text.Insert(0, INSERT_TXT)


    Ich bekomme das hin für Zeile1 aber für die Zeile2 usw. nicht hin, oder gibt es eine elegante Lösung?

    Wäre für Jede Hilfe Dankbar.

    Gruß
    Jürgen
    Bilder
    • Unbenannt.PNG

      16,04 kB, 235×210, 562 mal angesehen

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

    Nein, das klappt nicht, weil Schriftzeichenbreiten schriftartabhängig sind. Würde man die Schriftart ändern, würde ein schön* zentrierter Text unmöglich aussehen.

    * Da ein Stern eine fixe Breite hat, ist auch damit ein sauberes Zentrieren gar nicht möglich.
    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.
    Leider ist das nicht richtig. Ich nutze eine Schriftart (z.B. Courier New) wo jede Zeichen gleich groß ist, sei es ein Komma oder ein Buchstabe.
    Es hat einen Grund das ich das machen will.
    Der Kassendrucker hat eine feste Breite von 29 Zeichen. Das ist leider nicht mein Problem,
    ich will jede Zeile in der Richtextbox mittig setzen. Dazu benötige ich auch die Leerzeichen.
    Es hat schon einen Grund warum ich das so umsetzen möchte.
    Verstehe ich das Problem richtig?: Bei allen Zeilen soll das mittlere Zeichen auf dieselbe Position zu liegen kommen?
    Kann doch nicht so schwer sein.
    Schreib dir eine Methode die das tut: Input ist die Position, an die ausgerichtet werden soll, sowie der auszurichtende Text.
    Rückgabewert ist der ausgerichtete Text.

    So verlorene Zeilen wie in post#1, ohne Anfang und Ende - so kann man nix brauchbares entwickeln.

    jnpanzer schrieb:

    Leider setzt der Befehl keine Leerzeichen.
    Was sollen die Leerzeichen in diesem Kontext?
    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!
    Ach, Du benutzt ne Monospace-Font. Gut zu wissen.
    Dein Code kommt mir an einer Stelle auf Anhieb komisch vor:

    VB.NET-Quellcode

    1. For xy1 = 1 To xy1
    2. WS = WS & " "
    3. Next

    Doppeltes xy1? Kann nicht sein. Das ergäbe immer einen Schleifendurchlauf, wenn xy1 = 1, sonst gar keinen. Außerdem setzt Du die Leerzeichen hinten dran. Wolltest Du die nicht vorne haben? Man möge auch in Morgenstunden bitte aufmerksam lesen :S . Deine Leerstring-Stringerstellung ist etwas holprig. Dafür gäbe es Dim WS = New String(" "c, Anzahl)

    ##########

    Ok, ich sehe, da gab's was zum Dazulernen: Der Name einer äußeren Variable kann auch als Schleifenvariablenname verwendet werden und der Compiler kann trotzdem unterscheiden. Im Debugger tut man sich dann zwar schwer und für das Codeverständnis ist es auch nicht förderlich, aber bitte. Ich sehe ein, dass dieser Post hier damit größtenteils Unsinn ist.
    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 2 mal editiert, zuletzt von „VaporiZed“ ()

    PadreSperanza schrieb:

    ich hätte es auch so gemacht, wie du es beschrieben hast. Aber hast du eine WPF oder eine WinForms RTB?


    Ich nutze WinForm




    RodFromGermany schrieb:

    jnpanzer schrieb:

    Leider setzt der Befehl keine Leerzeichen.
    Was sollen die Leerzeichen in diesem Kontext?


    Ich meinte dieser Befehl setzt den Text auf mittig aber ohne Leerzeichen

    VB.NET-Quellcode

    1. RichTextBox1.SelectionAlignment = HorizontalAlignment.Center
    Hi panzer hilft das....
    Schriftart ist Courier New

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim frm As String = "Sitz: {0} Preis: {1} Euro"
    3. Dim myDate As Date
    4. myDate = Date.Today
    5. With RichTextBox1
    6. .SelectionStart = 0
    7. .SelectionAlignment = HorizontalAlignment.Center
    8. .AppendText("Kino 2" & System.Environment.NewLine)
    9. .AppendText("Ice Age 2" & System.Environment.NewLine)
    10. .AppendText("Abend Vorstellung 22:00" & System.Environment.NewLine)
    11. .AppendText("Datum: " & myDate & System.Environment.NewLine)
    12. .AppendText("---------------------------------" & System.Environment.NewLine)
    13. .AppendText(String.Format(frm, ("2a").ToString.PadLeft(1), (4.0).ToString.PadLeft(2)) & System.Environment.NewLine)
    14. .AppendText(String.Format(frm, ("3a").ToString.PadLeft(1), (4.0).ToString.PadLeft(2)) & System.Environment.NewLine)
    15. .AppendText(String.Format(frm, ("4a").ToString.PadLeft(1), (5.0).ToString.PadLeft(2)) & System.Environment.NewLine)
    16. End With
    17. End Sub


    sieht so dann aus

    jnpanzer schrieb:

    Ich meinte dieser Befehl setzt den Text auf mittig aber ohne Leerzeichen
    Korrekt.
    Frage nicht beantwortet:

    RodFromGermany schrieb:

    Was also sollen die Leerzeichen in diesem Kontext?

    Schreib mal ein Word-Dokument und zentriere den Text (*.doc, *.docx"),
    Schreib mal ein WordPad-Dokument und zentriere den Text (*.rtf).
    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!
    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Hi RodFromGermany,

    Ich will aus der RICHTEXTBOX Zeile für Zeile auslesen und eien XML Datei erstellen.
    Der Zentrierte Text ist nach den Auslesen wieder Linksbündig, deshalb muss ich dies mit Leerzeichen auffüllen.
    Jede Zeile in der RICHTEXTBOX ist eine eigner XML Tag, dieser wird dann über IP an ein Kassenystem geschickt.
    Bis dahin läuft alles, es soll auch noch vordefinierte Texte geben aus einer DB die in die RICHTEXTBOX eingetragen werden, das ist abe rmein Hobby über Weihnachten.

    Durch deinen Hinweis gestern Nacht, habe ich mir gedacht das ich eigentlich Dumm anstelle.
    Ich habe auch schon das soweitgeändert das ich jetzt die Leerzeichen nach den Auslesen der RICHTEXTBOX in die XML einfüge. Nicht wie zuvor in der RICHTEXTBOX.

    Das klappt Leider nicht so ganz, da Ich Zeile 1 Zentriere die Zeile 2 und 3 Linksbündig und Zeile 4 wieder Zentriert.
    Ich habe es noch nicht geschafft es zu ermitteln ob eine Zeile zentriert ist oder nicht für das Einfügen der Leerzeichen.
    Er macht das immer nur für die gesammte RICHTEXTBOX Zentriert oder Linksbünding.

    Nun versuche ich den Tipp von Erfinder des Rades mit den Start und Ende zu ermitteln.

    Ich muss auch zugesthen ich bin eine Laie in VB und hab noch nie mit einer RICHTEXTBOX gearbeitet.
    Es macht mir nur Spass zu tüfteln aber nicht zu verzweifeln. :)
    Danke für eurer Unterstützung.

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

    jnpanzer schrieb:

    Der Zentrierte Text ist nach den Auslesen wieder Linksbündig,
    Den Code, der das macht, postest Du bitte mal, nachdem Du Dich davon überzeugt hast, dass es so ist.
    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!
    Also mal alles zusammengeschriben


    Siehe Unbenannt1.PNG Bild meine Eingabe
    Sie KASSENMAIL.XML mit Notepad ++ die Leerzeichen werden auch übertragen an die Kasse ==> alles so wie es haben will

    Code mit mit Leerzeichen Auffüllen

    VB.NET-Quellcode

    1. Dim xw As XmlTextWriter = New XmlTextWriter("C:\temp\kassenmail_TS.xml", Encoding.GetEncoding("ISO-8859-1"))
    2. Dim xy As Integer = 0
    3. Dim xy1 As Integer = 0
    4. Dim EINLESE_TXT As String = ""
    5. Dim INSERT_TXT As String = ""
    6. Dim ws As String = ""
    7. xw.WriteStartDocument()
    8. xw.WriteStartElement("Root")
    9. Dim x1 As Integer = rt_nachricht.Lines.Length
    10. Dim z1 As Integer = 0
    11. ' Schleife für die Textline zu füllen
    12. For x1 = 1 To x1
    13. EINLESE_TXT = ""
    14. INSERT_TXT = ""
    15. xy = 0
    16. xy1 = 0
    17. ws = ""
    18. ' Hier will ich prüfen ob die Zeile Mittig ist, Leider gilt das für die ganze RICHTEXTBOX
    19. If (rt_nachricht.SelectionAlignment = HorizontalAlignment.Left) Then
    20. EINLESE_TXT = rt_nachricht.Lines(z1)
    21. INSERT_TXT = EINLESE_TXT
    22. Else
    23. xy = rt_nachricht.Lines(z1).Length ' Anzahl Zeichen
    24. 'Anzahl der leerzeichen
    25. xy1 = CInt((39 - xy) / 2)
    26. For xy1 = 1 To xy1
    27. ws &= " "
    28. Next
    29. EINLESE_TXT = rt_nachricht.Lines(z1)
    30. INSERT_TXT = WS & "" & EINLESE_TXT
    31. End If
    32. xw.WriteElementString("TextLine", INSERT_TXT)
    33. z1 += 1
    34. Next
    35. xw.WriteEndElement()
    36. xw.Close()



    Mit den Zeile will ich prüfen ob die Zeile Zentriert ist oder LInksbündig

    VB.NET-Quellcode

    1. If (rt_nachricht.SelectionAlignment = HorizontalAlignment.Left) Then


    Das ist ds Ergebnis wenn man die 1. Zeile Zentriert

    Leider werden jedesmal nach den Einfügen uns speicher in diesen Forum die Leer zeichen gelösch also wieder mit Sternchen (als Lerrzeichen)

    XML-Quellcode

    1. <?xml version="1.0" encoding="iso-8859-1"?>
    2. <Root>
    3. <TextLine>*****************2345t6z7u8i9o</TextLine>
    4. <TextLine>***************34567u8i9o</TextLine>
    5. <TextLine>****************3456z7u8iop</TextLine>
    6. </Root>




    Hier der Codemit den habe ich die TextZeile mittig gesetzt.

    VB.NET-Quellcode

    1. rt_nachricht.SelectionAlignment = HorizontalAlignment.Center


    Hier ohne Leerzeichen mal der Code den ich zuerst hatte Kann auch die xml schicken

    VB.NET-Quellcode

    1. Dim xw As XmlTextWriter = New XmlTextWriter("C:\temp\kassenmail_TS.xml", Encoding.GetEncoding("ISO-8859-1"))
    2. Dim EINLESE_TXT As String = ""
    3. Dim INSERT_TXT As String = ""
    4. Dim ws As String = ""
    5. xw.WriteStartDocument()
    6. xw.WriteStartElement("Root")
    7. Dim x1 As Integer = rt_nachricht.Lines.Length
    8. Dim z1 As Integer = 0
    9. ' Schleife für die Textline zu füllen
    10. For x1 = 1 To x1
    11. EINLESE_TXT = ""
    12. EINLESE_TXT = rt_nachricht.Lines(z1)
    13. xw.WriteElementString("TextLine", EINLESE_TXT)
    14. z1 += 1
    15. Next
    16. xw.WriteEndElement()
    17. xw.Close()


    Ergebniss ohne Leerzeichen obwohl ich mittlere Zeile Zentriert habe es wird nicht übernommen

    XML-Quellcode

    1. <?xml version="1.0" encoding="iso-8859-1"?>
    2. <Root>
    3. <TextLine>2342w345rt6z7u8i9o</TextLine>
    4. <TextLine>w34r5t6zu</TextLine>
    5. <TextLine>56tz7u8i9o0pßü</TextLine>
    6. </Root>


    Code-Tags für XML hinzugefügt ~EaranMaleasi
    Bilder
    • Unbenannt1.PNG

      10 kB, 529×470, 55 mal angesehen
    Dateien
    • kassenmail_TS.xml

      (204 Byte, 465 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „EaranMaleasi“ ()

    Jo, Xml ignoriert Spaces in TextNodes.
    Du kannst versuchen, deine Texte stattdessen als XmlAttribut zu persistieren, also dass sowas rauskommt:

    XML-Quellcode

    1. <?xml version="1.0" encoding="iso-8859-1"?>
    2. <Root>
    3. <TextLine Text=" 2345t6z7u8i9o"/>
    4. <TextLine Text=" 34567u8i9o"/>
    5. <TextLine Text=" 3456z7u8iop"/>
    6. </Root>

    Ich werf mich da auch noch kurz rein.

    Ich hätte das so irgendwie gemacht. Das Xml, dient jedoch nur rein Informativ, und es würde nichts bringen das in ein XmlDocument einzufügen. Die Umwandlung in den korrekten Text müsste man programmiertechnisch umsetzen.
    Genau gleich auch das Auslesen der RTF zu Xml.

    XML-Quellcode

    1. <?xml version="1.0" encoding="iso-8859-1"?>
    2. <Root>
    3. <TextLine>
    4. <Text>LineText1</Text>
    5. <AnzahlLeerzeichen>8</AnzahlLeerzeichen>
    6. </TextLine>
    7. <TextLine>
    8. <Text>LineText2</Text>
    9. <AnzahlLeerzeichen>10</AnzahlLeerzeichen>
    10. </TextLine>
    11. <TextLine>
    12. <Text>LineText3</Text>
    13. <AnzahlLeerzeichen>5</AnzahlLeerzeichen>
    14. </TextLine>
    15. </Root>


    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    @jnpanzer Meinst Du nicht auch, dass es besser ist, die Leerzeichen wegzulassen und Dich auf die zentrierte Darstellung zu kümmern?
    Hast Du bei Deinem Unbenannt1.PNG der RTB gesagt, dass sie den Text zentriert darstellen soll :?:
    Offensichtlich nicht.
    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!
    Hi @RodFromGermany,

    Ich habe über den Zeile der RTB gesagt das er es zentrieren soll.
    Zeile Markiert und Zentriert Button gedrückt.

    Das ist der Code des Button Text Zentrieren, oder mache ich da was verkehrt ?
    Ist ja nur eine Kommando.

    VB.NET-Quellcode

    1. rt_nachricht.SelectionAlignment = HorizontalAlignment.Center


    Aber ...
    Ich bin aber jetzt schon weiter, der "ErfinderdesRades" hat mir geschrieben, das bei einem "XML Element" die Zentrierung immer gelöscht wird, und mir geraten auf "XML Attribute" umzustellen.
    Das wusste ich nicht, und er hat natürlich recht.
    Ich bin dabe gerade dabei auf Attribute im XML Tag umzustellen, wir dauern da ich mich erst da einlesen muss wie es geht.
    Sein Tutorial ist aber ziemlich gut Erklärt.

    Wenn ich das gemacht habe brauch ich keine Leerzeichen mehr. :)

    Es geht voran mit kleine Schritten ... mit ganz kleine ..
    Ich komme erst mal weiter Danke für euere Hilfe
    Ich muss erst mal euere Ratschläge und Tipps umsetzten.

    Gruß
    Jürgen

    Nachtrag
    XML Attribut geht nicht ...

    Vollzitat entfernt ~ EaranMaleasi

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „EaranMaleasi“ ()

    @ErfinderDesRades
    Habe es mir noch mal genau angsehen
    das mit den Attributen kappt nicht, Das Übergabeprogramm frisst keine XML Attribute bei der TextLine
    Also wieder meine Leerzeichen ....

    Hat jemand einen Tipp für mich wie ich pro Zeile in RTB herausbekomme ob die Zeile Zentriert ist?

    Vollzitat entfernt ~EaranMaleasi

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