チェックボックスの操作について

解決


あうー  2004-08-03 06:30:10  No: 115307  IP: [192.*.*.*]

こんにちは。

      '親ハンドル取得
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です。
よろしくお願いします。

編集    削除
とろ  2004-08-03 18:05:07  No: 115308  IP: [192.*.*.*]

間違っていなさそうですが。

BST_CHECKED の値はいくつですか?

編集    削除
あうー  2004-08-03 19:09:45  No: 115309  IP: [192.*.*.*]

BST_CHECKEDの値は、”Empty”になります。
あとの変数は、0以外の数字なので問題ないと思うのですが・・・

編集    削除
あうー  2004-08-03 19:23:15  No: 115310  IP: [192.*.*.*]

追加
BST_UNCHECKEDの値も、”Empty”になるんですが、
不思議とチェックが外れます.

編集    削除
魔界の仮面弁士  2004-08-03 19:46:38  No: 115311  IP: [192.*.*.*]

BST_CHECKED をConst で定義していないのが原因だと思います。
各モジュールの先頭に、『Option Explicit』という行を追加してみてください。

Option Explicitを宣言する事で、エラーが発生するのだとすれば、
コーディングに問題がある(宣言されていない変数や定数がある)事になります。

編集    削除
とろ  2004-08-03 20:30:12  No: 115312  IP: [192.*.*.*]

SendMessage で第2引数に BM_SETCHECK(=&HF1&) を指定した場合
第3引数に BST_UNCHECKED(=&H0&) を指定するとチェックが外れ、
BST_CHECKED(=&H1&) を指定するとチェックされます。

今回、 BST_CHECKED が未定義の為
Variant 型の変数として暗黙に定義され
初期値として Empty 値がセットされました。
これが SendMessage を呼び出す時に
Empty 値が Long 型に暗黙に変換され
0(=BST_UNCHECKED) として扱われたことになります。
その為、チェックをは外すことができるのです。

編集    削除
あうー  2004-08-03 21:35:57  No: 115313  IP: [192.*.*.*]

魔界の仮面弁士さん、とろさん、回答ありがとうございます.
Const  BST_CHECKED  =  &HF1&    
で解決できました.
BM_SETCHECK は、宣言していたのですが、
BST_CHECKED  は、Apiビューワーに宣言文が載っていなかったので、要らないものとばかり思っていました.
みなさんは、この宣言部分(&HF1&  )どうやって調べているのですか?
インターネットで調べてみたけど、宣言部分ってなかなか載っていないんですよね。
今回の  BST_CHECKED  も載ってなかったし・・・

編集    削除
あうー  2004-08-03 21:36:36  No: 115314  IP: [192.*.*.*]

解決ボタンつけるの忘れてました.

編集    削除
魔界の仮面弁士  2004-08-03 21:59:18  No: 115315  IP: [192.*.*.*]

> 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に翻訳する」ようにした方が確実かと思いますよ。

編集    削除
あうー  2004-08-04 00:26:44  No: 115316  IP: [192.*.*.*]

Private Const BST_CHECKED = &H1&
でした、すいません。
>自分で「VBに翻訳する」ようにした方が確実かと思いますよ。
うぅっ、Cの方はさっぱりなので、自力で翻訳するには、かなり苦労しそうです.
どうもありがとうございました。

編集    削除