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


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0917
kenwm_commandの設置位置12未解決


ken

リンク

2009/9/17(Thu) 12:57:43|NO.27738

oncmdはウインドウ毎に設置することになっていますが、下のようなスクリプトではscreen 1を
設置したとたんにoncmd が実行されます。
他にinputやmesboxも設置したとたんにwm_commandが発生するようですがoncmd *wm_command,$111
はどのように設置すればいいでしょうか?


screen 0 mes "screen 0" input a oncmd *wm_command,$111 screen 1 mes "screen 1" input b stop *wm_command mes "wm_command" stop



この記事に返信する


SYAM

リンク

2009/9/17(Thu) 14:46:48|NO.27741

普通に、オブジェクト配置後に oncmdを実行するのではだめなのでしょうか?

screen 0 mes "screen 0" input a screen 1 mes "screen 1" input b oncmd *wm_command,$111 stop *wm_command mes "wm_command" stop


もし、開始後に途中でオブジェクトをいじくりたいなら、oncmd 命令は割り込みを一時停止/再開する機能も持っているので以下のようにもできます。

screen 0 mes "screen 0" input a oncmd *wm_command,$111 oncmd 0 screen 1 mes "screen 1" input b oncmd 1 stop *wm_command mes "wm_command" stop



ken

リンク

2009/9/17(Thu) 21:27:09|NO.27748

>SYAMさん
回答ありがとうございます。

質問のしかたが悪くてすみません。
oncmd *wm_command,$111とinput、mesboxあるいはscreenを併用する時何らかの記述テクニックが
必要なのかということです。chkboxやbuttonでは置き場所にこだわらなくて良いと思いますが・・

ちなみに提示した例ではscreen0にoncmdを置いているのにscreen1に影響しているのがおかしい
のではないかと思うのです。



inovia

リンク

2009/9/17(Thu) 21:43:04|NO.27749

> screen0にoncmdを置いているのにscreen1に影響しているのがおかしい

以下のコードを実行するとわかりますが、inputがメッセージを送っているようです。
(lParamに送信元のウィンドウハンドルが入るので)

処理が終わるのを待たないで次の行にいってしまっている感じ?


screen 0 mes "screen 0" input a mes "input のハンドル = "+objinfo(0,2) oncmd *wm_command,$111 screen 1 mes "screen 1" input b stop *wm_command mes "wm_command : ハンドル = "+lParam stop



pizza

リンク

2009/9/18(Fri) 03:20:35|NO.27758

screen0のインプットがフォーカスをscreen1のインプットに奪われてEN_KILLFOCUSがきてます。

oncmdはoncmd gosubにして、いじる必要がなければreturnしてあげれば
問題ないと思います。



ken

リンク

2009/9/18(Fri) 21:27:23|NO.27763

>inoviaさん、pizzaさん
ありがとうございます。

回避策はいろいろと考えられるのですが、そもそもこれってoncmdのバグとも思えるのですが
どうなんでしょう?それともWM_COMMANDの仕様?



窓口

リンク

2009/9/19(Sat) 13:21:41|NO.27777

oncmdのバグっぽいです。
「oncmd 1」を使用した場合
他のウインドウの受け取ったメッセージが、最後に「oncmd 1」を実行したウインドウにのみ反映されるようです。

「#module」「#global」で区切っても変わらないみたいです。

他のウインドウで受け取ったメッセージを一つのウインドウに反映を集中させることが容易になっているみたいですが
oncmdで特定ウインドウのみの処理を中断させるには
移動先のサブルーチンで判定するしかないみたいですね。


