[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2006/10/26(Thu) 22:42
投稿者名:あっちゃん
Eメール:
URL :
タイトル:
配列チェックボックスのkeyPreviewが効かない?
みなさま、ちょっと悩んでいますので相談させてください

質問内容を明確に伝えるために実際に使うフォームは使わず
簡易版で質問させていただきます

開発環境はVB6・WinXPProSP2 使用環境はXP・Windows2003Server・WinNTです

Form1というフォームにcmdEndというコマンドボタン
chkpassというチェックボックスが配列で0〜5で6つ有ります。

なお、フォームのkeyPreviewはTrueにしてあり
TabIndexは0からchkpass(0)→chkpass(1)→…→chkpass(5)→cmdEnd→chkpass(0)
となっています

chkpassにフォーカスがあり、Tabキーあるいは↑↓キーでフォーカスがムーブします。

chkpass(0)にフォーカスがあってShift+tabキーor↑キーを押すとchkpass(6)に
フォーカスがあたるようにしたいです(現在はcmdEnd)
またchkpass(5)にフォーカスがあってtabキーor↓キーを押すとchkpass(0)に
フォーカスがあたるようにしたいです(現在はcmdEnd)

ソースは

Private intindex As Integer  '配列番号を格納

Private Sub Form_Load()
    intindex = 0
End Sub

Private Sub chkpass_GotFocus(Index As Integer)
    '配列番号を取得
    intindex = Index  '★
End Sub

Private Sub chkpass_KeyPress(Index As Integer, KeyAscii As Integer)
    Call fsSpecialfocus(KeyAscii)
End Sub

Private Sub Form_KeyPress(KeyAscii As Integer)
    Call fsSpecialfocus(KeyAscii)
End Sub

Private Sub fsSpecialfocus(ByVal intascii As Integer)
    Select Case intascii
        Case vbKeyDown  '↓キー
            If intindex = 6 Then
                chkpass(0).SetFocus     'チェックボックス1へセットフォーカス
            End If
        Case vbKeyUp    '↑キー
            If intindex = 1 Then
                chkpass(5).SetFocus     'チェックボックス6へセットフォーカス
            End If
        Case vbKeyTab   'タブキー
            If intindex = 1 Then
                chkpass(5).SetFocus     'チェックボックス6へセットフォーカス
            ElseIf intindex = 6 Then
                chkpass(0).SetFocus     'チェックボックス1へセットフォーカス
            End If
    End Select
End Sub

Private Sub cmdEnd_Click()
    End
End Sub

です

ためしに★の次の行に

msgbox intindex をつけてテストすると
chkpass(0)にフォーカスがあると 0
chkpass(1)にフォーカスがあると 1

chkpass(5)にフォーカスがあると 5
のメッセージボックスが表示されます

この場合cmdEndにtabstopをfalseにすればいいかもしれませんが
冒頭で申し上げましたとおり
実運用ではもっと他にコマンドボタンやコンボボックスなどがありますし
業務用なので載せることは不可能です。
(ちなみにこれは自宅で作っています)

長くなってしまったので最終目的をもう一度書きます。

・chkpass(0)にフォーカスがあるときにShift + tab もしくは↑キーで
chkpass(5)にフォーカスを移動

・chkpass(5)にフォーカスがあるときにtab もしくは↓キーで
chkpass(0)にフォーカスを移動

です。

ご教授お願いいたします。

投稿時間:2006/10/26(Thu) 23:19
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: 配列チェックボックスのkeyPreviewが効かない?
KeyPress イベントでは、TAB キーや ↑キーは取得できないはずですが。

↑キー は、KeyDown イベントでは取得できますが、TAB キーはどちらでも取得できません。
但し、全てのコントロールのTabStopをFalseに設定するかGetKeyState API関数を使用すれば
取得する事ができます。

 http://hanatyan.sakura.ne.jp/vbhlp/specialkey.htm

  下記のコードをForm に貼り付けて試して見て下さい。
 http://hanatyan.sakura.ne.jp/vbhlp/ReMoveTab.htm

投稿時間:2006/10/27(Fri) 00:45
投稿者名:あっちゃん
Eメール:
URL :
タイトル:
Re^2: 配列チェックボックスのkeyPreviewが効かない?
Tabキーの移動は思うようになりました

Private Sub chkpass_LostFocus(Index As Integer)
    If GetKeyState(vbKeyTab) < 0 And _
                            GetKeyState(VK_SHIFT) < 0 Then
        If intindex = 0 Then
            chkpass(5).SetFocus
        End If
        
    ElseIf GetKeyState(vbKeyTab) < 0 Then
        If intindex = 5 Then
            chkpass(0).SetFocus
        End If
    End If
End Sub


↑↓キーはまだできませんね

もう少しがんばってみます。

花ちゃんさんありがとうございました

投稿時間:2006/10/27(Fri) 12:26
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: 配列チェックボックスのkeyPreviewが効かない?
> ↑↓キーはまだできませんね

できますよ! できましたよ。

サンプルをすべてペーストして試してみましたか?
一番上か下のプロシージャをペーストし忘れていませんか?(削除していたり)

サンプルを全てペーストしてもダメなら、どこかに余分なコードがありませんか?

投稿時間:2006/10/28(Sat) 00:59
投稿者名:あっちゃん
Eメール:
URL :
タイトル:
自宅ではできたのですが
昨日の投函後、手直ししましたら↑↓キーの移動もできるようになりました。
(報告を忘れて申し訳ございません)

しかし、業務で取り入れようとしましたがうまくいきませんでした。
さらにサンプルを参考に会社のPCで小さなツールを作ってみましたが、
動きませんでした。

土日は休みなのですぐに再検証できませんが、
また来週以降がんばってみます。

花ちゃんありがとうございました