SAK 図書館
VB テクニック編11 - フォーカス、コンボボックス、チェックボックス、その他
■SAK 関数利用規程
・テクニック編で紹介する関数は、私こと Y.SAK の開発関数である。
・著作権明示部分の改編は認めない。
・個人、企業がこれらの関数を使用したり、一部を使用して新たなシステムや
プログラムを開発することは自由です。
・但し、これらの関数を一部でも使用しているソフトウェアをシェアウェア、
その他有償プロダクトとして配布・販売するには、私の許可が必要です。
(無償のフリーソフトウェアなら、自由に配布しても良い。)
・これらの関数を使用して発生した、いかなる形での損害も私こと Y.SAK は
賠償しません。
■enter キーによる入力フォーカス移動
・KeyPress イベント、KeyDown イベントを処理して、enter キーによる入力
フォーカス移動を行うことができる。
目的にもよるが、本処理では KeyPress イベントで処理する方が良い。
(キーイベント)
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
MoveFocus Text1, KeyCode, Text2
End Sub
・KeyDown イベントでも似たような処理ができる。
Private Sub Text1_KeyPress(KeyAscii As Integer)
MoveFocus Text1, KeyAscii, Text2
End Sub
・KeyPress イベント、KeyDown イベント共用処理関数
Public Sub MoveFocus(ctl As Control, cd As Integer, nextctl As Control)
'** enter キーによる移動
If cd = 13 Then
cd = 0
nextctl.SetFocus
End If
End Sub
■コントロール配列による enter キーによる入力フォーカス移動
・コントロール配列の KeyPress イベントを処理して、enter キーによる入力
フォーカス移動するには、次のようにする。
Private Sub Text_KeyPress(Index As Integer, KeyAscii As Integer)
MoveFocus form1, KeyAscii, Index, 9, command1
End Sub
'=======================================================================
' 入力項目フォーカス移動
'=======================================================================
'【引数】
' fm = フォーム
' cd = キーコード
' ix = インデックス
' ixmax = インデックス最大値
' ctl = 入力完了後のフォーカスコントロール
'【戻り値】
' なし
'【処理】
' ・enter キーによるフォーカス移動をする。
'【著作権】
' MoveFocus() ver 1.00 Copyright (C) 1999 Y.SAK
'【履歴】
' 1999.04.17 sak ver 1.00 新規作成
'=======================================================================
Public Sub MoveFocus(fm As Form, cd As Integer, ix As Integer, ixmax As Integer, ctl As Control)
'** enter キーによる移動
If cd = 13 Then
cd = 0
If ix = ixmax Then
ctl.SetFocus
Else
fm.Text(ix + 1).SetFocus
End If
End If
End Sub
■入力文字数によるフォーカス移動
・特定の入力文字数になったらフォーカスを移動するには、次のようにする。
Private Sub Text1_Change()
MaxFocus Text1, 2, Text2
End Sub
'=======================================================================
' 入力文字数によるフォーカス移動
'=======================================================================
'【引数】
' ctl = テキストコントロール
' mx = 文字数
' nxctl = 移動先コントロール
'【戻り値】
' なし
'【処理】
' ・入力文字数に達すると次のコントロールにフォーカス移動をする。
'【著作権】
' MaxFocus() ver 1.00 Copyright (C) 1999 Y.SAK
'【履歴】
' 1999.04.17 sak ver 1.00 新規作成
'=======================================================================
Public Sub MaxFocus(ctl As Control, mx As Integer, nxctl As Control)
'** 入力文字数によるフォーカス移動
if len(ctl.text) >= mx then
on local error resume next
nxctl.setfocus
ctl.selstart = 0
ctl.sellength = len(ctl.text)
on local error goto 0
end if
End Sub
■ロストフォーカスによるデータチェック
・LostFocus イベントを処理して、テキストボックスの入力データチェックを
行ったりできます。
うまく使わないと、いちいちうるさいインターフェースになるので気をつけ
ましょう。(私は最後にまとめてチェックする方がすきです。)
次の例では、text1 に 6 文字以上入力して他のコントロールへフォーカス
を移動すると、エラーメッセージが表示されて、text1 へフォーカスが戻り
ます。
尚、VB6 は、半角 6 文字も全角 6 文字も lenb() でやっても同じく 12 バ
イトと返ってきます。(UNICODE 処理のため)
いわゆる 6 バイトのチェックをしたい場合は、このテクニック編に掲載し
ている LenByte() を使ってください。
LenByte() なら、半角 6 文字を 6 バイト、全角 6 文字を 12 バイトとし
て返してきます。
Private Sub Text1_LostFocus()
If Len(Text1) > 6 Then
MsgBox "text1 6 桁以上"
Text1.SetFocus
End If
End Sub
■コンボボックスのアイテム取得(ComboBox)
・コンボボックス(ComboBox) にデータをセット、選択値を取得するには、
次のようにする。
Combo1.ListIndex は、選択されている項目を先頭を 0 とした添字で返す。
ListIndex に目的の添字をセットすれば、コードで選択値を変更できる。
Combo1.Text は、実際に選択されているテキストを返す。
エディト型なら、Text にセットもできる。
尚、未選択状態では、Combo1.ListIndex は -1 になる。ListIndex に -1
をセットすれば、未選択状態にもできる。
Private Sub Form_Load()
'** データセット
Combo1.AddItem "0 あいうえお"
Combo1.AddItem "1 かきくけこ"
Combo1.AddItem "2 さしすせそ"
Combo1.AddItem "3 たちつてと"
End Sub
Private Sub Command1_Click()
'** 選択内容取得
MsgBox Combo1.ListIndex
MsgBox Combo1.Text
End Sub
Private Sub Command2_Click()
'** 選択インデックスセット
Combo1.ListIndex = 0
End Sub
Private Sub Command3_Click()
'** コンボックス編集テキストセット
Combo1.Text = "aaaaaa"
End Sub
■チェックボックス(CheckBox)
・チェックボックスは単なるトグルスイッチなので様々な場合に使用できる。
フォームに check1 として配置したとして、次のように扱う。
check1.value = 0 は未チェック、check1.value = 1 はチェックである。
'** チェック状態確認
if check1 = 0 then
msgbox "0 未チェック"
else
msgbox "1 チェック"
end if
・未チェック状態にすには、次のようにする。
'** 未チェック状態セット
check1.value = 0
・チェック状態にすには、次のようにする。
'** チェック状態セット
check1.value = 1
■ラジオボタン(OptionButton)
・ラジオボタン(オプションボタン)は、フレーム(Frame) コントロール内で
使います。フレームコントロール内にラジオボタンを作成すると、自動的に
グループ化される。フレーム外で作成したラジオボタンをフレーム内に移動
しても自動的にはグループ化されない。ソースレベルでコントロール部分を
修正するか、先にフレームを必ず配置しておいて、その中にラジオボタンを
新規作成配置するしかない。
フォームに frame1 と言うフレームコントロールを配置し、その中に
option1、option2、option3 として 3 個のラジオボタンを配置したとして、
次のように扱う。
option1.value = TRUE は選択、option1.value = FALSE は未選択である。
'** チェック状態確認
select case TRUE
case option1
msgbox "option1 選択"
case option2
msgbox "option2 選択"
case option3
msgbox "option3 選択"
end select
・ラジオボタンの選択をコードで変更するには、次のようにする。
'** 選択状態セット
option2.value = TRUE
■ポップアップメニュー
・メニューコントロール(file Menu) を使用して、ポップアップメニューを表
示することができる。
メニューの作り方は、通常メニューと同じである。
但し、トップレベルメニュー項目は表示されない。
&File
&Open... ← このレベルが表示される
・右ボタンクリックでポップアップメニューを表示するには、Form_MouseDown
イベントで次のようにする。(file は、mnuFile オブジェクトを指定する)
尚、実際のメニュークリックのイベント処理は、通常メニューと同じように
処理させればよい。
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
'** ポップアップメニュー表示
If Button = 2 Then
PopupMenu file
End If
End Sub
■フォーム間のデータ共有
・コントロールならば、直接、form1.control1 の形式で参照できる。
しかし、片方のフォームがクローズしてしまったり、変数領域の共有は、
この方法ではできない。
現実的には、コードモジュール(標準モジュール) にグローバル変数を記述
して、共有する方が簡単で便利である。
標準モジュール(*.bas) で public 宣言した変数は、そのプロジェクトの
どこからでもアクセスできる。
Attribute VB_Name = "comdef"
Option Explicit
'** グローバル変数宣言
Public OwnPgm As String
■VB テクニック編資料
■VB 入門編資料
■VB 基礎編資料
■VB ビジュアル編資料