VB6・SP5で開発を行っています。
FormのKEYDOWNイベントでPageUp・PageDownの押下の際に、
SSTAB上のアクティブなTABをずらす処理を行おうとしています。

問題はSSTAB上にフォーカスが移った直後だけ、
KEYDOWNイベントが2回実行されてしまうというものです。
KEYUPについても同様でした。
このような現象をご存知の方、
対処方法をお教えくださる方がいらっしゃいましたらよろしくお願いします。

ちなみにモジュール変数等のフラグはなるべく使用したくありません。

A 回答 (2件)

SSTAB上にフォーカスがあるときにどんなキーでもForm_KeyDownイベントが2回発生します。


これはSSTABのバグだと思います。

Private Sub Form_Load()
Me.KeyPreview = True
End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Static Cnt As Long
Debug.Print Cnt, KeyCode
Cnt = Cnt + 1
End Sub

で、KeyCode = 0にすると何故うまくいくかというと、うーん分からん..
    • good
    • 0
この回答へのお礼

やっぱりバグなんですか。。。結構はまっていたので助かりました。
KeyCode=0ですが、KeyDownイベントのヘルプに以下のようにありました。
KeyCode=0とするとKeyイベントが無効となるようです。
以下引用のみ---------
キーボード イベントの処理をフォーム レベルだけで行い、
コントロールにキーボード イベントを送らないようにするには、
フォームの KeyPress イベントで引数 KeyAscii を 0 に設定し、
フォームの KeyDown イベントで引数 KeyCode を 0 に設定します。

お礼日時:2002/02/27 14:05

>FormのKEYDOWNイベントでPageUp・PageDownの押下の際に、


>SSTAB上のアクティブなTABをずらす処理

の後にKeyCode = 0
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
お教えいただいた方法でうまくいきました。

でも、なぜ2回イベントが発生してしまうのでしょうか?
ご存知でしたら教えてください。

お礼日時:2002/02/27 12:32

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

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

Q継承したFormでKeyDownイベントを一括処理するには?

VB 2005を使用しています
System.Windows.Forms.Formを継承したFormを使って
画面を作っています。

各画面のKeyDownイベントに同じ処理をいれたいのですが、
個々の画面に実装すると変更が発生した場合、
各画面ごとに修正するという事態を回避したいと思います。

そこで継承したForm内でKeyDownイベントを管理したいのですが
その様な方法はあるのでしょうか?
ある場合、どういったキーワードがあるのでしょうか

Aベストアンサー

お世話になります。

> 個々の画面に実装すると変更が発生した場合、
> 各画面ごとに修正するという事態を回避したいと思います。
ここだけ見ると、ひとつ親クラスを作ってやって
そこから各画面に対する派生クラスを作ってやれば良さそうな感じがします。

System.Windows.Forms.Form
 |_
   Base Form(ここで KeyDown の実装)
   |_ 各画面1
   |_ 各画面2
   |_ ...

QSSTabの各Tabのフォントカラーについて

個々のタブのフォントカラーの変える方法を教えていただけませんか? 急いでいるので、そっけない質問でスイマセン。。。

Aベストアンサー

やった事はないけど、もしできるとしたら、

「SetTextColor」というAPIが存在します。
もし、Cがインストールしてあったら、こういった(色などの「作り」)はWinGdi.hを調べれば、どこかに存在すると思います。
(はずしていたらすいません)

VB6環境がないので動かせませんが、サンプルURLを張っておきます。
http://www.mitene.or.jp/~sugisita/vb6_cmctl.html
の「リストビューのカラムヘッダの色変更」

サンプルは「リストビュー」なので、同じページに存在する
「タブストリップのオーナードロー」
のサンプルもダウンロードして、組み合わせたらできるかもしれません。


タブコントロールは調査したことがないので、どのような構造で構成されているか知らないので、大したアドバイスできなくてスイマセン

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

QKeyUpイベントにて

テキストボックスのKeyUpイベントにて『Enter』または『Tab』が押されたら処理をさせようと
Private Sub Text_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Text.KeyUp
If e.KeyCode = Keys.Enter or e.KeyCode = Keys.Tab Then
  処理コード
End If
End Sub
としたのですが『Enter』のときしか処理コードが反映されません
ご教授お願いします

Aベストアンサー

TextBoxにTabキーの押し放しを認識させる方法は、フォームの全てのTabStop を False にする方法があります。通常の動作である、Tabキーによるコントロールの移動が出来なくなり、犠牲は大きいです。

Tabキーによって次のコントロールにフォーカスが移ってしまうことを逆に利用して、TextBoxの次にフォーカスが移るダミー的なコントロールを配置する方法もあります。ダミーのコントロールにフォーカスが来たら、TextBoxでTabが押されたと判断することも、TextBoxにフォーカスを戻すこともできると思います。

あるいは、テキストボックスからフォーカスがはずれる直前のイベントを捕らえる方法もあります。Validatingイベントについて調べてみて下さい。


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

おすすめ情報