現在のキャレット(入力位置を示すカーソル)の位置をマーキングして、
後でその位置に移動させたり、文字列検索や置換の開始位置用に取得させたりと、
キャレット位置を知るといろいろなことに使えます。
今回は、オブジェクトへメッセージを送ってキャレット位置を取得するサンプルを紹介します。
HSP2はobjsend命令、HSP3からはsendmsg命令でオブジェクトにメッセージを送信でき、
今回はメッセージコードのうち「EM_GETSEL(=0x00B0)」というものを利用します。
HSP2「objsend オブジェクトID, 0x00B0, 開始位置格納先変数アドレス, 終了位置格納先変数, 0」
HSP3「sendmsg オブジェクトハンドル, 0x00B0, 開始位置格納先変数アドレス, 終了位置格納先変数アドレス」
と指定することで変数に位置が格納されるので、その値を元に処理すればOKでしょう。
objsend命令はp5を0にすれば、p4lparamの変数ポインタを渡すので、選択終了位置を取得できますが、
選択開始位置を格納するp3のwparamに同様の変数を指定しても変数内容を指定したことにしかならないので、
ll_getptr命令およびll_ret命令で変数ポインタを取得して、その数値を指定しなければなりません。
HSP2「objsend オブジェクトID, 0x00B0, 不使用(=0), 不使用変数(=0), 0」
HSP3「sendmsg オブジェクトハンドル, 0x00B0, 不使用(=0), 不使用(=0)」
ただ、必ず格納先変数を指定せねばならないものではなく、上記のようにNULL(=0)でも正常動作します。
終了位置の変数ポインタもそうであり、両方ともに指定せずともOKなのですが、
objsend命令の仕様によりlparamには必ず変数を指定する必要があるのでダミー変数を置いてください。
HSP3のsendmsg命令はそのような仕様ではないため、いずれも指定しなくて動作します。
どちらも指定しなかったら取得できないかというとそういうわけではなく、
システム変数statの下位2バイトに開始位置、上位2バイトに終了位置にセットされるので、
「開始 = stat & 0xFFFF」「終了 = stat >> 16」として取り出しましょう。
|