こんにちは。GetKeyStateについて質問させていただきます。

VB6にて、APIの「GetKeyState」を使用し、Tabキーのキー入力判断を行っているのですが、その他の操作(GetKeyStateを判断しているフィールドより
マウス左ボタンにて他のコントロールに移動した時等)に、Tabキーを押して
いないのに、プログラムはTabキーを押した状態のロジックが動作していま
す。下記にそのコードを記述しますので、原因・対処方法がありましたら、
教えてください。

****コード
Private Sub TXT_ATAI_LostFocus()

Dim SUBM0030 As SUBM0030_AREA
Dim X As Variant

If (GetKeyState(vbKeyTab) <> 0) Then
If FRM70.TXT_ATAI.Text <> "" Then
Call MEDIA_DECODE3_SEC(SUBM0030, "1")
If SUBM0030.RETURN_CD <> "0" Then
FRM70.GRD1.Col = 7
FRM70.TXT_ATAI.SetFocus
FRM70.MousePointer = vbDefault
Exit Sub
End If
End If
End If

End Sub

**** 開発環境
・OS:Windows98 4.10.1998
・メモリ:64MB
・CPU:P2-233
・PC:FMV6233-D9

このQ&Aに関連する最新のQ&A

OS 開発」に関するQ&A: OSの開発に付いて

A 回答 (4件)

>If (GetKeyState(vbKeyTab) <> 0) Then



If (GetKeyState(vbKeyTab) < 0) Then
では?

参考URL:http://support.microsoft.com/default.aspx?scid=k …
    • good
    • 0
この回答へのお礼

todo36さん。ありがとうございました。条件記述を変更後に動作確認をしたら、
質問の内容は解決しました。

お礼日時:2001/12/27 17:58

プロパティのMultiLineをTrueにしていませんか?



その場合、そういうことがあるようです。

対応としましては、

MultiLineをFalseにするか、

下記のようにコードを固定すればいいと思います

intSts = GetKeyState(vbKeyTab) And &HFE
If intSts = 128 Then
  MsgBox "Tab"
End If

参考になれば。。
    • good
    • 0

すいませんTodo36さん、その通りです。



リンク先より:If the return value is negative, the key has been pressed.

たしかに・・・m(_ _)m

さらに、GetAsyncKeyState(vbKeyTab) <> "0" ←なぜか文字列で比較している

akfkさんご迷惑かけました、todo36さん、ありがとうございます。
    • good
    • 0

NT40(SP6)+VB5(SP3)環境での回答とさせていただきます。



確かにGetKeyState(vbKeyTab) <> 0の記述ではその現象が発生します、理由は調べていません(--;)

目的がTABキーの状態の取得でしたら、次のコードでも実現可能です。

----------------- 標準モジュール
Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
----------------- FRM70
Private Sub TXT_ATAI_LostFocus()

If GetAsyncKeyState(vbKeyTab) <> "0" Then
MsgBox "TAB"
End If

End Sub
------------------
参考になれば幸いです。
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

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

Q3月末退職4月5日転職の場合の5日間の社会保険はどうすればよいのでしょうか?

3月31日付で現在の職場を退職し、4月5日に新たな職場に勤める予定です。4月5日付けで社会保険に加入できる予定ですが、その間5日間の健康保険と厚生年金保険は通常どのようにするべきでしょうか?
配偶者の被扶養者になっても4月5日には扶養をはずさなければなりません。5日間ぐらいなら健康保険は無加入でも大丈夫でしょうか?
厚生年金保険は1日でも空白があるといけないと聞きました。4月1日に役場で国民年金に加入し4月5日に勤め先で厚生年金保険に加入した場合、ダブって支払った4月分の保険料はいつどこから返金されるのでしょうか?何か特別な申請がいるのでしょうか?
どなたか詳しい方アドバイスをよろしくお願いします。

Aベストアンサー

いったん国民健康保険に加入し、国民年金に加入することとなります。

退職時の健康保険としては、国民健康保険と任意継続被保険者、および社会保険加入者の被扶養者のいずれかとなりますが、現実的に考えると国民健康保険に加入したほうがよろしいでしょう。

