DOBON.NET DOBON.NETプログラミング掲示板過去ログ

コンボボックスで大文字のみ入力を受け付けるには?

環境/言語:[Win2000,VB.NET]
分類:[.NET]

教えてください。

VB.NETでコンボボックスでテキストを入力した際に、
小文字が入力されても大文字に変更する
(イメージ的にテキストボックスのCharacterCasingプロパティをUpperに設定した
 時の動作)にはどのようにしたらよいでしょうか?
■No1422に返信(garopさんの記事)
> 教えてください。
>
> VB.NETでコンボボックスでテキストを入力した際に、
> 小文字が入力されても大文字に変更する
> (イメージ的にテキストボックスのCharacterCasingプロパティをUpperに設定した
>  時の動作)にはどのようにしたらよいでしょうか?
>
今手元に.NET環境がないので試せていませんが、
TextChangedイベント内でstrconv関数で大文字にってのはどうでしょう?
カーソル位置を保持させるなら変数にSelectionStartプロパティの値を退避させておいて、
strconv関数の後に戻してあげればいいかと。

※テキストボックスで良く使ってた手(全角変換)なんですけど、コンボボックスでもできたか記憶が定かではないのでご参考までに。
■No1432に返信(琴さんの記事)
> TextChangedイベント内でstrconv関数で大文字にってのはどうでしょう?
> カーソル位置を保持させるなら変数にSelectionStartプロパティの値を退避させておいて、
> strconv関数の後に戻してあげればいいかと。
>

琴さん、回答ありがとうございます。

早速、試してみたのですがカーソル位置の保存がうまくいきませんでした。

大文字に変換した瞬間に再度TextChangedイベントが発生してしまい、
そのときにSelectionStart=0となっています。
どのようにカーソル位置を保存しているのでしょうか?

以下、私が書いたコードです。

Private iSaveSelStart As Integer 'カーソル位置保存変数

Private Sub cmbProgID_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmbProgID.TextChanged

'カーソル位置保存
iSaveSelStart = Me.SelectionStart

'文字の変換
Me.Text = Me.Text.ToUpper

'カーソル位置を戻す
Me.SelectionStart = iSaveSelStart

End Sub
すいません。

コードを写し間違えましたので、もう一度書き込みます。

Private iSaveSelStart As Integer 'カーソル位置保存変数

Private Sub cmbProgID_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmbProgID.TextChanged

'カーソル位置保存
iSaveSelStart = cmbProgID.SelectionStart

'文字の変換
cmbProgID.Text = cmbProgID.Text.ToUpper

'カーソル位置を戻す
cmbProgID.SelectionStart = iSaveSelStart

End Sub
2003/11/14(Fri) 17:04:20 編集(投稿者)

> 早速、試してみたのですがカーソル位置の保存がうまくいきませんでした。
>
> 大文字に変換した瞬間に再度TextChangedイベントが発生してしまい、
> そのときにSelectionStart=0となっています。
> どのようにカーソル位置を保存しているのでしょうか?

カーソル位置を保持する変数を、イベント内で宣言するとうまくいくようです。
なぜかは私も判りません。 不思議です。(追記参照)
以下のように変更する事でカーソル位置が保存される事を確認しました。

Private Sub cmbProgID_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmbProgID.TextChanged

'カーソル位置保存変数
Dim iSaveSelStart As Integer

'カーソル位置保存
iSaveSelStart = cmbProgID.SelectionStart

'文字の変換
cmbProgID.Text = cmbProgID.Text.ToUpper

'カーソル位置を戻す
cmbProgID.SelectionStart = iSaveSelStart

End Sub

(追記)
よく考えたら2度イベントが発生してるからですね。
1度通れば充分な処理を2度行っている事になるので、
気になるようならカーソル位置が0の時は処理しないとか
少々工夫するといいかと思われます。
■No1442に返信(琴さんの記事)
> カーソル位置を保持する変数を、イベント内で宣言するとうまくいくようです。
> なぜかは私も判りません。 不思議です。(追記参照)
>
> 以下のように変更する事でカーソル位置が保存される事を確認しました。
>
> Private Sub cmbProgID_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmbProgID.TextChanged
>
> 'カーソル位置保存変数
> Dim iSaveSelStart As Integer
>
> 'カーソル位置保存
> iSaveSelStart = cmbProgID.SelectionStart
>
> '文字の変換
> cmbProgID.Text = cmbProgID.Text.ToUpper
>
> 'カーソル位置を戻す
> cmbProgID.SelectionStart = iSaveSelStart
>
> End Sub
>

琴さん、回答ありがとうございます。

上記のコードでうまくいきました。ありがとうございます。


> (追記)
> よく考えたら2度イベントが発生してるからですね。
> 1度通れば充分な処理を2度行っている事になるので、
> 気になるようならカーソル位置が0の時は処理しないとか
> 少々工夫するといいかと思われます。

カーソル位置を保存すると考えると、イベント内に宣言している変数だと
2度イベントが発生するとカーソル位置を保持していない気がしたのですが、保持しているというのが不思議です。しかし、VB側がいいようにしてくれて
いると信じて細かいことは気にせずに作っていきます。

ありがとうございました。
解決済み!
テキストボックスに文字を入力した時、一度目のChangeイベントが発生します。カーソル位置保存変数のインスタンスを作成し、現在のカーソル位置を保存しています。
その後、.ToUpperメソッドにより入力文字を大文字に変えた時、2度目のChangeイベントが発生します。2度目のChangeイベントでは、カーソル位置保存変数のインスタンスが新たに作成され、現在のカーソル位置(先頭位置に戻ってしまっているもの)が新たに作成されたインスタンスへ保存されます。ここでは大文字を大文字に変換しているだけなのでChangeイベントは起きません。こうして2度目のChangeイベントが終了し、1度目のChangeイベントの残りのコードが実行されます。
この残りのコードにより、最初に作成したカーソル位置保存変数に格納されているカーソル位置が、適用されることになっているようです。
再帰的アルゴリズムになっています。
カーソル位置保存インスタンスが再帰的アルゴリズムの内部で作成されているので、内部で起きた処理が内部で完結し、全体として矛盾が起こらないようになっているのでしょう。変数の定義を内部で行ってみた、というのは再帰ルーチンを完成させた大きな意味のある変更であったのだと思います。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板