HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0704
kanahironcomboxをWM_COMMANDの中で消去すると異常終了する5解決


kanahiron

リンク

2017/7/4(Tue) 13:04:19|NO.80487

comboxの内容を取得し、ウィンドウを書き換える動作をするプログラムを作っています。
repeat-loopでの変数監視は避けたく、oncmdを使いWM_COMMANDを捉えて処理をしています。
ウィンドウの切り替えに伴ってフォントサイズや大きさを変える必要があり、WM_COMMANDを発生させたcombox自体をclrobjで消去し、作成し直していますが、実際にcomboxで切り替えをすると、数回に一回stop命令の場所でシステムエラー1が発生し、プログラムが異常終了していまいます。

HSPの管轄外(oncmd内のサブルーチン)でオブジェクトを操作しているためエラーが発生してしまう事自体は理解できるのですが、これを回避する方法が思いつきません。
Win32APIのTimerでの監視もレスポンスと負荷の関係から避けたいと思っています。

現象の再現するほぼ最低限のソースです。

//#include "hsp3utf.as #const WM_COMMAND 0x0111 screen 0 oncmd gosub *WM_COMMAND_Proc, WM_COMMAND objmode 2 selectorIndex = 0 gosub *DrawWindow stop //ここでシステムエラー *WM_COMMAND_Proc //oncmd 0 //意味ない if ( (lparam == hComBox) && (((wparam>>16) & 0x0000FFFF) == 1) ){ sendmsg hComBox, 0x0147 selectorIndex = stat gosub *DrawWindow } //oncmd 1 //意味ない return *DrawWindow gsel 0 clrobj //オブジェクトの初期化 font "メイリオ", 13 pos 0, 0 objsize 200,30 combox selectorIndex, , "切り替えると時々落ちます1\n切り替えると時々落ちます2" hComBox = objinfo( stat, 2) return
このソースでコンボボックスを何回か切り替えるとシステムエラーが発生します

comboxをwinobjで作成もしてみましたが、時々エラーからほぼエラーになってしまい逆効果でした。
別の方法やエラーを発生させない方法をご存じでしたらお願いします。



この記事に返信する


tds12

リンク

2017/7/4(Tue) 15:34:07|NO.80489

メッセージのもととなったコンボボックス自身を
メッセージの処理中に削除しているのが原因のようです。

clrobjに引数を指定してコンボボックス自身を削除しないようにしましょう。



MillkeySoftw

リンク

2017/7/4(Tue) 15:38:27|NO.80490

では、どうすればいいか。
独自メッセージを WM_COMMAND 空間内から自身に送信すればいいのです。
この送信というのは SendMessage ではなく、PostMessage です。

SendMessage は、メッセージの処理が終了するまで待機します。
PostMessage は、メッセージの処理が終了するまで待機せずに制御を戻します。

はっきり言えば、WM_COMMAND 空間をさっさと抜けて、HSP のメッセージ待機中にすればいい。
WM_COMMAND 空間処理終了後に改めて、PostMessage の処理を行う。



kanahiron

リンク

2017/7/4(Tue) 20:16:05|NO.80495

回答ありがとうございます


combox自身を消さないというのは、書いてありますがcomboxに適用するフォントを変えたいために不可能です
あるいは、設置したあとにフォントを変えることができれば解決します

PostMessageで自分自身に(独自の)再描画のメッセージを送るのは思い付きませんでした
試してみます



tds12

リンク

2017/7/4(Tue) 21:25:38|NO.80498

すみません、回答ずれてました。

手抜きで書くなら以下のようになると思います。

*DrawWindow gsel 0 font "メイリオ", 13+rnd(10) mref bmscr,67 sendmsg hComBox,0x30/*WM_SETFONT*/,bmscr(38),1 return



kanahiron

リンク

2017/7/5(Wed) 04:04:34|NO.80502

PostMesssageを使う方法もsendmsgでフォントを変える方法も正常に動作させることが出来ました。
WM_SETFONTの送信は以前同じ方法で行い上手く行かなかったのですが、やはり出来たのですね…
MillkeySoftさん、lltds12さんありがとうございました



ONION software Copyright 1997-2023(c) All rights reserved.