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

投稿時間:2005/07/02(Sat) 08:22
投稿者名:おじん
Eメール:
URL :
タイトル:
Form_KeyDownについて
いつもお世話になります。
KeyPreview = Trueにして、キーインされた文字を取得することを
やろうとして、下記コードで実行しました。なお、フォームには
SSTabを貼り付けています。
まず、コード1で実行すると、KeyDownイベントが2度発生したかのように
キーインされた文字が2文字づつイミディエイト欄に表示されます。ここで
SSTabを取り除くと1文字になります。
勿論、ダブルクリックあるいは押しつづけると、それ相当の2文字づつに
なります。
それで回避のためコード2のようにやったのですが、SSTabを使用する場合
処理法、留意点がありませんか。
SSTabは何か一癖ある特別なコントロールですか。

よろしくご指導ください。

Option Explicit
Dim txt As String

'コード1:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
txt = txt & Chr(KeyCode)
Debug.Print txt
End Sub

'コード2
'Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
'Static flg As Boolean
'If Chr(KeyCode) = " " Then      '初期化するため
'txt = "": flg = False: Exit Sub
'End If
'flg = Not flg
'If flg Then Exit Sub     '一つだけ取る
'txt = txt & Chr(KeyCode)
'Debug.Print txt
'End Sub

Private Sub Form_Load()
KeyPreview = True
End Sub

投稿時間:2005/07/02(Sat) 22:50
投稿者名:Starfish
Eメール:
URL :
タイトル:
Re: Form_KeyDownについて
> まず、コード1で実行すると、KeyDownイベントが2度発生したかのように
> キーインされた文字が2文字づつイミディエイト欄に表示されます。ここで
> SSTabを取り除くと1文字になります。
> 勿論、ダブルクリックあるいは押しつづけると、それ相当の2文字づつに
> なります。
> それで回避のためコード2のようにやったのですが、SSTabを使用する場合
> 処理法、留意点がありませんか。

 見事な自動翻訳です。

BUG: フォーム キー イベントは、回 SSTab コントロールの発生します。
hhttp://support.microsoft.com/default.aspx?scid=kb;ja;149273

 何を言っているのかわからないので、元の英語を見てください。

BUG: Form Key Events Fire Twice with SSTab Control
hhttp://support.microsoft.com/default.aspx?scid=kb;en-us;149273

昔は、日本語訳に英語のページへのリンクがあったんだけど最近
なくなってしまいましたが、それだけ自動翻訳に自身があるって
ことでしょうか?

> SSTabは何か一癖ある特別なコントロールですか。

VB2.0のころから、Sheridan製のコントロール(ssなんちゃらという名前の
コントロール)は、問題が多くて悪評が高かったですね。

投稿時間:2005/07/03(Sun) 06:32
投稿者名:おじん
Eメール:
URL :
タイトル:
Re^2: Form_KeyDownについて
毎々のご教授、ありがとうございます。

>  見事な自動翻訳です。
???????????

> hhttp://support.microsoft.com/default.aspx?scid=kb;ja;149273
>  何を言っているのかわからないので、元の英語を見てください。
>
> BUG: Form Key Events Fire Twice with SSTab Control
> hhttp://support.microsoft.com/default.aspx?scid=kb;en-us;149273
もっとわかりません!英文からはかれこれ30年遠ざかっています。
Fire...手持ちの辞書では適切な日本語は見つかりません。なんとなしには
わかります。
ですが、バグ報告があったことは理解しました。ただ回避方法がないのは
残念ですが。(読み足らない?)

> コントロール)は、問題が多くて悪評が高かったですね。
そうなんですか。とはいっても個人的には好きなコントロールです。

KeyPreview=Trueにして「隠しコマンド風」な使い方をします。例えば、
ログインパスワードが必要なプログラムの場合、パスワードを忘れた時
「HELPME」などキーインすればそれを教えてくれる、など。
今回そのフォームに偶々SSTabコントロールがあって不都合を発見した
ということです。

Microsoftの製品を使いながらも仕様の理解のないまま使っていること
を反省します。support.microsoft.comに目を通してみます。
ありがとうございました。

投稿時間:2005/07/03(Sun) 16:21
投稿者名:LESIA
Eメール:
URL :
タイトル:
Re^3: Form_KeyDownについて
> >  見事な自動翻訳です。
> ???????????

> BUG: フォーム キー イベントは、回 SSTab コントロールの発生します。
> hhttp://support.microsoft.com/default.aspx?scid=kb;ja;149273
ここの最初に、自動翻訳と書かれていますよ。

投稿時間:2005/07/03(Sun) 16:40
投稿者名:おじん
Eメール:
URL :
タイトル:
Re^4: Form_KeyDownについて
> > >  見事な自動翻訳です。
> > ???????????
>
> > BUG: フォーム キー イベントは、回 SSTab コントロールの発生します。
> > hhttp://support.microsoft.com/default.aspx?scid=kb;ja;149273
> ここの最初に、自動翻訳と書かれていますよ。

ありがとうございます。「対象」は読み飛ばしていました。

投稿時間:2005/07/03(Sun) 23:24
投稿者名:Starfish
Eメール:
URL :
タイトル:
Re^3: Form_KeyDownについて
>ですが、バグ報告があったことは理解しました。ただ回避方法がないのは
>残念ですが。(読み足らない?)

 自動翻訳は、

>>解決方法
>>タブ コントロールにフォーカスがある場合、 2 のキー イベントをコードが無視するよう
>>コード記述の可能性があります。 これは、以前にキー イベントが発生したかどうか、
>>グローバル フラグ変数を表するために、利用することで実行できました。 これの以外、
>>この機能に依存するコードを記述するのを回避するのが最適なオプションです。

 適当に訳すと

解決方法
 もしもフォーカスがSSTabコントロールにあったら、2つ目のキーイベントを
無視するようにプログラムを書くことで、可能かも知れません。
そのキーイベントが以前に発生したかどうかをあらわすグローバルなフラグ変数
を利用することで、これを行うことができるかもしれません。
これのほかに、最良のオプションはこの機能性に依存するコードを書くことを
避けることです。

 なので、フラグをもって制御するか、SSTabを使った場合はKeyPreview機能を
使うなといっております。

 フラグを使った、例をあげておきます。

Dim mblnTab As Boolean

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    
    If Me.ActiveControl.Name = "SSTab1" Then
        mblnTab = Not mblnTab
        If Not mblnTab Then
            Debug.Print "無視" & CStr(KeyCode)
            Exit Sub
        End If
    Else
        mblnTab = False ' 念のため
    End If

    Debug.Print KeyCode
        
End Sub

 個人的には、SSTabは使わずに、レイアウトとかは大変ですが、TabStrip
を使用することを薦めておきます。

投稿時間:2005/07/04(Mon) 08:59
投稿者名:おじん
Eメール:
URL :
タイトル:
Re^4: Form_KeyDownについて
重ね重ね、ありがとうございます。サンプル活用させていただきます。

>  個人的には、SSTabは使わずに、レイアウトとかは大変ですが、TabStrip
> を使用することを薦めておきます。
これらのコントロールはまだ学習の途中段階で、十分に使いこなせていません。
が、今現在の理解では、よく似て非なるもののように受け止めています。
勉強不足です。

ありがとうございました。また、よろしくお願いいたします。