初音 玲 HATSUNE, Akira
| WindowsとVisual Basicの関係 |
|---|
| [Enter]キーによるカーソル移動を考える |
|---|
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim ctlFocusObject As Control
If KeyCode = vbKeyReturn Then
' 現在のアクティブコントロールを取得
Set ctlFocusObject = Me.ActiveControl
' アクティブコントロールを使用不可にして、
' 次のコントロールにフォーカスを移動させる
ctlFocusObject.Enabled = False
' もともとフォーカスのあったコントロールの使用可に戻す
ctlFocusObject.Enabled = True
End If
End Sub
|
|
Caution! POINT-1
日本語入力中のときは、事前に文字を確定しなければならない。つまり【文字確定】→【カーソル移動】となるために、[Enter]キーを2回連続して押さなければならない、ということだ。もし、日本語確定と同時にカーソルを移動させたいのであれば、IME関係のAPIを駆使しなければいけないだろう。 |
|
How To Extend-1
[Enter]キーでコマンドボタンにカーソルが移動しないようにサンプルを変更。これは、コマンドボタンのTabStopプロパティをFalseにすることで実現可能だ。 |
|
Caution! POINT-2
コマンドボタンの上でも[Enter]キーで次のコントロールに移動したいという要望は、危険ポイントだ。この要望は、中途半端にWindowsを知っているときに出てきやすい。つまり[TAB]キーの代わりに[Enter]キーを使ってしまおうという発想だ。テンキー部分のみですべてをまかなおうとすれば、[TAB]キーの代わりに[Enter]キーをということになりかねない。 しかし、コマンドボタンで[Enter]キーを特別に認識することはできないのだ。サンプルプログラムのcmdEnter_KeyDownおよびcmdEnter_KeyPressプロシージャにForm_KeyPressプロシージャのロジックをコピーして確認して欲しい。そもそも[Enter]キーを押したところで、KeyDownイベントもKeyPressイベントも発生してくれないのだ。もちろん、他のキーならば、きちんとイベントは発生する。 [TAB]キーの代わりを[Enter]キーでまかなうことは、Visual Basicでの開発を前提とするならば、制限付きの仕様ということになる。 |
|
How To Extend-2
テキストボックスである特定の文字を入力すると改行するという仕様にする。 テキストボックスのKeyPressプロシージャで、[Enter]キーの無視と特定文字の改行化を記述する(リスト2)。 リスト2:
Private Sub txtEnter_KeyPress(Index As Integer, KeyAscii As Integer)
If KeyAscii = vbKeyReturn Then
KeyAscii = 0
ElseIf KeyAscii = Asc("/") Then
KeyAscii = vbKeyReturn
End If
End Sub
|
|
Caution! POINT-3
[Enter]キー以外に改行する方法があると自然に気がつく人がどれくらいいるだろうか。ヘルプに記述したりツールチップで表示したりする以外に、フォームのあいている部分に、ずばり「テキストボックス内での改行は、“/(半角スラッシュ)”です」と記述するなどの工夫が必要だろう。 |
|
Caution! POINT-4
テキストボックスに入力したい文字以外を特定文字にするが、もし、その特定文字をテキストボックスに入力したくなった場合には、プログラムの変更が生じる。 |
| [PF]キー対応を考える |
|---|
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyF1 Then
' 実行
Call subExecute
ElseIf KeyCode = vbKeyF3 Then
' 取消
Call subCancel
ElseIf KeyCode = vbKeyF7 Then
' 前頁
Call subPrev
ElseIf KeyCode = vbKeyF8 Then
' 後頁
Call subNext
ElseIf KeyCode = vbKeyF10 Then
' 確定
Call subCommit
End If
End Sub
|
|
Caution! POINT-5
コマンドボタンを左クリックしたとき、モーダルウィンドウなどを表示さえしていなければ、そのフォームがフォーカスをもっていなくてもフォームをアクティブにし、かつ、コマンドボタンにもフォーカスが移されるだろう。 この動作を[PF]キーで代替することは、大変困難だ。それは、Visual Basicの機能を使っている限り、どうがんばってもキー入力を受け取るのは、アクティブなウィンドウだからだ。その制限を打ち破るには、Windowsの“キーが押された”メッセージを直接横取りして、無理矢理所定のウィンドウに投げつけてやる必要がある。VB5以降では、Address Ofなどを使って、ロジックの一部をサブクラス化して、Windowsメッセージをフックすることが可能(図6)だが、デバグの手間及び処理効率を考えると、文化オリエント株式会社から発売されているSpyWorksProのDWSHK32.ocxなどを使うのが良いだろう。 図6:Windowsメッセージの流れ
|
図9:ショートカットの種類
![]() |
図10:同一ショートカット設定字のエラーメッセージ
![]() |
Private Sub mnuPcKey_Click(Index As Integer)
If Index = 0 Then
' 実行
Call subExecute
ElseIf Index = 1 Then
' 取消
Call subCancel
ElseIf Index = 2 Then
' 前頁
Call subPrev
ElseIf Index = 3 Then
' 後頁
Call subNext
ElseIf Index = 4 Then
' 確定
Call subCommit
End If
|
| さいごに |
|---|