テキストボックスにフォーカスがあり、TABキーが押された時のイベントをひろいたいのですが、KeyPressもKeyDownもイベントが発生しません。

(If KeyCode = vbKeyTab Then
 MsgBox "タブキー"
End If 

If KeyAscii = vbKeyTab Then ~
のようなコードを記述してもメッセージが表示されない)

ヘルプにはKeyDownでは発生しないという記述がありますが、KeyPressではイベントがひろえるようなことが書いてあるのにひろえないので困っています。

なにかよい方法はありませんでしょうか。
わかりにくい説明で申し訳ありませんが困ってます。
宜しくお願いします。

A 回答 (4件)

テキストボックスのほかに、コントロールを貼り付けていませんか?


他のコントロールにタブ移動していてイベントがこなくなっているのでは?
フォーカスを当てられるほかのコントロールのTabStopをFalseにすればいいのでは?
違ってたらすんません。
じゃ、そゆことで。
    • good
    • 1
この回答へのお礼

貼り付けてました・・・。
見た目は全部ラベルだったのでおかしいなとよくよく見たらテキストボックスの不活性継承の為のピクチャボックスがTabstop=Trueになってました。
おかげさまで無事TAB拾えました。どうもありがとうございました。

お礼日時:2001/09/10 02:22

確かにKeyPressでTABキーを拾えませんね(VB4)


対処方法は参考URLにあります

参考URL:http://www.kit.co.jp/vbit/QAndA01.htm
    • good
    • 0
この回答へのお礼

為になる参考URL教えていただきありがとうございました。無事解決しました。

お礼日時:2001/09/10 02:23

KeyPressイベントなら、次のどれでも出来るはずです。

(確認済)

例1)
Dim str As String

str = Chr(KeyAscii)
If str = vbTab Then
MsgBox "Tab key!"
End If

例2)
If KeyAscii = 9 Then
MsgBox "Tab key!"
End If

例3)
If KeyAscii = vbKeyTab Then
MsgBox "Tab key!"
End If
    • good
    • 0
この回答へのお礼

動作確認までして頂いて、丁寧なご回答どうもありがとうございました。
無事解決しました。ありがとうございます。

お礼日時:2001/09/10 02:27

こんにちは。

itohhといいます。

KeyPressとKeyDownイベントの引数ですが、意味合いが違います。

KeyPressイベントのKeyAsciiは、Asciiコードが設定されてきます。
KeyDownイベントのKeyCodeは、VBで決めているキーコード定数が設定されてきます。

KeyPressイベントでTabを拾いたい場合は、以下のように行います。
Private Sub Text1_KeyPress(KeyAscii As Integer)
  Dim Rtn As Integer

  If KeyAscii = Asc(vbTab) Then
    Rtn = MsgBox("Hit!!", vbOKOnly)
  End If

End Sub
    • good
    • 0
この回答へのお礼

質問時にコピーしてコードを書いてしまったのでKeyPressとKeyDownのコードを同じにしてしまいました・・・。間違いのご指摘ありがとうございます。
無事解決しました。どうもありがとうございました。

お礼日時:2001/09/10 02:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QIf Not c Is Nothing Then ~延々処理が続く~ End If

質問というか相談というか
VBAで下記のようなコードをよく見ますし、私自身もこれで書いてます。