#const global WM_NCLBUTTONDBLCLK $000000A3 #const global WM_MOVE 0x0003 /*moduleA*/ #module a #deffunc AA_ screen 0 mes "screen A : タイトルバーをダブルクリックしてみて下さい" input a oncmd gosub *wm_command,$111 oncmd gosub *WM_NCLBUTTONDBLCLK__ , WM_NCLBUTTONDBLCLK ;タイトルバーダブルクリック return #deffunc oncmd_0_AA_ gsel 0 oncmd 0 return *wm_command mes "wm_command" return *WM_NCLBUTTONDBLCLK__ mes "ダブルクリックされました : カウント"+str(i) i++ return #global /*moduleB*/ #module b #deffunc BB_ screen 1 mes "screenB" mes "このwindowを移動してみて下さい、スクリーンDのタイトルが変わります" oncmd gosub *WM_MOVE__ , WM_MOVE return *WM_MOVE__ title "スクリーン1を移動しました : カウント"+str(i) i++ return #global /*moduleC*/ #module c #deffunc CC_ screen 2 mes "screenC" input b oncmd 1 ;oncmd 1の定義 return #global /*moduleC*/ #module d #deffunc DD_ screen 3 gsel 3 , 2 mes "screenD" oncmd gosub *WM_NCLBUTTONDBLCLK__ , WM_NCLBUTTONDBLCLK oncmd 1 ;oncmd 1の定義 return #deffunc oncmd_1_DD oncmd 1 return *WM_NCLBUTTONDBLCLK__ mes "ダブルクリック" return #global #const time_ 1000 AA_ : BB_ : CC_ : DD_ wait time_ : gsel 3 : cls : color 255,0,0 : mes "[wait "+str(1000)+" が経過しました\noncmd 0 が実行されます]" : color 0,0,0 oncmd_0_AA_ wait time_ : gsel 3 : cls : color 255,0,0 : mes "[oncmd 1 が実行されます\nwait "+str(1000)+" が経過しました]" : color 0,0,0 oncmd_1_DD



ken

リンク

2009/9/20(Sun) 18:40:06|NO.27814

>窓口さんありがとうございます。

自分にはちょっと難解ですが一応皆さんの意見をもとに考えると

oncmdはWM_COMMANDに限ってはウインドウ独立ではない。特にinput、mesbox、screenがあると
その影響を受ける。
oncmd 0,oncmd 1は各ウインドウ共通である。?
WM_COMMANDを使う時はどのオブジェクトハンドルのものか自分で判断し(これは当然)、
対象外のものを無視するためにはoncmd gosubを使うしかない。

と考えますがいかがでしょう。



窓口

リンク

2009/9/20(Sun) 20:42:48|NO.27819

>>oncmdはWM_COMMANDに限ってはウインドウ独立ではない。特にinput、mesbox、screenがあるとその影響を受ける。
oncmd は「oncmd gosub *wm_command,$111」のような使い方でしたらそのウインドウのみ
メッセージを受け取ることになります。
WM_COMMAND も通常の使い方でしたらそのウインドウのみです。
WM_COMMAND はとても多機能ですが、わたくし的には多機能すぎて少し使いづらいような気がします。

>>oncmd 0,oncmd 1は各ウインドウ共通である。?
一度oncmd 1を使用したら、以前に他のウインドウで定義したウインドウメッセージを全てを
「oncmd 1を実行したウインドウ」が受け取るようになるみたいです。
モジュールも無視して、ラベルジャンプするみたいですのでバグのようにも見えますが。
結構便利な気もします。


>>WM_COMMANDを使う時はどのオブジェクトハンドルのものか自分で判断し(これは当然)、
>>対象外のものを無視するためにはoncmd gosubを使うしかない。
失礼ですが、gosubの意味を解っていますか?(解っていたらごめんなさい。)
もし解らなければ「gosub」で調べてみてください。今後、かなり重宝する事になると思います。



窓口

リンク

2009/9/20(Sun) 20:46:27|NO.27820

自分のコメントが少し、蛇足に思えてきました。



ken

リンク

2009/9/20(Sun) 22:41:08|NO.27829

>gosubの意味を解っていますか?
対象外のobjectから発行されたWM_COMMANDに反応しないためにはなにもせずにreturnしなければ
ならない、そのためにはoncmd gosubを使うしかない。
と考えていますが違いますか?



窓口

リンク

2009/9/21(Mon) 19:40:29|NO.27866

ごめんなさい。それで大丈夫です。

余計なことかもしれませんが
仕様変更した際にひどい目に有った事が有りますので、
自分は何か無い限りはoncmd には gosubを使用します。
そっちのほうが無難だと思います。



ken

リンク

2009/9/22(Tue) 23:51:45|NO.27897

>対象外のobjectから発行されたWM_COMMANDに反応しないためにはなにもせずにreturnしなければ
>ならない、

ウインドウ独立ならSTOPも使えるのですが他のウインドウにも反応するようならgosubを使う
しかないですね。

やはりバグと思えるがgosub使う必要ないところでもgosub使わなければならないのはどうかと・・



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