HOME >> HSPサンプル置き場 兼 実験室 >> オブジェクトの値が変更されたことを検出してみる

オブジェクトの値が変更されたことを検出してみる
inputなどのオブジェクトの値が変更されたことを検出するには、ループ内で変数の内容を監視するなどの方法がありますが、今回はループを使わずに、ウインドウに送られてくるメッセージで変更が行われたことを検出してみようと思います。

inputなどのオブジェクトに何らかのイベント(スクロールバーがクリックされた、値が変更された等)が発生すると、
WM_COMMANDメッセージがオブジェクトの設置されているウインドウに送られてきます。
そしてこのWM_COMMANDメッセージを処理してやることで、どのオブジェクトに何が起きたかを知る事ができます。

とりあえずソースコードです
#define ctype HIWORD(%1) ((%1>>16)&0xffff)  // 上位ワードを返す
#define ctype LOWORD(%1) (%1&0xffff)        // 下位ワードを返す

#define WM_COMMAND   $00000111
#define EN_CHANGE    $00000300

oncmd gosub *onWM_COMMAND,WM_COMMAND

input a,200,24,10
input1 = objinfo(stat,2)

input b,200,24,10
input2 = objinfo(stat,2)

stop

// メッセージ処理 -----------------------------------------
*onWM_COMMAND
    switch lParam
        case input1
            if HIWORD(wParam) == EN_CHANGE {
                mes "input1の内容が変更されました"
            }
            swbreak
        case input2
            if HIWORD(wParam) == EN_CHANGE {
                mes "input2の内容が変更されました"
            }
            swbreak
    swend
    return

メッセージを受け取る前の準備として、
oncmd命令でメッセージを処理するラベルの設定と、オブジェクトのハンドルobjinfo命令で取得しておきます。

WM_COMMANDメッセージの処理は、ラベル"*onWM_COMMAND"内で行っています。
WM_COMMANDlParamにオブジェクトのハンドル、
wParamの上位ワードにコントロールからの通知コード、つまり何が起きたかが書かれています。

これらのことを利用して、
lParamと、取得しておいたオブジェクトハンドルを比較し、一致したらwParamの上位ワードを調べます。
今回はオブジェクトの値が変更されたことを検出したいので、wParamEN_CHANGEが入っているかどうか調べます。
EN_CHANGEが入っていれば値が変更されたということになります。

今回はinputのみを扱いましたが、mesboxでも同じような感じで内容の変化を検出することができます。


参照
HSPの裏技 通知メッセージリスト:
 http://yokohama.cool.ne.jp/chokuto/urawaza/notify/

WinAPI Database for VB Programmer ウインドウメッセージ一覧表示:
 http://www.winapi-database.com/Message/WM/

更新日:2008/9/12