理由としては、

1.4月5日に社会保険の資格を取得することになりますので、結果的に国民健康保険料を支払う必要が無いこと。
2.任意継続を選択した場合は、4月分の健康保険料を、任意継続分と4月5日に加入した健康保険とで二重に支払うこととなってしまいます。
3.被扶養者については、届出をしている最中に4月5日が来てしまう。

となります。
でも、本来であればいったん国民健康保険に加入するのが基本的なのですが、病院にかからないようであれば、とくに手続きをする必要も無いでしょう。

国民年金についても同様です。
4月5日から厚生年金に加入するわけですから、まったく保険料を支払わないと言うことはありませんので、加入期間には通算されます。
また、就職された後に社会保険事務所から空白部分の年金について問い合わせがあるかもしれませんが、そのときに手続きをすればまったく問題ありません。
急いで手続きをする必要は無いでしょう。

いったん国民健康保険に加入し、国民年金に加入することとなります。

退職時の健康保険としては、国民健康保険と任意継続被保険者、および社会保険加入者の被扶養者のいずれかとなりますが、現実的に考えると国民健康保険に加入したほうがよろしいでしょう。

理由としては、

1.4月5日に社会保険の資格を取得することになりますので、結果的に国民健康保険料を支払う必要が無いこと。
2.任意継続を選択した場合は、4月分の健康保険料を、任意継続分と4月5日に加入した健康保険とで二重に支払う...続きを読む

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...続きを読む

Q4月3日迄今の職場で働きます。4月5日より新しい職場に変わります。社会保険料や厚生年金、健康保険料な

4月3日迄今の職場で働きます。4月5日より新しい職場に変わります。社会保険料や厚生年金、健康保険料などは2ヶ所からひかれるのでしょうか?詳しく知っている方教えて下さい。

Aベストアンサー

2ヶ所からひかれることはありません。
厚生年金保険料、健康保険料を含めて社会保険料と言います。
社会保険料は月末に加入していた社会保険から引かれるのが
原則となっています。

今の職場では3月分までが引かれ、
新しい職場では4月分から引かれます。

通常は給与から保険料が引かれる場合、
後払いとなっている場合が多いです。
今の職場で3月分の給与が4月に払われる時、
保険料が引かれる可能性があります。

これで二重に引かれると誤解なさらぬよう、
よくご確認ください。

いかがでしょうか?

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」=常に無効
に成ります。

Q4月5日に高遠の桜は楽しめますか?

長年の夢だった高遠の桜を見に行こうかと思うのですが、4月5日にしかいけません。ちょっと早めなのは分かっています。三分咲きくらいにはなっているといいのですが、詳しい方教えてください。

Aベストアンサー

こんばんは

まだつぼみみたいです
http://weathernews.jp/sakura/cgi/search_result.fcgi?id=165

http://weathernews.jp/sakura/cgi/search_result.fcgi?menu=proj&id=1107&CityOrder=7

http://www.nagano-np.co.jp/modules/news/article.php?storyid=13575
こちらの予想ではその日が良いようですね

すごい綺麗ですよ

QSubとEnd Subについて

VBScriptのSubとEnd Subについて教えて下さい。

Dim LogonID
Dim Password
Dim URL
Dim objIE
Dim objINPUT
Dim BodyText
Dim AriNashi

LogonID = "XXXXXXXX"
Password = "XXXXXXXXX"
URL = "https://login.yahoo.co.jp/config/login?.src=www&.done=http://www.ya..."

下記のようなプログラムはうまくいくのですがSubで囲むと何故か動作しなくなってしまいます。
使い方が間違っているのでしょうか?


Set objIE = WScript.CreateObject("InternetExplorer.Application")
objIE.Navigate URL
objIE.Visible = True

Do Until objIE.Busy = False
WScript.sleep(250)
Loop

