Zeilenumbruch nach 18 Zeichen oder Leerzeichen

  • VB.NET

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

    Zeilenumbruch nach 18 Zeichen oder Leerzeichen

    Hi zusammen. Das ist auch mein erster Post, daher auch ein "Schön hier zu sein" :D

    Ich bastle zur Zeit an einem Tool, welches das übersetzen eines Spieles beitragen soll, bzw den übersetzern etwas Arbeit abnehmen soll.
    Bis jetzt Funktioniert auch alles ganz gut, jedoch habe ich Probleme beim einfügen von Zeilenumbrüchen.

    Was das Tool macht:
    Im großen und ganzen ist es so, dass das Tool nach 18 Zeichen den Satz bricht, da 18 die höchstzugelassene anzahl an Chars pro Zeile ist, welche der compiler schluckt.
    Dazu wird noch an die Sätze der code für den compiler angehängt.

    Code vom Button und Funktion:

    Button:

    Visual Basic-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim StringListe As New List(Of String)
    3. Dim TextBoxRich As New RichTextBox
    4. TextBoxRich.AppendText(TextBox1.Text)
    5. For Each line In TextBoxRich.Lines
    6. Dim TextTeil As String = Zeilenumbruch(line)
    7. StringListe.Add(TextTeil)
    8. Next
    9. TextBox1.Text = ""
    10. For Each line In StringListe
    11. TextFeld.AppendText(line)
    12. Next
    13. End Sub


    Funktion:

    Visual Basic-Quellcode

    1. Private Function Zeilenumbruch(ByVal line As String) As String
    2. If line.Length < 18 Then
    3. Return line
    4. End If
    5. Dim TextBruch As String = ""
    6. For i As Integer = 0 To line.Length - 1 Step 18
    7. ' Textumbruch
    8. If line.Length < i + 18 Then
    9. If LineCNT = 0 Then
    10. TextBruch &= vbTab & "ctxt " & """" & line.Substring(i) & """"
    11. ElseIf LineCNT = 1 Then
    12. TextBruch &= vbTab & "line " & """" & line.Substring(i) & """"
    13. ElseIf LineCNT = 2 Then
    14. TextBruch &= vbTab & "cont " & """" & line.Substring(i) & """"
    15. ElseIf LineCNT = 3 Then
    16. TextBruch &= vbTab & "cont " & """" & line.Substring(i) & """"
    17. Else
    18. 'para cont wechsel
    19. If PARAANDLINE = False Then
    20. TextBruch &= vbTab & "para " & """" & line.Substring(i) & """"
    21. PARAANDLINE = True
    22. Else
    23. TextBruch &= vbTab & "line " & """" & line.Substring(i) & """"
    24. PARAANDLINE = False
    25. End If
    26. End If
    27. TextBruch &= Environment.NewLine
    28. LineCNT = LineCNT + 1
    29. Else
    30. If LineCNT = 0 Then
    31. TextBruch &= vbTab & "ctxt " & """" & line.Substring(i, 18) & """"
    32. ElseIf LineCNT = 1 Then
    33. TextBruch &= vbTab & "line " & """" & line.Substring(i, 18) & """"
    34. ElseIf LineCNT = 2 Then
    35. TextBruch &= vbTab & "cont " & """" & line.Substring(i, 18) & """"
    36. ElseIf LineCNT = 3 Then
    37. TextBruch &= vbTab & "cont " & """" & line.Substring(i, 18) & """"
    38. Else
    39. 'para cont wechsel
    40. If PARAANDLINE = False Then
    41. TextBruch &= vbTab & "para " & """" & line.Substring(i, 18) & """"
    42. PARAANDLINE = True
    43. Else
    44. TextBruch &= vbTab & "line " & """" & line.Substring(i, 18) & """"
    45. PARAANDLINE = False
    46. End If
    47. End If
    48. TextBruch &= Environment.NewLine
    49. LineCNT = LineCNT + 1
    50. End If
    51. Next
    52. Return TextBruch
    53. End Function


    Das Ergebnis ist ok aber nicht perfekt
    Bsp:
    Folgender Text in dem Tool Sehr langer String der alle 18 zeichen gebrochen wird und so wweiter und so fort lalalal blablablabla laaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanger Text :D

    Quellcode

    1. ctxt "Folgender Text in "
    2. line "dem Tool Sehr lang"
    3. cont "er String der alle"
    4. cont " 18 zeichen gebroc"
    5. para "hen wird und so ww"
    6. line "eiter und so fort "
    7. para "lalalal blablablab"
    8. line "la laaaaaaaaaaaaaa"
    9. para "aaaaaaaaaaaaaaaaaa"
    10. line "nger Text :D"


    Leider weis ich wirklich nicht weiter :S
    Hab schon alles mögliche versucht komme aber nicht dahinter, wie ich auch bei einem leerzeichen unterbrechen kann aber nur wenn die 18 Zeichen eingehalten werden.
    Hoffe jemand kann mir helfen :)

    Vielen Dank schonmal
    du kannst mit String.Split() den Text in einzelne Worte zerstückeln. Problematisch dabei sind Satzzeichen, die werden dabei nämlich dem vorhergehendem Wort zugeschlagen - aber vlt. ist das ja auch ganz praktisch so.
    Ja, und dann die Worte durchgehen, und solange in eine Zeile packen, bis Zeilenlänge 18 überschritten würde.
    Die Dokumentation der String.Split-Funktion findeste im ObjectBrowser.
    Objectbrowser kennste? Sonst mussten kennenlernen: VisualStudio richtig nutzen (Google ist nicht deine Mami)
    Habe jetzt die Split Methode einmal verwendet.

    Visual Basic-Quellcode

    1. Public Class Form1
    2. Public LineCNT As Integer = 0
    3. Dim PARAANDLINE As Boolean = False
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. Dim Splitted() As String = TextBox1.Text.Split(" "), LineCurrent As String = "", Textbruch As String = ""
    6. Dim StringListe As New List(Of String)
    7. Dim TextBoxRich As New RichTextBox
    8. TextBoxRich.AppendText(TextBox1.Text)
    9. For i = LBound(Splitted) To UBound(Splitted)
    10. If LineCurrent.Length + Splitted(i).Length <= 17 Then 'Kommt noch ein Leerzeichen hinzu
    11. LineCurrent = LineCurrent & " " & Splitted(i)
    12. Else
    13. LineCurrent = LineCurrent 'Zeile Voll
    14. End If
    15. If LineCNT = 0 Then
    16. Textbruch &= vbTab & "ctxt " & """" & LineCurrent & """"
    17. LineCNT = LineCNT + 1
    18. ElseIf LineCNT = 1 Then
    19. Textbruch &= vbTab & "line " & """" & LineCurrent & """"
    20. LineCNT = LineCNT + 1
    21. ElseIf LineCNT = 2 Then
    22. Textbruch &= vbTab & "cont " & """" & LineCurrent & """"
    23. LineCNT = LineCNT + 1
    24. ElseIf LineCNT = 3 Then
    25. Textbruch &= vbTab & "cont " & """" & LineCurrent & """"
    26. LineCNT = LineCNT + 1
    27. Else
    28. 'para cont wechsel
    29. If PARAANDLINE = False Then
    30. Textbruch &= vbTab & "para " & """" & LineCurrent & """"
    31. PARAANDLINE = True
    32. Else
    33. Textbruch &= vbTab & "line " & """" & LineCurrent & """"
    34. PARAANDLINE = False
    35. End If
    36. End If
    37. Textbruch &= Environment.NewLine
    38. RichTextBox1.AppendText(Textbruch)
    39. Next
    40. End Sub
    41. End Class


    Denke das ist der eichtige Ansatz.. Die worte werden jetzt gebrochen. leider ist der textinhalt immer nur die ersten wörter.

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Vortex1991“ ()

    Da wir uns im VB6 Forum befinden, ein VB6 / VBA Beispiel:

    Aus

    Folgender Text in dem Tool Sehr langer String der alle 18 zeichen gebrochen wird und so wweiter und so fort lalalal blablablabla laaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanger Text

    wird

    Folgender Text in
    dem Tool Sehr
    langer String der
    alle 18 zeichen
    gebrochen wird
    und so wweiter
    und so fort
    lalalal
    blablablabla
    laaaaaaaaaaaaaaaa
    aaaaaaaaaaaaaaang
    r Text


    Visual Basic-Quellcode

    1. Sub test()
    2. Dim T As String, T2 As String
    3. Dim zulang As Long, MaxLen As Long, p As Long
    4. MaxLen = 18
    5. T = "Folgender Text in dem Tool Sehr langer String der alle 18 zeichen gebrochen wird und so wweiter und so fort lalalal blablablabla laaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanger Text"
    6. zulang = (Len(T) > MaxLen)
    7. While zulang
    8. p = InStrRev(T, " ", MaxLen)
    9. If p = 0 Then p = MaxLen
    10. T2 = T2 & Left(T, p - 1) & vbCrLf
    11. T = Mid(T, p + 1)
    12. zulang = (Len(T) > MaxLen)
    13. Wend
    14. T = T2 & T: T2 = ""
    15. Debug.Print T
    16. MsgBox T
    17. End Sub
    Vielen dank für den tipp! Um ehrlich zu sein wär ich da im Leben nicht drauf gekommen :P.
    Habe den code noch umgestaltet bzw VBA-Tauglich gemacht. Hier noch einmal der gesammte code, falls jemand in zukunft probleme damit hat.

    Visual Basic-Quellcode

    1. Public LineCNT As Integer = 0
    2. Dim PARAANDLINE As Boolean = False
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim T As String, T2 As String
    5. Dim TextBoxRich As New RichTextBox
    6. Dim zulang As Long, MaxLen As Long, p As Long
    7. Dim StringListe As New List(Of String)
    8. MaxLen = 18
    9. T = TextBox1.Text
    10. zulang = (Len(T) > MaxLen)
    11. While zulang
    12. p = InStrRev(T, " ", MaxLen)
    13. If p = 0 Then p = MaxLen
    14. T2 = T2 & Strings.Left(T, p - 1) & vbCrLf
    15. T = Mid(T, p + 1)
    16. zulang = (Len(T) > MaxLen)
    17. End While
    18. T = T2 & T : T2 = ""
    19. TextBoxRich.AppendText(T)
    20. 'Funktion call
    21. For Each line In TextBoxRich.Lines
    22. Dim TextTeil As String = Zeilenumbruch(line)
    23. StringListe.Add(TextTeil)
    24. Next
    25. TextBox1.Text = ""
    26. For Each line2 In StringListe
    27. RichTextBox1.AppendText(line2)
    28. Next
    29. End Sub
    30. Private Function Zeilenumbruch(ByVal line As String) As String
    31. Dim TextBruch As String = ""
    32. If LineCNT = 0 Then
    33. TextBruch &= vbTab & "ctxt " & """" & line & """"
    34. ElseIf LineCNT = 1 Then
    35. TextBruch &= vbTab & "line " & """" & line & """"
    36. ElseIf LineCNT = 2 Then
    37. TextBruch &= vbTab & "cont " & """" & line & """"
    38. ElseIf LineCNT = 3 Then
    39. TextBruch &= vbTab & "cont " & """" & line & """"
    40. Else
    41. 'para cont wechsel
    42. If PARAANDLINE = False Then
    43. TextBruch &= vbTab & "para " & """" & line & """"
    44. PARAANDLINE = True
    45. Else
    46. TextBruch &= vbTab & "line " & """" & line & """"
    47. PARAANDLINE = False
    48. End If
    49. End If
    50. TextBruch &= Environment.NewLine
    51. LineCNT = LineCNT + 1
    52. Return TextBruch
    53. End Function


    Lieben dank noch einmal eierlein!
    @Vortex1991 Vielleicht habe ich ja einen wichtigen Entwicklungsschritt seitens Microsoft verpasst, aber für mich sieht das weder nach VBA noch nach VB6 aus, siehe [Allgemein] VB.NET, VB6, VBA, VBS — Mit welcher Sprache programmiere ich eigentlich?
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Schon älter, aber hab ziwischenzeitlich eine sehr schöne Löung gefunden, die ich niemandem vorenthalten will :)


    Visual Basic-Quellcode

    1. Function ZeilenLänge(ByVal Text As String, ByVal Länge As Integer) As String
    2. Dim RTB As New RichTextBox
    3. Dim MaxLänge As Integer = Länge
    4. For Each Wort As String In Text.Split({" "}, StringSplitOptions.None) ' Satz in Wöter aufteilen
    5. If Wort.Length < MaxLänge Then ' Wortlänge passt
    6. RTB.AppendText(Wort & " ") ' Wort hinzufügen, leerzeichen nicht vergessen
    7. MaxLänge = MaxLänge - Wort.Length - 1 ' Eingefügte Wortlänge abziehen und -1 wegen dem Leerzeichen
    8. ElseIf Wort.Length = MaxLänge Then ' Passt exakt. Die Zeile endet mit diesem Wort
    9. RTB.AppendText(Wort & vbCrLf) ' Fügt Wort ein und zeilenumbruch
    10. MaxLänge = Länge ' Neue leere Zeile wieder 18 Zeichen Frei
    11. Else
    12. RTB.AppendText(vbCrLf & Wort & " ") ' Passt nicht Zeilenumbruch wird erzwungen Wort kommt in die nächste Zeile +Leerzeichen
    13. MaxLänge = Länge - Wort.Length - 1 ' Neue Zeile, in der aber schon das letzte Wort steht, also die Maxzeichen für die Zeile veringern (-1)
    14. End If
    15. Next
    16. Return RTB.Text
    17. End Function


    Liebe Grüße

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Vortex1991“ ()

    Sorry, aber "sehr schöne Lösung" ist relativ.
    Statt n Control für Deine Texterstellung zu missbrauchen, wäre ein StringBuilder das Richtige.
    ByVal brauchst Du gar nicht.
    For Each Wort As String In Text.Split({" "}, StringSplitOptions.None) -> For Each Wort In Text.Split(" "c)
    MaxLänge = MaxLänge - Wort.Length - 1 -> MaxLänge -= Wort.Length - 1
    Umlaute und deutsch Variablen sollte man meiden
    vbCrLf ist aus dem VB6-Namespace -> Bevor Du weitermachst, bitte die empfohlenen VS-Einstellungen verwenden.
    Das so auf den ersten Blick.

    btw: bitte nächstes Mal die richtigen CodeTags (VB.NET) verwenden
    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.
    ich würde all 2 wörter splitten,

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    2. 'nach 2 Wörter neue Zeile
    3. Dim s As String = "Folgender Text in dem Tool Sehr langer String der alle 18 zeichen gebrochen wird und so wweiter und so fort lalalal blablablabla laaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanger Text"
    4. 'Dim s As New String(My.Computer.FileSystem.ReadAllText("E:\Sample.txt")) 'Daten einlesen
    5. Dim parts() As String = s.Split(New Char() {" "c})
    6. Dim sb As New System.Text.StringBuilder
    7. For x As Integer = 1 To parts.Length - 1 Step 2
    8. sb.AppendFormat("{0} {1}{2}", parts(x - 1), parts(x), Environment.NewLine)
    9. Next
    10. If parts.Length Mod 2 = 1 Then sb.AppendFormat("{0}{1}", parts(parts.Length - 1), Environment.NewLine)
    11. Debug.Print(sb.ToString)
    12. End Sub
    Ja, das könntest Du. Aber damit würdest Du das Ziel des TEs nicht erreichen, bei dem jede Zeile optimalerweise aus z.B. 18 Zeichen besteht. Und auch bei Dir:
    s.Split(New Char() {" "c}) -> s.Split(" "c)
    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.