VB.NET RICHTEXTBOX Zeilenumbruch

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Kasi.

    VB.NET RICHTEXTBOX Zeilenumbruch

    Meine RTB hat eine feste breite von 39.
    Wenn ich die Box Fülle macht diese einen Zeilenumbruch (ohne LF).
    Dies ist alles so gewollt. (Siehe Bild)

    Bei der Weiterverarbeitung darf man aber pro Zeile die 39 Zeichen nicht überschreiten, deshalb muss ich einen LF noch einfügen.
    Ich habe einen harten LF schon gebaut (Siehe unten). Das Problem ist das ich mitten im Wort trenne nach 39 Zeichen und nicht das ganze Wort so wie in RTB Box behält. Ich möchte das so wie in der RTB haben."

    VB.NET-Quellcode

    1. Dim zeile0 As String = rt_nachricht.Lines(0)
    2. MsgBox(zeile0)



    LF nach 39 Zeichen

    VB.NET-Quellcode

    1. Dim txt As String = rt_nachricht.Text
    2. Dim zeichenanzahl As Integer = txt.Length - 1
    3. Dim y As Integer = 39
    4. 'nach 39 Zeichen LF setzten
    5. For i = 0 To zeichenanzahl
    6. If i = y Then
    7. txt = txt.Insert(y, Environment.NewLine)
    8. y += 39
    9. End If
    10. Next
    11. rt_nachricht.Text = txt


    Ich bekomme es nicht hin und würde Hilfe benötigen, wie man so etwas bewerkstelligt.
    Bilder
    • 26122020.PNG

      8,39 kB, 424×409, 53 mal angesehen

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

    Ich verstehe nicht. Ich habe mir eine RTB auf's Form gehauen, den Text etwas erweitert und dann den gezeigten Code ausgeführt. Er schneidet nach genau 39 Zeichen. Auch mit dem Originaltext schneidet er nach genau 39 Zeichen.

    btw: Was genau heißt:

    jnpanzer schrieb:

    Das Problem ist das er mitten im Wort trennt nicht nach 39 Zeichen.
    Wenn nun am Ende ein sehr langes Wort auftritt, was soll dann nicht geschehen? Dass das Wort zerrissen wird oder dass die 39 Zeichen pro Zeile nicht eingehalten werden? Das geht nicht aus der von mir zitierten Problembeschreibung hervor.
    Bilder
    • RTB1 davor.png

      1,01 kB, 354×90, 54 mal angesehen
    • RTB1 danach.png

      1,38 kB, 365×96, 51 mal angesehen
    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“ ()

    @jnpanzer Welche Properties hast Du Deiner RTB im Designer gegeben?
    Poste Deine Form und den Designer-Code.
    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!
    @VaprioZed
    Ich hate das verkehrt formuliert danke für den Hinweis.
    Es soll natürlich heissen, "-..das er mitten im Wort Trennt nach 39 Zeichen und nicht das ganze Wort so wie in RTB Box behält. Ich möchte das so wie in der RTB haben."

    @VRodFromGermany
    Habe schon viele Variationen probiert ...

    VB.NET-Quellcode

    1. rt_nachricht.Multiline = True
    2. rt_nachricht.WordWrap = True
    3. 'rt_nachricht.RightMargin = 300
    4. rt_nachricht.AutoWordSelection = False

    Bilder
    • rt1t.PNG

      29,83 kB, 403×801, 50 mal angesehen
    • rt2PNG.PNG

      22,58 kB, 386×716, 46 mal angesehen

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

    @jnpanzer Was genau willst Du erreichen?
    Was soll dabei nicht passieren?
    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!
    Beispieltext von bavaria-ipsum.de/ 8-)

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Main()
    3. Dim TXT As String = "Bavaria ipsum dolor sit amet gscheit da Resi Obazda hawadere midananda trihöleridi dijidiholleri um Godds wujn, ma. Di i moan scho aa jo mei is des schee, Gaudi! Schmankal Brezn Schneid, sodala. Nia Freibia gar nia need obacht und Jodler eana mogsd a Bussal i moan oiwei di is. Da i hob di narrisch gean obacht do Obazda, Maibam wea nia ausgähd, kummt nia hoam i sog ja nix, i red ja bloß Freibia Milli wea nia ausgähd, kummt nia hoam."
    4. Dim zeichenanzahl As Integer = TXT.Length
    5. Dim y As Integer = 39
    6. Dim zulang As Boolean
    7. Dim p As Integer, T2 As String = ""
    8. 'nach 39 Zeichen LF setzten
    9. zulang = (zeichenanzahl > y)
    10. While zulang
    11. p = TXT.LastIndexOf(" ", y - 1)
    12. If p = 0 Then p = y
    13. T2 = T2 & TXT.Substring(0, p) & Environment.NewLine
    14. TXT = TXT.Substring(p + 1)
    15. zulang = (TXT.Length > y)
    16. End While
    17. TXT = T2 & TXT : T2 = ""
    18. Debug.Print(TXT)
    19. MsgBox(TXT)
    20. End Sub
    21. End Module
    Ich möchte eine Nachricht verfassen mit der maximalen Zeilenlänge 39.
    Die line 0 z. bricht sich nach der 39 Stelle um. Aber ohne LF. Erst mit der Enter Taste habe ich einen LF, dann beginnt die line 1 usw.

    Es soll das Wort wie in der RTB wenn das Wort länger ist umgebrochen werden in die neue Zeile und dies als Line 1 erkannt werden.
    Ich setzte jetzt an der 39 Stelle in der Zeile einen LF.
    Leider mache ich auch das mitten im Text. Das gefällt mir nicht, deshalb möchte ich das ändern, so das der user seinen Text einfach schreiben kann.

    Meine idee war das ich herausbekomme wann die RTB der Line 0 umgebrochen wird und dort ein LF setze.

    Dieser Punkt läuft schon. (Ich will das auch beibehalten)
    Ich übergebe den Text Zeilenweise in eine XML Datei wo eine Zeile der RTB ein xml Tag ist.
    Es darf der Tag aber nicht länger wie 39 Zeichen sein.
    Ich lese das Zeilenweise aus der RTB Box aus.

    Da
    ich nun seit 1 Woche da dran bin und es nicht hinbekommen, mein Wissen
    reicht hier hinten und vorne nicht aus, wäre Super, wenn mir jemand
    helfen kann.

    Das VB.NET (basteln) ist eher als Hobby von mir das macht mir Spaß was zu schreiben, aber die RTB bringt mich an meine Grenzen.
    @jnpanzer Hier meine Lösung (Achtung C#; im zweiten Fenster dann die konvertierte Version nach Vb.net via telerik OnlineKonverter ohne Haftung ;))

    Ich hab meine Lösung hier "mal eben" aus Lust und Spaß erstellt. Keine Frage, dass geht bestimmt noch besser, sicherer etc.! Bitte nur als Gedankenanstoß sehen.

    Eine Anmerkung, Du sagst das Du das aus Hobby Gründen machst. Okay, ich hoffe das stimmt, da irgendwo das Wort Kassennachricht auftaucht und dazu noch der Drucker ein TM88 Bondrucker zu sein scheint (InternetSherlock Ende). Überdenk das nochmal siehe auch den TSE Thread hier im Forum oder google TSE etc. Im Bereich Kassenführung ist Schluss mit Hobby (ich meine das freundlich :thumbup: ).

    C#
    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Text.RegularExpressions;
    3. using System.Windows.Forms;
    4. namespace WF_LineBreakAfter39Char
    5. {
    6. public partial class Form1 : Form
    7. {
    8. string InputText = "Dies ist ein Test, in der Rtxbx wird der Text eingegeben " +
    9. "und später in der Msgbx soll die Formatierung weiterhin bestehen bleiben. " +
    10. "Regeln max 39 Char pro Zeile und kein Wortumbruch!";
    11. string FormattedOutputText = "";
    12. public Form1()
    13. {
    14. InitializeComponent();
    15. CenterToParent();
    16. RtxbxShow.Text = InputText;
    17. }
    18. private void BtnMsgbx_Click(object sender, EventArgs e)
    19. {
    20. //Regex Matches findet alle Worte inkl. der Satzzeichen Sonderumlaute etc.
    21. //wie angegeben und erstellt eine Liste der Worte
    22. //Achtung! Anpassen auf Deine Bedürfnisse siehe https://regexr.com
    23. var WordList = Regex.Matches(InputText, @"[\wäöüÄÖÜß,\.;!\?@€%&\(\)]+");
    24. string ZeileMax39 = "";
    25. int i = 0;
    26. while (i < WordList.Count)
    27. {
    28. //so lange die Zeichenanzahl pro Zeile plus das "neue" Wort unter 40 Z. lang
    29. //sind addiere ein Wort dazu
    30. while (i < WordList.Count && (ZeileMax39.Length + WordList[i].Length) < 40)
    31. {
    32. //addiere Wort und füge immer ein Leerzeichen nach dem Wort an
    33. ZeileMax39 += WordList[i] + " ";
    34. i += 1;
    35. }
    36. //lösche letztes/finales Leerzeichen in der Zeile
    37. ZeileMax39 = Regex.Replace(ZeileMax39, @"\s+$", "");
    38. //füge das NewLine Zeichen hinzu
    39. FormattedOutputText += ZeileMax39 + "\n";
    40. FormattedOutputText += $"#{ZeileMax39.Length}\n";
    41. //reset auf leeren String
    42. ZeileMax39 = "";
    43. }
    44. RtxbxResult.Text += FormattedOutputText ;
    45. MessageBox.Show(FormattedOutputText);
    46. }
    47. }
    48. }


    VB.Net
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Text.RegularExpressions
    3. Imports System.Windows.Forms
    4. Namespace WF_LineBreakAfter39Char
    5. Public Partial Class Form1
    6. Inherits Form
    7. Private InputText As String = "Dies ist ein Test, in der Rtxbx wird der Text eingegeben und später in der Msgbx soll die Formatierung weiterhin bestehen bleiben. Regeln max 39 Char pro Zeile und kein Wortumbruch!"
    8. Private FormattedOutputText As String = ""
    9. Public Sub New()
    10. InitializeComponent()
    11. CenterToParent()
    12. RtxbxShow.Text = InputText
    13. End Sub
    14. Private Sub BtnMsgbx_Click(ByVal sender As Object, ByVal e As EventArgs)
    15. Dim WordList = Regex.Matches(InputText, "[\wäöüÄÖÜß,\.;!\?@€%&\(\)]+")
    16. Dim ZeileMax39 As String = ""
    17. Dim i As Integer = 0
    18. While i < WordList.Count
    19. While i < WordList.Count AndAlso (ZeileMax39.Length + WordList(i).Length) < 40
    20. ZeileMax39 += WordList(i) & " "
    21. i += 1
    22. End While
    23. ZeileMax39 = Regex.Replace(ZeileMax39, "\s+$", "")
    24. FormattedOutputText += ZeileMax39 & vbLf
    25. FormattedOutputText += $"#{ZeileMax39.Length}\n"
    26. ZeileMax39 = ""
    27. End While
    28. RtxbxResult.Text += FormattedOutputText
    29. MessageBox.Show(FormattedOutputText)
    30. End Sub
    31. End Class
    32. End Namespace


    Für Kommentare des Codes siehe bitte im C# Listing nach, die Online-Konvertierung hat die Kommentare im Vb.net Code gelöscht.

    Bilder
    • Bild_2020-12-27_111107.png

      31,27 kB, 597×441, 47 mal angesehen
    codewars.com Rank: 4 kyu
    @jnpanzer
    ich hab mal probiert die Chars mit Regex in Groups zu packen,
    wie zuverlässig das ganze ist musst du Testen

    denn Beispiel text habe ich von nogood übernommen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim txt As String = "Dies ist ein Test, in der Rtxbx wird der Text eingegeben und später in der Msgbx soll die Formatierung weiterhin bestehen bleiben. Regeln max 39 Char pro Zeile und kein Wortumbruch!"
    3. Dim groups As List(Of String) = (
    4. From m As Match In Regex.Matches(txt, "(.{0,39})(?: |$)")
    5. Select m.Value).ToList()
    6. For Each i In groups
    7. RichTextBox1.AppendText(i & vbNewLine)
    8. Next
    9. End Sub