文字列型セルで入力可能バイト数を設定するには?
対象製品
El Tabelle for .NET
詳細
El Tabelle の文字列型セル(TextEditor)では、入力可能文字数を文字単位でしか設定できません。これは .NET Framework が Unicode ベースで動作していることに基く制限です。
しかし、InputMan for .NET の Edit コントロールには最大文字数を最大バイト数とするための LengthAsByte プロパティが備わっています。El Tabelle でも将来のバージョンでこの機能を実装することを検討しています。
現状、最も LengthAsByte プロパティに近い処理は、次のようにセルの編集確定時に
文字列をバイト単位で評価し、整形する処理となります。
[Visual Basic]
なお、この処理では2バイト文字が1バイトに分割された場合に生じる、不要なデータの除去にテキストボックスの機能を利用しています。Windows のバージョンによってテキストボックスの機能が変化する場合、この処理が正しく動作しない恐れがあることにご注意ください。
しかし、InputMan for .NET の Edit コントロールには最大文字数を最大バイト数とするための LengthAsByte プロパティが備わっています。El Tabelle でも将来のバージョンでこの機能を実装することを検討しています。
現状、最も LengthAsByte プロパティに近い処理は、次のようにセルの編集確定時に
文字列をバイト単位で評価し、整形する処理となります。
[Visual Basic]
'あらかじめ、Form にテキストボックスとシートを配置する
Private Sub Sheet1_LeaveEdit(ByVal sender As Object, _
ByVal e As GrapeCity.Views.ElTabelle.LeaveEditEventArgs) _
Handles Sheet1.LeaveEdit
'文字列型セルの場合のみ処理する
If Sheet1.ActiveCell.Editor.GetType.ToString = "GrapeCity.Win.Editors.TextEditor" Then
'制限するバイト数
Dim intMaxLengthAsByte As Integer = 5
If System.Text.Encoding.GetEncoding("Shift-JIS").GetByteCount( _
Sheet1.ActiveCell.Text) >= intMaxLengthAsByte Then
Dim bytSourceString() As Byte
Dim bytDestString() As Byte
bytSourceString = System.Text.Encoding.Unicode.GetBytes( _
Sheet1.ActiveCell.Text)
bytDestString = System.Text.Encoding.Convert( _
System.Text.Encoding.Unicode, _
System.Text.Encoding.GetEncoding("Shift-JIS"), bytSourceString)
'指定したバイト数を超える入力が行われた場合
If bytDestString.Length - 1 >= intMaxLengthAsByte Then
ReDim Preserve bytDestString(intMaxLengthAsByte - 1)
End If
'テキストボックスに値をコピーし、表示不可能な文字を除去する
TextBox1.Text = System.Text.Encoding.GetEncoding("Shift-JIS").GetString(bytDestString)
Sheet1.ActiveCell.Text = TextBox1.Text
End If
End If
End Sub
Private Sub Sheet1_LeaveEdit(ByVal sender As Object, _
ByVal e As GrapeCity.Views.ElTabelle.LeaveEditEventArgs) _
Handles Sheet1.LeaveEdit
'文字列型セルの場合のみ処理する
If Sheet1.ActiveCell.Editor.GetType.ToString = "GrapeCity.Win.Editors.TextEditor" Then
'制限するバイト数
Dim intMaxLengthAsByte As Integer = 5
If System.Text.Encoding.GetEncoding("Shift-JIS").GetByteCount( _
Sheet1.ActiveCell.Text) >= intMaxLengthAsByte Then
Dim bytSourceString() As Byte
Dim bytDestString() As Byte
bytSourceString = System.Text.Encoding.Unicode.GetBytes( _
Sheet1.ActiveCell.Text)
bytDestString = System.Text.Encoding.Convert( _
System.Text.Encoding.Unicode, _
System.Text.Encoding.GetEncoding("Shift-JIS"), bytSourceString)
'指定したバイト数を超える入力が行われた場合
If bytDestString.Length - 1 >= intMaxLengthAsByte Then
ReDim Preserve bytDestString(intMaxLengthAsByte - 1)
End If
'テキストボックスに値をコピーし、表示不可能な文字を除去する
TextBox1.Text = System.Text.Encoding.GetEncoding("Shift-JIS").GetString(bytDestString)
Sheet1.ActiveCell.Text = TextBox1.Text
End If
End If
End Sub
なお、この処理では2バイト文字が1バイトに分割された場合に生じる、不要なデータの除去にテキストボックスの機能を利用しています。Windows のバージョンによってテキストボックスの機能が変化する場合、この処理が正しく動作しない恐れがあることにご注意ください。
キーワード
HowTo
この文書は、以前は次のFAQ IDで公開されていました : 3643