はじめに
本記事は、以下のシリーズ記事の続編です。
第1章:自動改行処理の基本実装
第2章:句読点・括弧の行頭・行末禁止処理
これまで、テキストボックスに対して自動改行処理と、句読点・括弧の行頭・行末禁止処理を実装しました。今回は、ユーザーがバックスペースキーを押した際に、改行コード(vbCrLf)を違和感なく削除する処理を追加します。
通常のバックスペースでは、\r\nのうち1文字ずつしか削除されず、改行が中途半端に残ることがあります。これを防ぐため、改行コードを検出してまとめて削除する処理を実装します。
第3章:バックスペースキーによる改行削除の最適化
バックスペースキーの検出と改行コードの削除
Private Sub Textbox1_KeyDown(sender As Object, e As KeyEventArgs) Handles Textbox1.KeyDown
If e.KeyCode = Keys.Back Then
Dim currentPosition As Integer = Textbox1.SelectionStart
' 改行コードが削除された場合、さらに前の文字を削除
If currentPosition > 0 AndAlso Textbox1.Text.Substring(currentPosition - 1, 1) = vbLf Then
' 「\r\n」の場合は、さらに1文字前を削除
If currentPosition > 1 AndAlso Textbox1.Text.Substring(currentPosition - 2, 1) = vbCr Then
' \r\n を削除
Textbox1.Text = Textbox1.Text.Remove(currentPosition - 3, 2)
Textbox1.SelectionStart = currentPosition - 3
Else
' \n のみを削除
Textbox1.Text = Textbox1.Text.Remove(currentPosition - 2, 1)
Textbox1.SelectionStart = currentPosition - 2
End If
' イベントを抑制して既定のバックスペース動作を防ぐ
e.SuppressKeyPress = True
End If
isBackspace = True
End If
End Sub
バックスペース処理後の自動改行再適用
Private Sub Textbox1_KeyUp(sender As Object, e As KeyEventArgs) Handles Textbox1.KeyUp
If e.KeyCode = Keys.Back Then
isBackspace = False
' 現在のカーソル位置を記憶
Dim cursorPosition As Integer = Textbox1.SelectionStart
' 入力者による改行を無効化
Dim sanitizedText As String = Textbox1.Text.Replace(vbCr, "").Replace(vbLf, "")
' 自動改行処理を実行
Textbox1.Text = InsertLineBreaks(sanitizedText, Me.MaxMojisu.ColumnMaxMojisu)
' カーソル位置を元の位置に設定
Textbox1.SelectionStart = cursorPosition
End If
End Sub
💡Point
- KeyDownイベントで改行コードの検出と削除を行い、SuppressKeyPressで既定の動作を抑制
- KeyUpイベントで改行を再整形し、カーソル位置を維持
- InsertLineBreaks関数は前章で実装したものを再利用
さいごに
3章にわたって、VB.NETでのテキストボックス自動改行処理の実装方法を紹介してきました。
第1章では基本的な改行処理
第2章では句読点や括弧の位置調整
第3章ではバックスペースによる改行削除の最適化
これらを組み合わせることで、ユーザーにとって自然で快適な入力体験を提供することが出来るはず!
本記事が、同様のUI改善を検討されている方の参考になれば幸いです。ご覧いただきありがとうございました!