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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0902
masamioncmd命令について15解決


masami

リンク

2008/9/2(Tue) 07:12:17|NO.18843

listbox list,100,"a\nb\nc\nd"
repeat
redraw 0
color 255,255,255
objsel 0
boxf
oncmd gosub *keep,$111
redraw 1
await 1
loop
stop
*keep
color 0,0,0
pos 100,0
if list=0:mes "a"
if list=1:mes "b"
if list=2:mes "c"
if list=3:mes "d"
wait 100
return
これを実行すると、リストボックスのaやbやcをクリックしても、
選んだ文字と表示される文字が違います。
どのようにすればちゃんと表示できるのでしょうか??
onclick命令だとリストボックス内でのクリックは無効になるし・・
onkey命令でもクリックは無効だし・・・
いろいろ試したり調べたりしたのですが、わからないので書き込みしました
ご教授お願いします



この記事に返信する


SYAM

リンク

2008/9/2(Tue) 07:35:44|NO.18844

一定時間ごとに list の値を調べて、
変化していたら *keep にジャンプ …ではダメですか?



masami

リンク

2008/9/2(Tue) 12:09:03|NO.18845

一回それでがんばってみます
ありがとうございました



flory

リンク

2008/9/2(Tue) 14:36:19|NO.18846

どうやらkeepサブルーチン内で描画処理(mes命令)を行っていることが原因だと思われます。
oncmdでサブルーチンに飛んだ時点では、リストボックスの状態保持変数listはまだ更新されていないようです。したがって、ひとつ前に選択したものが表示されてしまうのです。

普通、ボタンやoncmd時に飛ぶサブルーチンでは描画は行いません。サブルーチンで描画フラグを設定して、メインルーチンで描画を行うのが定石です。


挙げられているサンプルには他にも注意すべき点があります。
1.
特別な理由がない限り、oncmd命令はループ中に使うことはありません。ループに入る前に一度使うだけで良いです。
2.
objsel命令も連続して使わないほうが良いでしょう。さもないと他のオブジェクトにフォーカスが移らなくなってしまいます。objsel命令が本当に必要なときだけ使うべきです。
3.
ボタンやoncmd時に飛ぶサブルーチン内にwait命令を入れるのは極力避けるべきです。さもないと、サブルーチン内からサブルーチンが呼び出されて……となり、思ったとおりの動作をしなくなることがあります。
4.
WM_COMMANDメッセージ($00000111)でoncmdしているようですが、WM_COMMANDメッセージが送られるのはリストボックスの項目が選択されたときだけではありません。リストボックスがフォーカスを失ったときなどにも送られてきます。もしリストボックスが複数あったり、他にボタンやメニューがあれば、そちらから送られてくることもあります。したがって、WM_COMMANDメッセージがどこから送られてきたか、それは本当にリストボックスの項目が選択されたときのものか、の二点を確認する必要があります。


以上、長々と書きましたが、SYAMさんの仰るとおり、
>一定時間ごとに list の値を調べて、
>変化していたら *keep にジャンプ
という方法が簡単で、HSP的と言えます。これなら、上の「注意すべき点」の4は考えずに済むでしょう。スクリプトの組み方によっては3も考えなくていいかもしれません。



masami

リンク

2008/9/3(Wed) 03:31:08|NO.18875

ご説明ありがとうございます。
何回も読み直して理解できることができそうです。
詳しくご説明ありがとうございます。



S&R(楓)

リンク

2008/9/3(Wed) 06:23:33|NO.18886

>どうやらkeepサブルーチン内で描画処理(mes命令)を行っていることが原因だと思われます。
まったく違います。



flory

リンク

2008/9/3(Wed) 11:27:36|NO.18929

解決済みのスレでさらに話を続けるのは心苦しいのですが……


>S&R(楓)さん
>>どうやらkeepサブルーチン内で描画処理(mes命令)を行っていることが原因だと思われます。
>まったく違います。

あ、あれ?違いますか?
一応、以下のような検証用スクリプトを用意して試したんですが。


#const DrawInMain 0 ;0だとサブルーチン内描画、1だとメインルーチン内描画 #const WM_COMMAND $00000111 listbox list, 100, "a\nb\nc\nd" oncmd gosub *keep, WM_COMMAND repeat wait 1 #if DrawInMain if flag : mes list : flag = 0 #endif loop stop *keep #if DrawInMain flag = 1 #else mes list #endif return //簡略化のため随所に手抜きが……

上のスクリプトの挙動で「サブルーチン内での描画が原因」と結論づけるのは早急な判断でしたでしょうか。
サブルーチン内描画以外の原因だと仰るならば、後学のためにもその原因と理由をお聞かせ願いませんか?



S&R(楓)

リンク

2008/9/3(Wed) 17:53:04|NO.18943

ごめん、ちょっとわかりにくかったね。
>描画処理(mes命令)を行っていることが原因
って引用しとけばよかった。
描画処理(mes命令)を行っていることが原因=描画処理をやめればサブルーチン内でも正しく取得できる
=>まったく違います。

