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

投稿時間:2005/05/13(Fri) 15:19
投稿者名:ちぃこ
Eメール:
URL :
タイトル:
キーボードとコマンドボタンを連動させたい
電卓をつくっています。
テンキーで入力するときに、コマンドボタンが働くようにしたいのです
(windowsの電卓と同様にしたい)
keydown等、使うことはわかるのですが
どういう指示をすればよいかわかりません。

よろしくお願いします。

投稿時間:2005/05/13(Fri) 15:27
投稿者名:ガッ
Eメール:
URL :
タイトル:
Re: キーボードとコマンドボタンを連動させたい
> 電卓をつくっています。
> テンキーで入力するときに、コマンドボタンが働くようにしたいのです
> (windowsの電卓と同様にしたい)
> keydown等、使うことはわかるのですが
> どういう指示をすればよいかわかりません。
>
> よろしくお願いします。
…春だなぁ…(曇ってるけど。
とりあえず、方針。
・入力と挙動を分離する。
 →テンキーで"1"が入力されても、"1"ボタンが押されても、同じメソッドを呼
び出す。など
・対応するイベントを自分で呼び出す。
 →たとえば、Call Command1_Click()とすれば(当たり前ですが)、目的のメソッドを呼び出せます。
・WinAPIのmouse_eventなどで擬似的にマウスをクリックしたメッセージを投げつける。
 →まぁ、私は非常時に使います(orz

投稿時間:2005/05/13(Fri) 15:32
投稿者名:ちぃこ
Eメール:
URL :
タイトル:
Re^2: キーボードとコマンドボタンを連動させたい
> ・入力と挙動を分離する。
>  →テンキーで"1"が入力されても、"1"ボタンが押されても、同じメソッド
を呼
> び出す。など
> ・対応するイベントを自分で呼び出す。


ありがとうございます!
早速やってみます。
つまずいたときは、またよろしくお願いします^^

投稿時間:2005/05/13(Fri) 15:41
投稿者名:じゃんぬねっと
Eメール:
URL :http://jeanne.wankuma.com/
タイトル:
Re^2: キーボードとコマンドボタンを連動させたい
こんにちは、じゃんぬ です。

> ・対応するイベントを自分で呼び出す。
>  →たとえば、Call Command1_Click()とすれば(当たり前ですが)、目的のメソッドを呼び出せま
す。

Command1.Value = True の方が望ましいですかね。
結局、PerformClick みたいな感じになって、イベントの概念が壊れそうですけど。
ライブラリでなければ、関数として分離して、どちらからも Call してあげるのが普通でしょうか。

もし、見た目も電卓のように変えたいのであれば、一旦 Focus を取得させるなどの方法がありますね。

投稿時間:2005/05/13(Fri) 15:59
投稿者名:ちぃこ
Eメール:
URL :
タイトル:
Re^3: キーボードとコマンドボタンを連動させたい
ありがとうございます。

> Command1.Value = True の方が望ましいですかね。

「キーボード"1"が押されたなら「command1.value=true」」という形にすればよいのでしょ
うか?

投稿時間:2005/05/13(Fri) 16:02
投稿者名:じゃんぬねっと
Eメール:
URL :http://jeanne.wankuma.com/
タイトル:
Re^4: キーボードとコマンドボタンを連動させたい
> 「キーボード"1"が押されたなら「command1.value=true」」という形に
> すればよいのでしょうか?

そうですね。(^^)

# できれば、お試しになってから質問してくださいね。

投稿時間:2005/05/13(Fri) 16:05
投稿者名:ちぃこ
Eメール:
URL :
タイトル:
Re^5: キーボードとコマンドボタンを連動させたい

> # お試しになってから質問されては、いかがでしょう?

すみません;;
試してみました。
「メソッドまたはデータメンバが見つかりません」というエラーが「.Value」で出ます。

投稿時間:2005/05/13(Fri) 16:10
投稿者名:じゃんぬねっと
Eメール:
URL :http://jeanne.wankuma.com/
タイトル:
Re^6: キーボードと...
> すみません;;
> 試してみました。

それをちゃんと言わないと、あなた以外の人間はわかりませんよね。
そして、何で躓いたかを下記のように言ってくださると、助かります。

# すいません、きつい言い方をしてしまいました。

> 「メソッドまたはデータメンバが見つかりません」というエラーが「.Value」で出ます。

電卓ということを考えると、配列化されたコントロールを使っているからでは?
配列の概念はご存知でしょうか...

Command( [index値] ).Value = True

[index値] に "1" に該当するインデックス値を入れてくださいね。

投稿時間:2005/05/13(Fri) 16:15
投稿者名:ちぃこ
Eメール:
URL :
タイトル:
Re^7: キーボードと...
> > 「メソッドまたはデータメンバが見つかりません」というエラーが「.Value」で出ます。
>
> 電卓ということを考えると、配列化されたコントロールを使っているからでは?
> 配列の概念はご存知でしょうか...
>
> Command( [index値] ).Value = True
>
> [index値] に "1" に該当するインデックス値を入れてくださいね。

なるほど!!ありがとうございます^^
試してみて、また結果報告しにきます。

投稿時間:2005/05/13(Fri) 17:31
投稿者名:ちぃこ
Eメール:
URL :
タイトル:
Re^8: キーボードと...
連動するようにはなりました。
ありがとうございます。

ただ、+や−といった記号を入れたあと、また全計算を消した(AC)あと
キーボードで数字が入力できません。

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)

最初に出てくる「Shift」を使用していないことと
何か関係がありますか?

よろしくお願いします。

投稿時間:2005/05/13(Fri) 17:45
投稿者名:ガッ
Eメール:
URL :
タイトル:
Re^9: キーボードと...
> 連動するようにはなりました。
> ありがとうございます。
>
> ただ、+や−といった記号を入れたあと、また全計算を消した(AC)あと
> キーボードで数字が入力できません。
とりあえず、それはVBの挙動じゃないから、自分でデバックして下さいとしか言いようが無い。
※なんとなく想像は出来るけどねぇ…


> Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
>
> 最初に出てくる「Shift」を使用していないことと
> 何か関係がありますか?
>
> よろしくお願いします。

投稿時間:2005/05/13(Fri) 17:54
投稿者名:ちぃこ
Eメール:
URL :
タイトル:
Re^10: キーボードと...
> とりあえず、それはVBの挙動じゃないから、自分でデバックして下さいとしか言いようが無い。
> ※なんとなく想像は出来るけどねぇ…
 
わかりました!
なんとか頑張ってみます^^
ありがとうございます**

投稿時間:2005/05/17(Tue) 15:09
投稿者名:ちぃこ
Eメール:
URL :
タイトル:
今回は・・・
Starfishさんにもアドバイスを頂いたのですが、
今はじゃんぬねっとさんの方法で試しています。

うまく動いてはいるのですが
キーから入力された文字と、配列で流れて入る文字の2つが表示されてしまいます。
キーからの文字を表示しない方法を教えてください><
よろしくお願いします。

投稿時間:2005/05/13(Fri) 15:48
投稿者名:ちぃこ
Eメール:
URL :
タイトル:
Re^2: キーボードとコマンドボタンを連動させたい
> ・入力と挙動を分離する。
>  →テンキーで"1"が入力されても、"1"ボタンが押されても、同じメソッド
を呼
> び出す。など
> ・対応するイベントを自分で呼び出す。
>  →たとえば、Call Command1_Click()とすれば(当たり前ですが)、目的のメソッドを呼び出せま
す。

ボタンを配列にしているのですが
テンキー"1"を押したとき
ちゃんとボタン"1"が動くようにするにはどうしたらいいでしょうか?

投稿時間:2005/05/14(Sat) 15:33
投稿者名:Starfish
Eメール:
URL :
タイトル:
Re^3: キーボードとコマンドボタンを連動させたい
> ボタンを配列にしているのですが
> テンキー"1"を押したとき
> ちゃんとボタン"1"が動くようにするにはどうしたらいいでしょうか?

 VBのみでそれっぽくやる方法です。

 コマンドボタンではなくて、チェックボックスを使います。フォームに
チェックボックスを貼り付けて、チェックボックスのStyle プロパティは、
1(グラフィックス)にします。
 又、フォームのKeyPreview プロパティは True にします。

Private Sub Check1_Click()
    Dim sngStart As Single
    If Check1.Value = vbChecked Then
        sngStart = Timer
        While (sngStart <= Timer) And (sngStart + 0.1 > Timer)
            DoEvents
        Wend
        ' コマンドボタンをクリックしたときの処理をここに入れる
        Check1.Value = vbUnchecked
    End If
End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    Check1.Value = 1
End Sub

 これで動作を確認できたら、後は、チェックボックスを配列にして、
押されたキーを判断して該当のチェックボックスの Value を、1にする
様に変更します。

 制限
 コマンドボタンとちょっと見た目が異なります。
 XPの新しい視覚スタイルには対応しません。

                      つづく

投稿時間:2005/05/14(Sat) 15:45
投稿者名:Starfish
Eメール:
URL :
タイトル:
Re^4: キーボードとコマンドボタンを連動させたい
 今度は、Win32APIを使用するやり方です。

 電卓を、スパイで見てみると、BM_SETSTATE のメッセージを使っているようです。

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) _
As Long
Private Const BM_SETSTATE = &HF3
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    Dim lngReturnValue As Long
    lngReturnValue = SendMessage(Command1.hwnd, BM_SETSTATE, 1, ByVal 0&)
    Sleep (100)
    Command1.Value = True
    lngReturnValue = SendMessage(Command1.hwnd, BM_SETSTATE, 0, ByVal 0&)
End Sub

 ところで、XPの新しい視覚スタイルでは、押されたようには見えませんので
あしからず。(電卓も同じです)

投稿時間:2005/05/16(Mon) 11:14
投稿者名:ちぃこ
Eメール:
URL :
タイトル:
Re^5: キーボードとコマンドボタンを連動させたい
返信遅れて申し訳ありません。
ありがとうございます!
その方法でやってみます^^*