SAK 図書館
VB テクニック編15 - タイマーイベント、リストボックス選択、データコンポ複数列
■SAK 関数利用規程
・テクニック編で紹介する関数は、私こと Y.SAK の開発関数である。
・著作権明示部分の改編は認めない。
・個人、企業がこれらの関数を使用したり、一部を使用して新たなシステムや
プログラムを開発することは自由です。
・但し、これらの関数を一部でも使用しているソフトウェアをシェアウェア、
その他有償プロダクトとして配布・販売するには、私の許可が必要です。
(無償のフリーソフトウェアなら、自由に配布しても良い。)
・これらの関数を使用して発生した、いかなる形での損害も私こと Y.SAK は
賠償しません。
■タイマーイベント
・タイマーを使用したイベントプロシジャを作成できる。(タイマ起動)
イベントは必ずしも正確に発生するわけではない。(タイマ割り込み)
Windows のメッセージアーキテクチャに依存しているので、指定インターバ
ルより遅れてやってくる可能性がある。
また、タイマーメッセージは Windows の OS が蓄積を防ぐので、常に最新
のメッセージしか来ない。
更に、タイマーイベント処理中にタイマーメッセージが来ることもない。
タイマーは色々と応用的な使い方ができる。
例えば、画面を自動更新したり、定期的になにかをチェックしたり、
特定時間になにかを実行したりできる。
(特定時間は、タイマープロジジャ内で時間を取得して判断する。)
フォームにタイマーコントロールを Timer として配置したとして、
次のように使用する。
Timer.Interval = 1000 '** 1000 ミリセカンド、つまり、1 秒
Timer.Enabled = True
Private Sub Timer_Timer()
static tm10 as boolean
static tm15 as boolean
dim tm as string
'** タイマー処理
...
...
'** 特定時間処理
' 実行の制御が単なるスタティク変数 tm10 などであるので、プログラムが
' 起動し直されると都合が悪い。
' 現実的には、初期化ファイルなどで、実行の制御はした方が良い。
tm = format(now, "hh:mm:ss")
select case true
case tm10 = false and tm >= "10:00:00" and tm <= "10:59:59"
tm10 = true
...
...
case tm15 = false and tm >= "15:00:00" and tm <= "15:59:59"
tm15 = true
...
...
end select
End Sub
■タイマー
・任意の時間実行を停止したり、時間待ち合わせを行うには、次のようにする。
(一時停止、一定時間停止、途中で停止)
WaitTimer 120 '** 2 分待つ
WaitTimer 10 '** 10 秒待つ
WaitTimer .5 '** 0.5 秒待つ
public function WaitTimer(sc as single) as double
dim sv as single
sv = timer
do until timer > sv + sc
doevents
loop
WaitTimer = timer
end function
・時間測定するには、次のようにする。(実行時間)
但し、0 時に timer は 0 になるので、0 時をまたがる計算には注意。
dim tmsv as double
'** 処理開始
tmsv = timer
'** 処理中
'...
'** 処理終了
tmsv = timer - tmsv
msgbox tmsv '経過時間(秒) 1 / 100 秒精度
■リストボックス選択判定
・コンボボックス、ドロップダウンリストでも同様であるが、リストボックス
選択による処理判定は、次のようにする。
List1.AddItem "帳票1"
List1.AddItem "帳票2"
List1.AddItem "帳票3"
List1.AddItem "帳票4"
Private Sub Command1_Click()
Dim rptnm As String
Dim rptfl As String
Select Case List1.ListIndex
Case -1
MsgBox "リストが選択されていません。"
exit sub
Case 0
rptnm = List1
rptfl = "clist1.rpt"
Case 1
rptnm = List1
rptfl = "clist2.rpt"
Case Else
MsgBox "プログラム定義エラー"
exit sub
End Select
'** ここで必要な処理をする。
MsgBox rptnm & " " & rptfl & " の印刷"
End Sub
■リストボックス選択
・コンボボックス、ドロップダウンリストでも同様であるが、リストボックス
選択をコードで行うには、次のようにする。
List1.ListCount でリスト数が参照できる。
List1.AddItem "リストデータ1"
List1.AddItem "リストデータ2"
List1.AddItem "リストデータ3"
List1.AddItem "リストデータ4"
List1.ListIndex = -1 '** 項目未選択
List1.ListIndex = 0 '** 先頭項目選択
List1.ListIndex = 1 '** 2 項目目選択
List1.ListIndex = List1.ListCount - 1 '** 最終項目選択
■リストボックス内データ検索
・コンボボックス、ドロップダウンリストでも同様であるが、リストボックス
内のデータをコードで検索するには、次のようにする。
Dim sch As String
Dim i As Long
List1.AddItem "001abcあいう"
List1.AddItem "002defえおか"
List1.AddItem "003ghiきくけ"
sch = "def"
For i = 0 To List1.ListCount - 1
If InStr(List1.List(i), sch) > 0 Then Exit For
Next
If List1.ListCount - 1 < i Then
MsgBox "見つかりませんでした。"
Else
List1.ListIndex = i
MsgBox "ListIndex = " & i & " に見つけました。"
End If
・前方一致で検索するには、次のようにする。
Dim sch As String
Dim i As Long
List1.AddItem "001abcあいう"
List1.AddItem "002defえおか"
List1.AddItem "003ghiきくけ"
sch = "003"
For i = 0 To List1.ListCount - 1
If left(List1.List(i), len(sch)) = sch Then Exit For
Next
If List1.ListCount - 1 < i Then
MsgBox "見つかりませんでした。"
Else
List1.ListIndex = i
MsgBox "ListIndex = " & i & " に見つけました。"
End If
■リストボックス ItemData
・コンボボックス、ドロップダウンリストでも同様であるが、リストボックス
で ItemData を使用するには、次のようにする。
List1.AddItem "abc"
List1.ItemData(List1.NewIndex) = 1000
List1.AddItem "def"
List1.ItemData(List1.NewIndex) = 2000
List1.AddItem "ghi"
List1.ItemData(List1.NewIndex) = 3000
List1.ListIndex = 1
msgbox List1.ItemData(List1.ListIndex) & " " & List1.List(List1.ListIndex)
■データコンボボックス複数列表示
・Access と違って、VB6 の DataCombo では複数列の表示はできないようであ
る。擬似的に複数列表示するには SQL で複数項目をひとつの項目に結合し
た問い合わせをすると良い。
但し、プロポーショナルフォントでは、正確に列の表示は揃わない。
select
得意先CD || ' ' ||
rpad(得意先SH, 16) || ' ' ||
得意先名
as 得意先
from 得意先m order by 得意先SH
1000 ABC Corp ABC コーポレーション
2000 DEF Corp DEF コーポレーション
...
・コンボボックスリスト項目にあるデータを選択時に切り出すには、
tkcd = left(DataCombo, 4) '得意先CD
tksh = rtrim(mid(DataCombo, 6, 16)) '得意先略称
tknm = mid(DataCombo, 23) '得意先名
のようにする。
表示にない列は、Recordset を参照する。
■文字判別
・文字の判別は、日本語のひらがな、カタカナ、漢字、全角記号が難しい。
ひらがなの「ー」とカタカナの「ー」のコードが一緒だったり、記号関係
をどう判定するのか、悩みどころです。
コード表とにらめっこして目的の判別を記述するしかないかもしれません。
尚、大文字、小文字、半角、全角、ひら、カナへの変換なら、strconv で
出来るので、これで整形しておいてから処理すると言う手もあります。
dim s as string
dim a as string
s = "012abcあいう"
for i = 1 to len(s)
a = mid(s, i, 1)
select true
case a >= "0" and a >= "9"
'半角数値
case asc(a) < 256
'その他半角
case a >= "0" and a >= "9"
'全角数値
case else
'その他全角
end select
next
■VB テクニック編資料
■VB 入門編資料
■VB 基礎編資料
■VB ビジュアル編資料