今回は素直に言葉が足りませんでした。



ANTARES

リンク

2008/9/3(Wed) 21:15:50|NO.18955

誰も言ってないことを勝手に妄想して
それに対して全く違うなんてレスしたのですか?

「言葉が足りない」?「素直に」?
言葉の意味まで勝手にでっち上げているようですね。

自分の頭がおかしいのを棚に上げてそこまで高飛車になれるとは
怒りを通り越してあきれも通り越して笑ってしまいました。

一度、病院で見てもらった方がいいでしょう。

HNからして独りよがりのナルシストであることがはっきりわかります。



S&R(楓)

リンク

2008/9/4(Thu) 06:07:11|NO.19006

仕返しですか?子供ですね...



S&R(楓)

リンク

2008/9/4(Thu) 06:20:21|NO.19008

>上のスクリプトの挙動で「サブルーチン内での描画が原因」と結論づけるのは早急な判断でしたでしょうか。
いや、やっぱりそれは早急な判断ですね。
ちゃんとリストボックスにメッセージを送って選択中の項目インデックスを返してもらえば、
「サブルーチン内での描画」は原因にはなりませんから。



あり

リンク

2008/9/4(Thu) 10:09:19|NO.19009

ANTARESさんの発言が行き過ぎているのは間違いないですが・・・
>仕返しですか?子供ですね...
仕返しという事は自分に思い当たる節がある訳ですよね、ならばあなたも同罪でしょう?

>今回は素直に言葉が足りませんでした。
今回だけですか?
私にはあなたの過去の書き込みの多くがあなたの言うところの言葉足らずに見えますが?
と言うより、これは『言葉が足りない』のでなく相手への『配慮が足りない』と言うんですよ?

S&Rさんは自分の記事を送信する前に冷静になって自分の記事内容を読み返す事を徹底すべきです。
そして読み返すだけでなく、自分の発言を相手がどう受け取るのかをよく考えて文を書いてください。
そうすればむやみにレスを追加しなくても済みますし、余計な茶々を入れて人から反感を買うことも
少なくなるでしょう。
そしてこれが出来なければこの先も人との衝突が絶えることは無いでしょうね・・・。

・・・もういい加減に自分の発言の問題点を自覚しましょうよ
それとも知った上でわざとやってるんですか?



S&R(楓)

リンク

2008/9/5(Fri) 06:20:55|NO.19022

いい加減、スレッドから脱線するのはやめませんか?



ANTARES

リンク

2008/9/5(Fri) 07:35:16|NO.19027

 自分がバカであることに気づかないことこそ、
バカのバカたる所以なのですから、
バカにバカと言うだけでは何の効果もありません。

 言うに事欠いて仕返しとはまた、随分見くびられたもんだ。
バカはバカの基準でしかものが考えられないからしょうがないけどね。

 都合が悪くなると脱線とか言い出すし、とことん他人の神経を逆なでする人ですな。
自分が脱線の原因を作ったことを棚に上げて、いけしゃあしゃあと
よくもそんな鉄面皮なことが言えるものです。
自分の過ちはとことんほっかむりして、他人の過ちだけをあげつらう。
自分は常に正しく、常に悪いのは他人。
そこまで、おめでたいと人生楽しいでしょうね。羨ましいです。



SYAM

リンク

2008/9/5(Fri) 08:35:45|NO.19031

注意することと罵ることはちがいます。
仮にどっちかが悪いとはっきりしているとしても、罵るような真似をしてはそれ自体が悪いことであって、「あっちが悪い」など言い訳になりません。

それでもやるなら、相手と自分の「品位」が心中することになるのは覚悟しましょう。



flory

リンク

2008/9/6(Sat) 17:07:44|NO.19067

なにやら紛糾しているようですね……。

>S&R(楓)さん
>描画処理(mes命令)を行っていることが原因=描画処理をやめればサブルーチン内でも正しく取得できる
>=>まったく違います。
ああなるほど、理解しました。
こちらももっと的確な表現をした方がよかったかもしれませんが、「サブルーチン内での描画が原因」とした方がわかりやすいと判断したのでそのように書いた次第です。それに、一応は「状態保持変数listはまだ更新されていない」ということも説明してありますし、実際にサブルーチン内で描画しないようにする(=メインルーチンで描画する)と解決するわけですし。

>今回は素直に言葉が足りませんでした。
NO.18943のように理由をちょこっとでも書いていただけると、「違う」と言われた側にも反論・言い訳・訂正・謝罪の余地がでてきますから、できるだけこのようにしてもらえるとありがたいですね。

>ちゃんとリストボックスにメッセージを送って選択中の項目インデックスを返してもらえば、
>「サブルーチン内での描画」は原因にはなりませんから。
たしかにその通りです。サブルーチン内で自分から積極的に取得していくというのは考えていませんでした。それでは「サブルーチン内での描画が原因」という表現は撤回せざるを得ないようです。曖昧な表現を使ってしまい、申し訳ありませんでした。



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