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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
1208
POXEI-DOONchkboxを使ってチェックを入れるとgotoのコマンドを実行ようにしたいです(初心者)11解決


POXEI-DOON

リンク

2020/12/8(Tue) 14:13:36|NO.91885

HSP初心者です
chkboxを使ってチェックを入れたときにgotoにいくようにしたいです
ループじゃなくて1回だけ実行したいです
よろしくお願いします



この記事に返信する


とあるプログラマ

リンク

2020/12/8(Tue) 18:32:07|NO.91886

●方法1:チェックボックスの状態をループで監視する

メリット:簡単
デメリット:ループで監視するので、ループの待機時間ぶんだけラグが発生する


screen 0 chkbox "チェック", piyo repeat // 1回だけということなのでbreakして終わる if (piyo == 1) : break wait 10 loop // hoge に行く。hogeの先で止まるから1回しか実行されない goto *hoge stop *hoge dialog "チェックが押されました" stop


●方法2:HSPの標準ボタンをチェックボックスにしてしまう (ボタンスタイルの変更)

メリット:押した瞬間だけ処理が実行されるのでラグが無い。さらにCPU負荷も低い

デメリット:初心者には恐らく仕組みが分からない。「1回だけ」という制約だと場合分けが必要なので、少々面倒


#include "user32.as" #define global GWL_STYLE $FFFFFFF0 #define global WS_CHILD $40000000 #define global WS_VISIBLE $10000000 #define global BS_AUTOCHECKBOX $00000003 screen 0 button goto "チェック", *hoge hCheck = objinfo_hwnd(stat) //ウィンドウハンドル取得 // ボタンスタイルでBS_AUTOCHECKBOXを指定 SetWindowLong hCheck, GWL_STYLE, WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX stop // 注意:この*hogeへはチェックボックスがクリックされるたびに飛んできます *hoge // 最初の一回だけ if (pressed == 0) { pressed = 1 dialog "チェックが押されました" } stop



ふじこlp

リンク

2020/12/8(Tue) 18:47:40|NO.91888

出来ました。

chkbox "Foooooo!",a repeat if a=1:goto *label1 wait 1 loop *label1 mes "Wiiiiiiiii!" stop



とあるプログラマ

リンク

2020/12/8(Tue) 19:02:33|NO.91889

>>ふじこlpさん

その方法だとlooplevネストが減らないので、breakを使うかrepeat〜loop以外のループ(while 1〜wend や *main〜goto *main など)を使いましょう。

このコードでは影響はほぼないと思いますが、HSP3はlooplevは32以上でネストエラー吐くので…



POXEI-DOON

リンク

2020/12/8(Tue) 20:38:48|NO.91890

ありがとうございます
もう1つお願いがあって
チェックボックスが何回でも押せて押したときにgotoでプログラムに飛んでくような
プログラムも作って欲しいです
ご迷惑をおかけしすいません



POXEI-DOON

リンク

2020/12/8(Tue) 20:49:41|NO.91891

解決しました



ねんねこ

リンク

2021/7/10(Sat) 11:48:27|NO.93198


screen 0 chkbox "チェック", piyo repeat // 1回だけということなのでbreakして終わる if (piyo == 1) : break wait 10 loop // hoge に行く。hogeの先で止まるから1回しか実行されない goto *hoge stop *hoge dialog "チェックが押されました" stop


wait 10
ではなく

wait
(waitだけ)や

await
でもできるはず...



沢渡

リンク

2021/7/10(Sat) 17:20:48|NO.93201

waitの引数は省略時は100だから、省略すると最大で1秒待たされますし、
awaitの引数は省略時は0だから、省略するとループが速くなりすぎて
処理が重くなります。(私の環境で実験したら1秒間に1万回くらいループし、
右上の[X]でうまく閉じることができなくなった)

つまり、前者の場合は待ち時間が長すぎ、後者の場合は待ち時間が短すぎるので、
今回のケースの場合ならwait 10で0.1秒待つというのは適正だと思います。



ねんねこ

リンク

2021/7/10(Sat) 18:22:26|NO.93202

え、じゃぁ、これは環境によって違うのか...
(私の環境ではwait(何もなし)やawaitでも処理が重くならなかった)
(使用OSはWindows10)



こいる

リンク

2021/7/11(Sun) 00:07:50|NO.93204

>チェックボックスが何回でも押せて押したときにgotoでプログラムに飛んでくような
>プログラムも作って欲しいです
oncmdでこんな風にできます(チェック状態を変えるたびにラベルへ飛びます)。
しかし、通常はgotoではなくgosubにし、*onCommandラベル内のstopはreturnに変えた方がいいでしょう。

chkbox "チェック",isChecked hChkBox = objinfo(stat,2) #define WM_COMMAND 0x111 oncmd goto *onCommand, WM_COMMAND // gotoよりgosub stop *onCommand if lparam == hChkBox { mes "チェックされているか: " + isChecked } stop // gosubにした場合は、returnに変更



こいる

リンク

2021/7/11(Sun) 00:27:23|NO.93205

NO.93204を解説すると、


hChkBox = objinfo(stat,2)
で、設置したチェックボックスのウィンドウハンドル(Windowsで使われるオブジェクトIDのようなもの)を保存。


#define WM_COMMAND 0x111 oncmd goto *onCommand, WM_COMMAND
で、「WM_COMMAND」というオブジェクトの状態が変更されたときなどに送られるメッセージが送られてきたときに、*onCommandラベルに飛ぶように設定。


*onCommand if lparam == hChkBox { mes "チェックされているか: " + isChecked }
そしてここで、WM_COMMANDが送られてきたとき、それが設置したチェックボックスについての事なのか確認するため、if文で最初に保存したウィンドウハンドルと比較し、そうならmesでチェック状態を表示しています。



こいる

リンク

2021/7/11(Sun) 13:29:01|NO.93208

あ、すみません。すでにすべて解決してたのですね。
まあこんな方法もありますよ、ということで……。



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