For i= 1 to 10
set c=Range.Find(”いろは")
If Not c Is Nothing Then


処理が続く


End If
Next i

cが見つからなかったら、さっさと次の i に進む場合の処理です。Ifの字下げがず~~っと延々続き、最後のNext iの直前でEnd If です。
・Exit For はあるのに 途中Next iは出来ない
・Goto 使って書くと「スパゲティプログラムだ」とか言われる
正直言って、上記コードとGotoスパゲティで可読性に差異があるとは思えません。何でもかんでもGotoはダメていう風潮がおかしいように思えます。

みなさんどうやって書いてますか?

Aベストアンサー

こんにちは。

>Goto 使って書くと「スパゲティプログラムだ」とか言われる
どっちかというと、今は、ネットの中で、某VBA系の専門掲示板で、他人のコードを罵る時に使う用語ですね。Goto を使ったから、スパゲティーと短絡して使うのに、その言った本人は、エラー処理ひとつ施していない隙だらけのコードだということが多いのです。「スパゲティプログラム」は、◯◯の一つ覚えの用語だと思います。

>For i= 1 to 10
>set c=Range.Find(”いろは")
>If Not c Is Nothing Then

>~
>処理が続く
>~
>
>End If
>Next i

これって、よく見るとおっしゃっていますが、ひとつ例外に、いわゆる「ブルートフォースアタック(総当り制)」のコードがありますね。それは、Goto 以外に抜け出せる方法がありませんね。「深いネストはするな」という禁を犯しているのだから、Goto 以前のものがあります。(何に使うかはご存知だと思いますし、それをとやかく言う人はいないでしょう。)

これを書き換え、再帰を使うと良いとか言う人もいるのでしょうけれども、そういうのは、知識だけで実際にやったことがない人の話だと思います。「スパゲティ」とか知らない人に、比べさせれば、再帰などを使った方法は、遅くてダメ出しされるのは目に見えています。特殊な例ですが。

ご質問で、実際の私は、内容にもよりますが、
Private flg As Boolean

Sub Main()
On Error Goto ErrHandler
For i= 1 to 10
 Call subRutine(findTxt)
 If flg Then Exit For
Next i
Exit Sub

ErrHandler:
処理
End Sub
'ここの中身はテンプレート化してあります。
Private Sub subRutine(ByVal findTxt) または、Public
'処理
End Sub

としているはずで、モジュールレベルの変数を、flg とし、サブルーチンの中に置いて、目的がかなったら、Flgは、Trueになって、ループから抜け出すようにします。

サブルーチン側では、End ステートメントを使用することさえもあります。(テンプレート化しているのは、Findメソッド、RegExpの正規表現、Sortメソッド、Dictionary とSortLists などがあります。[MZ-Tools 3.0]を使用)

GOTO は、構造化プログラムが登場した時に、排除するように言われてきたものです。古い時代の人は、GOTOに逃げたくなるのを抑えるために、「GOTO」を使うなって、肝に命じてきたのです。しかし、結局、Goto は、なくならなかったのは、一つには、ErrHandlerを使った、エラートラップのせいもあります。だから、Goto を書かないでErr.Raise (513~)で飛ばす方法がありますが、あまり使う人はいません。

ところで、
「スパゲティプログラム」という話に振られると、私は自信がありません。
読みやすさ(可読性)の対極になるものでしょうけれども、誰に対して言っているものか、ということです。私の大事にしている本の中に、アスキーの『QuickBASICプログラミング道場』(1991年)という本があります。

---引用
・本道場で推奨するプログラミングスタイル (p25~)

1.変数・定数・プロシージャーの命名法 (変数の型のサフィックスは使うな)
2.インデントを付けるべし
3.メインプロシージャは短くすべし
4.プロシージャは短くすべし
5.長いブロックはプロシージャーにすべし
6.汎用性のあるプロシージャーを作るべし
7.定数は活用すべし
8.GOTOは乱用(濫用)すべからず。●
 従来のBASICを使ってきた人の中には、GOTO文を多用する人がいるようだ。GOTO文はそのときは便利なように思うが、あとになってリストを眺めてみると、どこに飛んでいるか分からなくなることが多い。……わけがわからない最低の"スパゲティプログラム"になってしまう。
 【例】GOTO文をDOループに置き換える
----引用終わり

現代でも通用するというよりも、その言葉が生まれた時代背景がありますから、必ずしも、GOTOが問題だということではなさそうです。Goto を使わないということにこだわると、逆に墓穴を掘ることになります。

それと、DO ループにするというのは、DO ~ LOOPの間に緊張感(?)は生まれるけれども、無限ループを生み出しやすくなるのです。その頃はそれで良かったかもしれませんが、もうESCでは止まりません。今は必ずしも認められるものではありません。

それと、記録マクロを、そのままVBAプロシージャーに用いるのは、絶対にダメなのですよね。本当のスパゲティプログラムになってしまいます。ベタ書きになってしまうからで、一度、そういうコードを直してくれと言われましたが、怒りを抑えて、丁重にお断りました。

こんにちは。

>Goto 使って書くと「スパゲティプログラムだ」とか言われる
どっちかというと、今は、ネットの中で、某VBA系の専門掲示板で、他人のコードを罵る時に使う用語ですね。Goto を使ったから、スパゲティーと短絡して使うのに、その言った本人は、エラー処理ひとつ施していない隙だらけのコードだということが多いのです。「スパゲティプログラム」は、◯◯の一つ覚えの用語だと思います。

>For i= 1 to 10
>set c=Range.Find(”いろは")
>If Not c Is Nothing Then

>~
>処理が続く
>~
>
>End If
>Next...続きを読む

Q条件付きコンパイル: #IF 1 Then と #IF 0 Then

条件付コンパイルで、
『#If 1 Then』と『#If 0 Then』の条件の違いを教えてください。


『#If ○○○=1 Then』などの場合はわかるのですが、
単に『#If 1 Then』の場合は何をもって真となるのでしょうか?

よろしくお願いいたします。

Aベストアンサー

条件式は、強制的に「True」又は「False」に解釈されます。

で、「数値」を「True」又は「False」に解釈する場合、
「0」は「False」、「0以外」は「True」になります。
(http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/script56/html/vsfctcbool.asp)

つまり、
『#If 1 Then』は、「必ずTrue」=常に有効
『#If 0 Then』は、「必ずFalse」=常に無効
に成ります。

QKeyDownイベントで数字以外は発生しません。なぜでしょうか。

KeyDownイベントで数字以外は発生しません。なぜでしょうか。
電卓を作っているのですが、キーボードからの対応をしているさなか大きな壁に当たりました。
フォームのKeyDownイベントでキーボードからの入力をキャッチする。
数字や演算、エンターキー。
フォームには、電卓を作るのに必要なボタンなどの配置はしてあります。
数字を表示する部分はLabel1にしています。
試験的に下記のソースで実験したところ、テンキーの数字以外、例えば演算キーをキーボードから入力すると、下記のソース通りならば、○算と表示されるはずです。しかし、なぜか数字と表示されます。
つまり、演算キーを押したにも関わらず、数字が入力されたとして処理されたということです。
なぜでしょうか。
そして、試験的にそれぞれが入力成功した時はLabelに表示されるようにしました。


Private Sub Form6_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
//↓エンターキーが押されたとき

If e.KeyCode = Keys.Enter Then
Label1.Text = "Enter"

//↓演算キー及び点が入力されたとき

ElseIf &H6A <= e.KeyCode <= &H6F Then
Select Case e.KeyCode
Case &H6A
Label1.Text = "乗算"
Case &H6B
Label1.Text = "加算"
Case &H6D
Label1.Text = "減算"
Case &H6E
Label1.Text = "小数点"
Case &H6F
Label1.Text = "除算"
End Select
End If

//↓delキーが押されたときの場合

If e.KeyCode = Keys.Delete Then
Label1.Text = "Del"
End If

// ↓は数字1から9までが対象に入ります。

If &H60 <= e.KeyCode <= &H69 Then
  Label1.Text = "数字"
End If
End Sub

keycode表はマイクロソフトのキーコード定数を見て作りました。
僕がお伺いしたいのは、これらすべてを正常に対応させたいわけです。
数字、演算キー、その他のキーボード入力が正常にできるようにしたいのですが、どうもうまくできません。
なせかずべて数字ほうに行ってしまいます。これでは話にならないので、対処法はありませんか?
環境は
Win7 Ultimate 64bit
Visual Studio 2010 (VB)
です。

何卒、よろしくお願い申し上げます。

KeyDownイベントで数字以外は発生しません。なぜでしょうか。
電卓を作っているのですが、キーボードからの対応をしているさなか大きな壁に当たりました。
フォームのKeyDownイベントでキーボードからの入力をキャッチする。
数字や演算、エンターキー。
フォームには、電卓を作るのに必要なボタンなどの配置はしてあります。
数字を表示する部分はLabel1にしています。
試験的に下記のソースで実験したところ、テンキーの数字以外、例えば演算キーをキーボードから入力すると、下記のソース通りならば、○算と表示...続きを読む

Aベストアンサー

IF 文を通過するかどうかの前に、受け取ったキーコードの値を確認しましょう。

QKeydownイベントについて

VB6.0について質問です。
FormでKeydownイベントが動きません。
どのような原因が考えられますか?
コードは以下のように記述しています。

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case vbKeyF8
cmd_F8.Value = True
Case vbKeyF9
cmd_close.Value = True
End Select
End Sub

Aベストアンサー

formのkeyPreviewがfalseになっていませんか?

Qkeydown イベントについて

VB6なのですが、あるオブジェクトにフォーカスがある時には
キーダウンが出来るのですが、どこにもフォーカスがないときには、、
(強いて言うならフォームにフォーカス?)キーダウンイベントは
発生しないのでしょうか?
要は、カーソル、フォーカス、の位置に関係なく、「F1」を押したときに
ある動作をさせたいのです。
よろしくお願いします

Aベストアンサー

FormのKeyPreviewプロパティ=Trueにして
Form_Keydown イベントに記述しましょう。

if KeyCode = vbKeyF1 Then
  MsgBox "(゜ .゜)ノ"
End If


このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング

おすすめ情報