こんにちは。
'親ハンドル取得
Private Const BM_SETCHECK = &HF1
AN = FindWindow(vbNullString, "親ハンドルだー")
'チェックボックスハンドル取得
チェック(5) = FindWindowEx(AN, 0, vbNullString, "パターン5")
'チェックボックスOn
Call SendMessage(チェック(5), WM_ACTIVATE, 0&, 0&)
Call SendMessage(チェック(5), BM_SETCHECK, BST_CHECKED, 0)
と言うプログラムを組んでいるんですが、チェックされません。
どーも、BST_CHECKEDあたりで、エラーが出ているみたいなんですが、(Empty)
解決策が見つかりません。
どなたか良い解決策ご存知ないでしょうか?
VB5.0です。
よろしくお願いします。
間違っていなさそうですが。
BST_CHECKED の値はいくつですか?
BST_CHECKEDの値は、”Empty”になります。
あとの変数は、0以外の数字なので問題ないと思うのですが・・・
追加
BST_UNCHECKEDの値も、”Empty”になるんですが、
不思議とチェックが外れます.
BST_CHECKED をConst で定義していないのが原因だと思います。
各モジュールの先頭に、『Option Explicit』という行を追加してみてください。
Option Explicitを宣言する事で、エラーが発生するのだとすれば、
コーディングに問題がある(宣言されていない変数や定数がある)事になります。
SendMessage で第2引数に BM_SETCHECK(=&HF1&) を指定した場合
第3引数に BST_UNCHECKED(=&H0&) を指定するとチェックが外れ、
BST_CHECKED(=&H1&) を指定するとチェックされます。
今回、 BST_CHECKED が未定義の為
Variant 型の変数として暗黙に定義され
初期値として Empty 値がセットされました。
これが SendMessage を呼び出す時に
Empty 値が Long 型に暗黙に変換され
0(=BST_UNCHECKED) として扱われたことになります。
その為、チェックをは外すことができるのです。
魔界の仮面弁士さん、とろさん、回答ありがとうございます.
Const BST_CHECKED = &HF1&
で解決できました.
BM_SETCHECK は、宣言していたのですが、
BST_CHECKED は、Apiビューワーに宣言文が載っていなかったので、要らないものとばかり思っていました.
みなさんは、この宣言部分(&HF1& )どうやって調べているのですか?
インターネットで調べてみたけど、宣言部分ってなかなか載っていないんですよね。
今回の BST_CHECKED も載ってなかったし・・・
解決ボタンつけるの忘れてました.
編集 削除> Const BST_CHECKED = &HF1&
いや、それだと値が間違っているような…?
> BST_CHECKED は、Apiビューワーに宣言文が載っていなかったので、
> 要らないものとばかり思っていました.
Win32 APIを使う場合は、定数(一般的に、すべて大文字です)にしても、
関数(大文字と小文字が区別されるので注意)にしても、
ユーザー定義型(他の言語では構造体と呼ばれます)にしても、
すべて宣言が必要になります。
# "Option Explicit"をモジュールの先頭に付けておくと、定数を
# 宣言するのを忘れてしまった時に、エラーとして報告されるように
# なりますので、今回のようなミスを事前に発見しやすくなりますよ。
> みなさんは、この宣言部分(&HF1& )どうやって調べているのですか?
&HF1& なのは、BST_CHECKED ではなく、BM_SETCHECK ですよね。
VB6のAPIビューアも、VB5のAPIビューワも、「入力を補助するツール」であって、
ドキュメントではありませんから、そこに載っていないAPIも数多くあります。
(付属のWin32API.TXT等を書き変える事で、宣言項目を増やすことができます)
定数の値については、一般的には「C言語用のヘッダファイル(*.h)」を
参照して宣言する事になります。
(APIの多くは、C言語等から呼ばれる事を前提に設計されています)
このヘッダファイルは、Platform SDK というパッケージ(無料です)に
含まれていますし、Visual Studio/Visual C++等にも含まれています。
たとえば、今回の BST_CHECKED の場合、『WinUser.h』というファイルにて
定義されており、その内容は
#define BST_CHECKED 0x0001
と書かれています。これは VB でいえば、
Public Const BST_CHECKED As Long = &H1&
に相当します。
APIビューア(というよりも、VB付属の Win32API.TXT)には、
間違いも幾つかありますし、載っていないAPIもありますから、
APIをある程度理解できるようになったきたら、ヘッダファイルを見て、
自分で「VBに翻訳する」ようにした方が確実かと思いますよ。
Private Const BST_CHECKED = &H1&
でした、すいません。
>自分で「VBに翻訳する」ようにした方が確実かと思いますよ。
うぅっ、Cの方はさっぱりなので、自力で翻訳するには、かなり苦労しそうです.
どうもありがとうございました。