If objIE.document.URL = URL Then
BodyText = objIE.document.body.innerTEXT
AriNashi = InStr(1, BodyText, "Yahoo")
If AriNashi > 0 Then
Set objINPUT = objIE.document.getElementsByTagName("input")
objINPUT(0).value = LoginID
objINPUT(1).value = Password
objINPUT(2).Click
Else
msgbox "NO"
End If
Else
WScript.Echo " ダ メ" & Err.Description
End If
Set objIE = Nothing

VBScriptのSubとEnd Subについて教えて下さい。

Dim LogonID
Dim Password
Dim URL
Dim objIE
Dim objINPUT
Dim BodyText
Dim AriNashi

LogonID = "XXXXXXXX"
Password = "XXXXXXXXX"
URL = "https://login.yahoo.co.jp/config/login?.src=www&.done=http://www.ya..."

下記のようなプログラムはうまくいくのですがSubで囲むと何故か動作しなくなってしまいます。
使い方が間違っているのでしょうか?


Set objIE = WScript.CreateObject("InternetExplorer.Application")
objIE.Navigate ...続きを読む

Aベストアンサー

Subで囲むとプロシージャとなります。
プロシージャは他から呼び出されない限り、勝手に動作はしません。

Sub Hoge
'実体
End Sub

と書いたなら、プロシージャの外で
Call Hoge()
のようにプロシージャを呼び出してあげてください。

Q4月5日放送のデリデリキッチンのレシピ(水餃子)

4月5日放送のデリデリキッチンのレシピ(水餃子)を教えてください。
たれの材料はひかえたのですが、肝心の餃子の方の材料があいまいになってしまいました。
よろしくお願いします。

Aベストアンサー

録画より

プリプリ水餃子 4人分

・春キャベツ 1/4個
・ギョーザの皮 1袋(24枚)
・豚ひき肉 120g
・ニラ 1束
・卵 1個
・しょう油 大1と1/2
・ごま油 大3
・塩 小1/2
・黒こしょう 適量

だそうです。

QMicroSoft BasicのDim文とVisualBasicのDim文の違い

私が20年前にMicroSoft Basicを使っていたときは、DIM文はDIMENSIONの略で配列型変数の宣言に使っていました。

最近VisualBasicの勉強を始めたのですが、変数の宣言はすべてDim文になっており、昔のMS BasicのDim文と意味合いが変わっているのに驚いています。

ここで質問させてください。
・なぜ配列を意味するDimension文が変数の宣言なのか?
・どのバージョンのBasicからDim文の意味が変わったのか?

私が使用していたのはNEC N-Basic,N-88Basic,N-98Basicです。

Aベストアンサー

VISUAL BASIC のDimは ディメンジョンの略です。
私の経験ではVB2.0時代からありました。

配列0を考えた場合変数とおなじであるからだとおもいます

Qイーバンクから「2010年4月5日をもちまして、Visaデビット機能を

イーバンクから「2010年4月5日をもちまして、Visaデビット機能を停止しました」というメールが来たのに、その後4月17日に「VISAデビットご利用による引落を行いました」とメールが来て、実際に引き落とされていました。クラシックプレミアムに移行はしていないのでクラシックカードを持続中です。どのような理由だかわかりますか?

Aベストアンサー

請求業者によっては遅延して引き落としされることがありますので、そのためかと思われます。
(高速道路、ガソリンスタンド、一部プロバイダ、showtimeなどのサービス、有料ホームページサイト会員料など)

QSub-EndでConsole.Writeでコマンドプロンプト出力したい

VB.NET2003:WindowApplication の Sub~End で 出力Console.Write("***") としてもコマンドプロンプトウィンドウにでないで、.NETウィンドウのデバッグ欄にしか出ない。前もって何かを指定しなければならないのでしょうが全くわかりません。ConsoleApplication ではうまくいっていますが。初心者なのでよろしくお願いします。

Aベストアンサー

Windows Applicationは,コンソールを持ちません。
# AllocConsole API等を使えば,専用コンソールを持てますが。

コンソールへ出力したいのであれば,Console Applicationにする必要があります。
なお,Console ApplicationであってもWindows Formsを開く事は可能です。


人気Q&Aランキング

おすすめ情報