Visual Basic クラスライブラリ詳解 |
Visual Basic 中学校 > クラスライブラリ詳解 > System > Windows > Forms >
TextBox
完全限定名 | System.Windows.Forms.TextBox |
基底クラス | System.Object > System.MarshalByRefObject > System.ComponentModel.Component > System.Windows.Forms.Control > System.Windows.Forms.TextBoxBase |
インターフェイス | IBindableComponent, IComponent, IDisposable, IDropTarget, ISyncronizeInvoke, IWin32Window |
派生クラス | System.Windows.Forms.DataGridTextBox, System.Windows.Forms.DataGridViewTextBoxEditingControl |
使用頻度 | A |
バージョン | .NET Framework 1.0以上 (VB.NET2002以上) |
主な機能 | ユーザーに文字列を入力させる。 |
TextBoxクラスは文字を入力、表示するためのコントロールです。通常はFormなどのコンテナに貼り付けて使用します。コントロールであるので、TextBoxクラスというよりもTextBoxコントロールと呼ばれることが多いです。
■画像1:TextBox
TextBoxでの文字の入力・表示は最もシンプルな形式で行われます。小さなメモ帳と考えてもよいでしょう。制御も簡単に行えるようになっているので、ユーザーが文字を入力する必要がある場合にはTextBoxを使用するのが一般的です。
フォントの種類や色・大きさを指定することもできますが、このような設定はTextBox全体に適用され、文字の一部分だけ赤くするといったことはできません。このようなワープロ的な装飾が必要な場合はTextBoxではなくRichTextBoxを使用します。
また、単に文字を表示するだけならばLabelを使用するのが一般的です。Labelでは文字の入力・編集は行えません。TextBoxを使用してもReadOnlyプロパティをTrueにすることで読み取り専用にすることは可能です。
上述のようにTextBoxはシンプルな入力を行うコントロールです。ここではTextBoxに似た機能を持つコントロールを紹介しますのでTextBoxでは難しい仕様を実現しようとしている場合に検討してみてください。
■表1:TextBoxに似たコントロール なお、私は書式付きの入力というものが個人的に好きではないためMaskedTextBoxはまず使用しません。このような場合にはTextBoxを使用します。そしてユーザーは自由な入力が可能で、入力後に整形を行うというスタンスを採っています。 |
TextBoxに表示される文字はTextプロパティで制御されます。
Textプロパティに文字列をセットするにはデザイン時にプロパティウィンドウを使用してTextプロパティを編集するか、実行時にユーザーがキーボードなどの入力装置を使用して文字を入力するか、コードを記述してプログラムから制御するかします。
プロパティウィンドウではTextプロパティ欄に自由に文字列を入力できますし、下向きの矢印をクリックしてプロパティ欄を展開することで複数行にわたる文字列を入力することができます。
■画像2:プロパティウィンドウを使用してTextプロパティをセット
ただし、実際に複数行で文字列を表示するためにはMultiLineプロパティにTrueをセットする必要があります。そうでない場合、何行入力してもすべて1行で表示されてしまいます。MultiLineプロパティはプロパティウィンドウやプログラムから設定することもできますが、VB2005以降であればTextBoxのスマートタグを使用して設定するのが最も簡単です。
TextBoxのスマートタグを表示するにはTextBoxを選択した状態で右上に表示される小さな三角形のボタンをクリックします。
■画像3:スマートタグを使用してMultiLineプロパティをセット
プログラムでTextプロパティを使用する方法は通常のプロパティと同じです。
次の例ではTextBox1に「こんにちは」と表示します。
TextBox1.Text = "こんにちは" |
■リスト1:Textプロパティのセット
次の例ではTextBox1に現在表示されている内容を取得します。
Dim
Value As
String Value = TextBox1.Text |
■リスト2:Textプロパティの取得
ReadOnlyプロパティをTrueにすることでTextBoxを読み取り専用にすることができます。この状態ではプログラムからのTextプロパティの変更は可能ですがユーザーが入力装置を使って文字列を編集することができなくなります。ただし、文字列の内容を変更しない操作なら可能で、たとえばマウスを使って文字列の全体や一部分を選択したり、選択した部分をコピーしたりできます。
EnabledプロパティをFalseにしてTextBoxを使用不可にした場合でも同じようなことが起こりますが、このときはマウスによる文字列の選択やコピーもできなくなります。
ReadOnlyプロパティやEnabledプロパティを変更するとTextBoxの背景色と文字の色が自動的に灰色のような色に変更され、デザイン性を重視するアプリケーションを開発する場合に好ましくない場合があります。
→実際に何色になるかはWindowsのコントロールパネルの設定により異なります。ここでは標準的な設定に基づいて説明しています。
ReadOnly = True | Enabled = False | |
効果 | 読み取り専用 | 使用不可 |
文字列の編集 | × | × |
文字列の選択・コピー | ○ | × |
背景の色 | 灰色 | 灰色 |
文字の色 | 黒 | 灰色 |
背景の色の変更 | ○ | ○ |
文字の色の変更 | ○ | × |
■表2:ReadOnlyとEnabledの違い
しかしながら、背景色についてはBackColorプロパティを変更するだけで簡単に変えることができます。
次の例では背景色が白い状態でTextBoxを読み取り専用にします。
TextBox1.ReadOnly =
True TextBox1.BackColor = Color.White |
■リスト3:読み取り専用で背景色を白
実際にはコントロールパネルの設定次第で標準の色が白ではない可能性もあります。ですから、次の例のようにシステムで設定されている色をそのままセットする方が柔軟性があります。
TextBox1.ReadOnly =
True TextBox1.BackColor = Color.FromKnownColor(KnownColor.Window) |
■リスト4:読み取り専用で背景色をシステムの既定の色(通常は白)
この設定はプロパティウィンドウだけでも行うことができますが、どのような場合でもまずReadOnlyプロパティやEnabledプロパティを変更して、その後でBackColorプロパティを指定しなければ意味がありません。
文字の色に関してはReadOnly = Trueの場合にはForeColorプロパティを使用して簡単に変えることができます。しかし、Enabled = Falseの場合には文字の色を変更することはできません。
どうしてもEnabled = Falseの状態で文字の色を変更したい場合はTextBoxコントロールを継承した自作のコントロールを作成することになります。
はじめの状態ではTextBoxには1行分の文字列しか入力・表示することができません。複数行にわたる文字列を入力・表示できるようにするためにはMultiLineプロパティをTrueにすることが必要です。また、必要に応じてTextBoxの高さを調節します。
プログラムからの制御で複数行の文字列をセットするには改行位置に改行コードを挿入します。VBでは改行コードは定数vbNewLineによって定義されています。
次の例では2行にわたって「リキニウス」「セクスティウス」と表示します。
TextBox1.Text = "リキニウス" & vbNewLine & "セクスティウス" |
■リスト5:複数行のTextをセット
TextBoxの幅が十分にない時は1行分の文字列が折り返されて表示されます。この動作はWordWrapプロパティで変更できます。
既定ではWordWrapプロパティはTrueになっていてTextBoxの幅が十分でないときは内容が自動的に折り返されます。
■画像4:WordWrapによる自動折り返し
WordWrapプロパティをFalseにすると自動折り返しは無効になります。
■画像5:WordWrap = False
この場合はTextBoxの幅が足りない分は表示されませんが、マウスで選択したりキーボードの矢印などでカーソルを移動させればスクロールして表示・編集することができます。
TextBoxでは文字列が表示しきれないときに自動的にスクロールバーを表示する機能があります。このスクロールバーはツールボックスのスクロールバーコントロールとは異なり、完全にTextBoxに従属するもので制御も自動的に行われます。
■画像6:スクロールバー
スクロールバーには縦にスクロールする垂直スクロールバーと横にスクロールする水平スクロールバーの2種類があります。どちらのスクロールバーを表示するかはScrollBarsプロパティで指定できます。
値 | 意味 |
None | スクロールバーを表示しません。 |
Horizontal | 横にスクロールする水平スクロールバーを表示します。 |
Vertical | 縦にスクロールする垂直スクロールバーを表示します。 |
Both | 両方のスクロールバーを表示します。 |
■表3:ScrollBarsプロパティの設定内容
WordWrapプロパティがTrueの場合は、横にスクロールする必要がないためScrollBarsプロパティをどのような値にしても水平スクロールバーは表示されません。
プログラムからTextBoxに「"」(ダブルクォーテーション)を含む文字列を表示させるには、VBで通常"を文字として扱う場合と同様に"を2つ重ねて""にします。
以下の例はTextBoxに「アメリカ人の転校生が"How do you do?"と言いました。」と表示されます。
TextBox1.Text = "アメリカ人の転校生が""How do you do?""と言いました。" |
■リスト6:"の表示
「"」を1つだけを表示させる場合は次のようにします。
TextBox1.Text = """" |
■リスト7:「"」を1つだけを表示
TextAlignプロパティを使用すると文字列の表示を右寄せ、左寄せ、中央寄せにすることができます。
値 | 意味 |
Left | 左寄せ |
Right | 右寄せ |
Center | 中央寄せ |
■表4:TextAlignプロパティの設定内容
TextBoxではプログラムから文字列を編集するためのいくつかの便利なメソッド・プロパティが提供されています。しかし、標準的な操作であればTextプロパティを使用するのがわかりやすいです。また、標準ではサポートされていないような複雑な操作を実現する場合にも最終的にはTextプロパティを使用して文字列を細かく見ていくことになります。
ここではシンプルな例を紹介します。
次の例は現在表示されている文字列の前に文字列を追加します。
TextBox1.Text = "挿入しました" & TextBox1.Text |
■リスト8:文字列の前に挿入
次の例では現在表示されている文字列の後ろに文字列を追加します。
TextBox1.Text = TextBox1.Text & "と彼女は言った。" |
■リスト9:文字列の後ろに追加
この例は &= 演算子を使用して次のように書くのが一般的です。
TextBox1.Text &= "と彼女は言った。" |
■リスト10:&= 演算子の使用
また、AppendTextメソッドでも後ろに文字列を追加することができます。
TextBox1.AppendText("と彼女は言った。") |
■リスト11:AppendTextメソッドの使用
ユーザーはマウスなどを使用して文字列の一部または全部を選択することができます。文字列の選択はプログラムで制御することもできます。
また、当然プログラムでは現在選択されている内容を取得することができます。
文字列の選択に関係するTextBoxのメソッド・プロパティは次の通りです。
メソッド・プロパティ | 説明 |
HideSelection | フォーカスがないときにも選択されている文字列を反転表示させるか。 |
SelectedText | 選択されている文字列を表します。 |
SelectionLength | 選択されている文字数を表します。 |
SelectionStart | 選択開始位置を表します。 |
DeselectAll | 文字列の選択を解除します。 |
Select | 開始位置と文字数を指定して文字列を選択します。 |
SelectAll | すべての文字列を選択します。 |
■表5:文字列の選択に関係するメソッド・プロパティ
実際の選択内容とプロパティの関係を図にすると次のようになります。
■画像7:Textの選択とプロパティの関係
.NET Frameworkの標準では文字の位置は0から始まるので、上の図では5文字目の「故」から選択が始まっているのがSelectionStart = 4となります。SelectionLengthは選択されている文字数を表しているので「故に我」だと3になります。
SelectedTextプロパティはそのまま選択されている文字の内容を表しているので、上記の図の場合SelectedTextプロパティの値は「故に我」です。
プログラムで選択内容を設定するにはSelectメソッドやSelectAllメソッドを使用します。
SelectAllメソッドはTextBox内のすべての文字列を選択します。引数もないので使用は簡単です。
Selectメソッドには2つの機能があります。1つはTextBoxにフォーカスを移す機能です。Selectメソッドを引数なしで呼び出した場合にはこの機能が動作します。この機能はここでの説明とは関係ありません。もう1つがTextBoxの文字列の一部または全部を選択する機能です。このときは引数に選択開始位置と選択文字数を指定します。
次の例では「故に我」が選択状態になります。
TextBox1.Text =
"我思う、故に我あり。" TextBox1.Select(4, 3) TextBox1.Focus() |
■リスト12:文字列の一部を選択
この例で、最後の行のTextBox1.Focusは必須ではありませんが、これがないと結果がわかりにくくなります。文字列の選択が強調表示されるのはそのコントロールにフォーカスがある時だからです。いくらSelectしてもそのコントロールにフォーカスがないと見た目は変わりません。TABキーなどでフォーカスを移動したときに初めて選択されている内容が反転して表示されるのです。
HideSelectionプロパティを使うとこの動作を変更することができます。HideSelection = Falseに設定すると、フォーカスがないときでも選択されている内容が強調表示されます。
文字列の選択をすべて解除するにはDeselectAllメソッドを使用します。
TextBox1.DeselectAll() |
■リスト13・文字列の選択をすべて解除
このメソッドはVB2005以降でのみ使用可能です。
SelectionLengthに0をセットすることで選択を解除することもでき、この方法はすべてのバージョンで利用できます。
TextBox1.SelectionLength = 0 |
■リスト14:文字列の選択をすべて解除
なお、SelectionStartプロパティは文字列の選択とは関係なくTextBox内のキャレット(カーソル)の位置を指定する役割もあります。
複数行にわたる文字列の指定した行だけを処理するにはLinesプロパティを使用するのが最も簡単です。
次の例ではButton1をクリックするとTextBox1に長い文字列を複数行にわたってセットします。Button2をクリックするとその3行目だけを取り出して表示します。
Private Sub
Button1_Click(ByVal sender
As System.Object,
ByVal e As System.EventArgs)
Handles Button1.Click Dim St As String St = "籠もよ み籠持ち ふくしもよ みぶくし持ち" & vbNewLine St &= "この丘に 菜摘ます児 家聞かな 名告らさね" & vbNewLine St &= "そらみつ やまとの国は" & vbNewLine St &= "おしなべて 吾こそをれ" & vbNewLine St &= "しきなべて 吾こそませ" & vbNewLine St &= "我こそは 告らめ 家をも 名をも" TextBox1.Text = St End Sub |
Private
Sub Button2_Click(ByVal
sender As System.Object,
ByVal e As
System.EventArgs) Handles Button2.Click Dim St As String St = TextBox1.Lines(2) MsgBox(St) End Sub |
■リスト15:複数行のTextから3行目を取得
Linesプロパティは行の配列です。配列は0からはじまるため3行目を指定するにはLines(2)とします。この例ではButton1をクリックしてからButton2をクリックすると「そらみつ やまとの国は」と表示されます。
■画像8:複数行にわたるTextBox
この長歌は万葉集の一番最初に載っている和歌で、雄略天皇が詠んだものであるという伝説があります。
Linesプロパティは単なる配列なので存在しない行を指定すると例外IndexOutOfRangeExceptionが発生します。
Linesプロパティは読み取りだけではなく値の設定も可能です。ただし、Linesプロパティの個々の要素はTextBoxの各行のコピーにすぎないのでTextBox1.Lines(2) = "こんにちは"のようにしても何も置きません。
Linesプロパティを使用して文字列を置き換えるには、Linesプロパティが表している配列ごと置き換える必要があります。
次の例では3行目を改変します。
Dim
NewLines() As
String NewLines = TextBox1.Lines NewLines(2) = "これが3行目" TextBox1.Lines = NewLines |
■リスト16:複数行のTextの3行目だけを変更
Linesプロパティを使用して何もないところに行を追加することもできます。
Dim
NewLines(5) As
String NewLines(0) = "籠もよ み籠持ち ふくしもよ みぶくし持ち" NewLines(1) = "この丘に 菜摘ます児 家聞かな 名告らさね" NewLines(2) = "そらみつ やまとの国は" NewLines(3) = "おしなべて 吾こそをれ" NewLines(4) = "しきなべて 吾こそませ" NewLines(5) = "我こそは 告らめ 家をも 名をも" TextBox1.Lines = NewLines |
■リスト17:複数行のTextをセット
このようにするとvbNewLineなどの改行コードで結合しないで複数行の文字列をセットすることができます。
当然、文字列の配列であればなんでもLinesプロパティに設定することができますからいろいろな内容を簡単にTextBoxに表示することができます。
たとえば、EnvironmentクラスのGetLogicalDrivesプロパティはコンピュータのドライブの一覧を示すプロパティで文字列型の配列ですから、次のようにするとTextBoxにドライブの一覧を表示させることができます。
TextBox1.Lines = Environment.GetLogicalDrives |
■リスト18:Linesプロパティの用例
ただし、一覧で表示させる場合はListBoxコントロールを使用した方が便利であることが多いので、このようなTextBoxの使用は少ないでしょう。
TextBoxのイベントを使用するとユーザーの入力を細かく制御することができます。
最もよく使用するのはKeyPressイベントです。KeyPressイベントはユーザーが文字を入力したときに発生します。KeyPressイベントの引数を使用するとユーザーが何を入力しようとしているのかがわかり、それに対する反応を記述することができます。
次の例ではユーザーは0〜9の数字しか入力できなくなります。
Private
Sub TextBox1_KeyPress(ByVal
sender As Object,
ByVal e As
System.Windows.Forms.KeyPressEventArgs) Handles
TextBox1.KeyPress If Not (e.KeyChar Like "[0-9]") Then e.Handled = True End If End Sub |
■リスト19:0〜9の数字のみ入力可能
条件部分はIf e.KeyChar <> "0" AndAlso e.KeyChar <> "1" AndAlso ...と続けて書いても同じですが、プログラムが無駄に長くなるのでLile演算子を使用して簡略化しました。KeyPressイベントではLike演算子が必須ということではありません。
e.Handlesプロパティはそのキーが処理済みであることを示します。つまり、文字が0〜9以外のものであった場合には、本当は何も処理していないにも関わらずe.Handled = Trueをセットして処理済みであることにしてしまいます。これによって結果として何も入力されなくなります。この理屈がわかりにくい場合はe.Handled = Trueとすると入力がキャンセルできるんだと理解してもよいでしょう。
入力しようとしている文字が0〜9のどれかである場合はここでは特に何も記述していないのでシステムが自動的に制御します。つまり、通常通り1を入力すれば1と表示されるし、2を入力すれば2と表示されます。
この例は一見シンプルで便利そうに見えますが考慮しなければいけないことがあります。スペースキーやEnterキー、BackSpaceキーもKeyPressイベントによって処理されるため、0〜9のみを許可ということにするとBackSpaceが使えなくなってしまうのです。
また、Deleteキーの方はKeyPressイベントでは処理されないため常に使用できることになります。
このあたりの事情については初級講座第21回 マウス・キーボードからの入力で説明していますので参照してください。
基本的にはTextBoxの細かい入力制御は可能ではありますが、いろいろな事情によってプログラムがかなり複雑になりますのでどうしても必要でない限りやらない方がよいでしょう。
TextBoxでは何でも好きなように入力できるようにしておいて、最後の決定的なタイミングで入力内容が妥当かどうかチェックするのがVBにふさわしいスタンスです。KeyPressイベントなどを使用して逐一入力内容を制御しようとする場合は通常の3倍以上の作業量が必要であることを覚悟しておいてください。3倍というのは私の経験によります。
Wndowsフォームでの入力チェックはコントロールの種類によらず一番最後の決定的なタイミングで一括して行うのがベストです。一番最後の決定的なタイミングとはOKボタンや保存ボタンなど入力内容を確定させるタイミングのことを指しています。
どうしても入力するタイミングでチェックを行いたい場合はValidationイベントを使用するのが一般的です。
入力チェックについては初級講座第23回 コントロールの遷移制御で説明していますので参考にしてください。
Modifiedプロパティを使用するとユーザーによってTextBoxの入力内容が変更されているか調べることがわかるので、無駄なチェックを行わないで済みます。
次の例ではユーザーがTextBoxの内容を変更したかを判断します。
If
TextBox1.Modified Then MsgBox("変更されています。") End If |
■リスト20:Text変更を検出
ModifiedプロパティはプログラムからTextプロパティやLinesプロパティなどで文字列を変更しても反応しません。ユーザーによる変更のみに反応します。Modifiedプロパティには自由に値をセットできるので、プログラムからこの値を制御する場合もあります。
たとえば、一度ユーザーが文字列を変更してから保存ボタンを押したときのことを考えます。文字列を変更してから保存されるまでの間は文字列をチェックする必要が考えられるのでModifiedプロパティはTrueであることが期待されます。実際にこの状況では自動的にModifiedプロパティはTrueになります。
しかし、保存後は一度入力の検証が完了しているのですからModifiedプロパティはFalseに戻したいところです。この制御は自動では行われないため、プログラム中でModifiedプロパティの値を書き換える必要があります。
このようにしておけば、保存後に再度ユーザーが文字列を変更して保存を繰り返した場合にまたModifiedプロパティを使ってその文字列をチェックする必要があるのか判断することができます。
初期状態のTextBoxでは改行やタブを入力することはできませんが、プロパティの設定によって入力することが可能になります。
改行を入力できる条件は次の通りです。
・複数行対応である。(MultiLine = True)
・AcceptsReturn = Trueであるかフォームの既定のボタン(AcceptButton)が設定されていない。
フォームに既定のボタンが設定されている場合は改行のつもりでEnterキーを押してもそのボタンのイベントの方が優先で発生していしまいます。AcceptsReturnプロパティがTrueの場合には、改行コードの入力の方が優先されます。
タブを入力できる条件はAcceptsTagをTrueにすることです。
VB2005以降ではTextBoxにオートコンプリート機能が追加されました。この機能を使用すると文字列の一部分を入力しただけで入力候補が表示され素早い入力が可能になります。しかも、簡単なプロパティの設定だけですぐこの機能を使用することができてたいへん便利です。
■画像9:オートコンプリートの作動
ただし、複数行入力が可能なTextBoxではオートコンプリート機能は利用できません。
オートコンプリート機能は次のプロパティを使用して制御します。
メソッド・プロパティ | 説明 |
AutoCompleteCustomSource | AutoCompleteModeがCustomSourceの場合の入力候補の一覧を示します。 |
AutoCompleteMode | オートコンプリートの動作方法を示します。 |
AutoCompleteSource | 入力候補の一覧を示します。 |
■表6:オートコンプリートに関係するメソッドとプロパティ
オートコンプリートを有効にするには、まずAutoCompleteModeプロパティでモードを指定します。初期設定ではNone、つまりオートコンプリートなしが設定されています。
値 | 説明 |
None | オートコンプリートを無効にします。 |
Suggest | 提案モードでオートコンプリートを有効にします。 |
Append | 追加モードでオートコンプリートを有効にします。 |
SuggestAppend | 提案モードと追加モードの両方でオートコンプリートを有効にします。 |
■表7:AutoCompleteModeプロパティの設定内容
オートコンプリートには追加モード(Append)と提案モード(Suggest)があります。追加モードでは途中まで文字を入力した時点で最も可能性の高い入力候補が自動的にTextBoxに表示されます。ユーザーはそこで入力を中止して候補を確定することもできますし、そのまま入力を続けてさらに候補を絞り込んだり、候補にない文字列を入力することができます。
提案モードでは途中まで文字を入力した時点でコンボボックスのようなドロップダウンリストが表示されてユーザーはリストの中から目的の文字列を選択することもできますし、そのまま入力を続けてさらに候補を絞り込んだり、候補にない文字列を入力することができます。
入力候補の一覧を指定するにはAutoCompleteSourceプロパティを使用します。自由に入力候補の一覧を作成することもできますが、あらかじめ用意されている一覧を使用しても便利です。
値 | 説明 |
FileSystem | コンピュータのファイル・フォルダのパスを入力候補にします。 |
HistoryList | インターネットのURLの履歴を入力候補にします。 |
RecentlyUsedList | 最近使用したURLの履歴を入力候補にします。 |
AllUrl | HistoryListとRecentlyUsedListの両方を入力候補にします。 |
AllSystemSources | FileSystemとAllUrlの両方を入力候補にします。 |
FileSystemDirectories | コンピュータのフォルダのパスを入力候補にします。 |
CustomSource | AutoCompleteCustomSourceプロパティの内容を入力候補にします。 |
None | オートコンプリート機能を使用しません。 |
■表8:AutoCompleteSourceの設定内容
一例を示すとAutoCompleteModeをSuggestにして、AutoCompleteSourceをFileSystemにしたTextBoxでは数文字を入力するとそれに続くファイル・フォルダの一覧が自動的に表示されて非常に便利です。
この状態のときはパスの区切り記号の「\」を入力したタイミングで新しい候補が表示されます。
自由に入力候補の一覧を編集するにはAutoCompleteSourceをCustomSourceにしてから、AutoCompleteCustomSourceプロパティに入力候補の一覧を設定します。
AutoCompleteCustomSourceプロパティにはプロパティウィンドウを使用して値をセットすることもできますし、プログラムから値をセットすることもできます。
プロパティウィンドウを使用する場合は、ほかのプロパティでもしばしば登場する文字列コレクションエディタを使用します。
■画像10:入力候補の編集
プログラムから設定する場合は次のようになります。
Dim
List As New
AutoCompleteStringCollection List.Add("イーシー・ドバール錠") List.Add("イージブラスタ") List.Add("イータップS錠「イセイ」") List.Add("イエスタミン細粒") List.Add("イオウ") List.Add("イオダインM液") List.Add("イオダインガーグル液") List.Add("イカルス") List.Add("イクロール錠") List.Add("イコナゾンカプセル") List.Add("イコナゾンカプセル") TextBox2.AutoCompleteCustomSource = List |
■リスト21:カスタム入力候補の作成
データベースやファイルから入力候補を読み込むなどすれば十分に柔軟性の高い運用が可能になります。
■画像11:カスタム入力候補による提案モードの作動
なお、IMEを使用した入力の場合はIMEで確定後にオートコンプリートが動作するのでオートコンプリートのありがたみはあまりありません。
TextBoxは他のコントロールと同様の方法でデータ連結を設定できます。
データ連結についてはデータベース講座第6回 コントロールのデータ連結を参考にしてください。
よく何かのログイン画面で見かけるようなパスワード入力用にTextBoxを構成することができます。
■画像12:パスワード入力
PasswordCharプロパティはこの用途でTextBoxに表示する文字を指定します。PasswordCharプロパティに何か設定した場合にはユーザーが何を入力してもその設定した文字しか表示されません。たとえば、「*」や「●」が使用されているケースが多いようです。
システムで設定されている値を採用するにはUseSystemPasswordCharプロパティをTrueにします。通常はPasswordCharプロパティを個別に設定するのではなく、このUseSystemPasswordCharプロパティをTrueに設定するだけで十分です。
なお、ユーザーから隠蔽されるのは表示だけで、プログラム内部でTextプロパティなどを使って取得する文字列は通常通りです。パスワード設定によってプログラムを変更する必要は一切ありません。
同様の理由でこのパスワード機能は人間の目からパスワードを隠蔽することができますが、コンピュータの目からは丸見えです。そのためごく簡単なハッキングソフトを作成して入力内容を取得することができてしまいます。たとえば、MicrosotのSpy++を使ってパスワードが取得できることが確認できます。
ですから、この機能を過信して重要な情報をパスワード文字で表示してはいけません。
なお、何年か前にテレビや雑誌で話題となったパスワードをのぞき見するソフトというのはこの機能の性質を使用しているだけで特にセキュリティ上脅威になるようなものではありません。何も知らない一般人は「*」や「●」などのパスワード文字で表示している内容が、ほかのソフトを使って取得できてしまうことに驚いてしまうようです。
テキスト入力のカーソル(キャレット)の位置はSelectionStartプロパティで制御できます。ですから、フォーカスを取得したときにカーソルを先頭に移動することも末尾に移動することも可能です。
次の例ではフォーカスを取得したときにカーソルを文字列の末尾に移動します。
Private
Sub TextBox1_Enter(ByVal
sender As Object,
ByVal e As
System.EventArgs) Handles TextBox1.Enter TextBox1.SelectionStart = Len(TextBox1.Text) End Sub |
■リスト22:カーソル位置を末尾に移動
MaxLengthプロパティを使用するとユーザーが入力可能な最大文字数を指定できます。ユーザーはこの文字数を超えてTextBoxに文字列を入力することはできません。
ただし、この文字数はあくまでもユーザーが入力可能な文字数であってプログラムからはMaxLengthを超える長さの文字列をセットすることが可能です。また、設定値は文字数であってバイト数でない点にも注意が必要です。
最大文字数を指定しない場合はMaxLengthには0をセットします。0をセットした場合の最大文字数は環境によって異なりますがほとんどの環境であ2GB文の文字列かメモリの限界かのどちらかになります。既定値は32767です。
Windowsでのテキスト編集でよく使用するコピー、貼り付けなどもメソッドとして簡単に扱えるようになっています。
これらのメソッド・プロパティは引数なしで簡単に扱えます。
メソッド・プロパティ | 説明 |
CanUndo | Undo操作が可能であるか調べます。 |
Clear | TextBoxの文字列をすべて削除します。 |
Copy | 現在選択されている内容をクリップボードにコピーします。 |
Cut | 現在選択されている内容を切り取ってクリップボードにコピーします。 |
Paste | クリップボードの内容をキャレットの位置に挿入します。 |
Undo | 直前の操作を取り消します。 |
■表9:テキスト編集でよく登場する機能に関係するメソッド・プロパティ
次の例はTextBoxの現在選択されている内容をクリップボードにコピーします。
TextBox1.Copy() |
■リスト23:現在選択されている内容をクリップボードにコピー
A-4.全角文字の入力をエラーにする
A-5.数字以外の入力をエラーにする