はじめに
VBのテキストボックスで自動改行を実装しようと始めた前回からの続きです。
前回の記事は以下からご確認ください。
第2章:句読点や括弧の調整
よりWordっぽくなるように前回実装した改行処理に行頭・行末禁止文字を実装していきます。
具体的には、文の途中で改行が発生した際に、句読点や括弧が行頭ではなく行末に来るように処理を追加します。
Private Function InsertLineBreaks(input As String, maxChars As Integer) As String
Dim result As New List(Of String)()
Dim currentLine As New System.Text.StringBuilder()
Dim maxChars As Integer = 50 ' 一行当たりの最大文字数を設定
For i As Integer = 0 To input.Length - 1
' テキストボックス内の文字を一文字ずつ変数に追加する
currentLine.Append(input(i))
' 現在の行が最大文字数に達した場合
If currentLine.Length >= maxChars Then
+ If Not "。、」』))】].,;;:: /→⇒←⇔".Contains(input(i + 1)) Then
' リストに現在の行の文字列を追加する
result.Add(currentLine.ToString())
currentLine.Clear()
+ End If
End If
Next
' 残った文字列を追加
If currentLine.Length > 0 Then
result.Add(currentLine.ToString())
End If
' 結果を改行で連結して返す
Return String.Join(vbCrLf, result)
End Function
改行をした際に指定した文字(句読点や括弧の終わり)が行頭になる場合、最大文字数に達した場合の処理をさせないようにしました。
続いて、行末禁止文字を実装していきます。
' 現在の行が最大文字数に達した場合
If currentLine.Length >= maxChars Then
- If Not "。、」』))】].,;;:: /→⇒←⇔".Contains(input(i + 1)) Then
+ If "「((【『[".Contains(currentLine(currentLine.Length - 1)) Then
+ ' 1. 現在の行の最後の文字が括弧(「 など)の場合、改行前に取り除く
+ Dim lastChar As Char = currentLine(currentLine.Length - 1)
+ currentLine.Remove(currentLine.Length - 1, 1)
+ ' 2. 現在の行をリストに追加
+ result.Add(currentLine.ToString())
+ currentLine.Clear()
+ ' 3. 括弧を次の行の最初に追加
+ currentLine.Append(lastChar)
+ ElseIf Not "。、」』))】].,;;:: /→⇒←⇔".Contains(input(i + 1)) Then
' リストに現在の行の文字列を追加する
result.Add(currentLine.ToString())
currentLine.Clear()
End If
End If
改行をした際に指定した文字(括弧の開始)が行末になる場合、指定した文字の手前までをリストに追加し、変数currentLineをクリア、指定した文字は再度変数currentLineに追加します。
行頭・行末禁止文字の実装により、よりWordライクなテキストボックスになりました。
次回は改行を挿入した後の注意点やバックスペースの処理についてまとめていきます。