Dripです。
motimotiさん、こんにちは。
ご提示いただいたコードですと、buttonでのラベルジャンプが実行されるサイクルとメインループ内の動作の実行されるタイミングがずれる可能性があるため、期待する動作にならない可能性があります。
実行される順序として、スクリーンID1がマウスダウンによってアクティブになった瞬間、運悪く*click_checkのタスクが実行され、次のアイドルのタイミングでButtonのラベルジャンプが発生するとmotimotiさんの仰るような問題の動作に繋がります。
より再現性を高めるためには、現在 wait 1 とされている箇所を await 0 に変更してみてください。
ほぼ確実に問題の動作が再現されるかと思います。(PC一機でしか検証していないため環境に異存する可能性があるかもしれません。)
さて、実行順序を正しくするためには、メインループでは button などと実行順序が入れ替わっても問題のない処理を記述し、実行順序を一定にしたい処理はonclickで処理を分配するようにしてください。
以下のように改修することで、実行順序が一定になり、問題の動作は起こらなくなるかと思います。
screen 1, 200, 50
objsize 200, 50
button gosub "test", *test //ボタンが押された場合の処理
onclick gosub *click_check //クリックされた場合の処理
gsel 0,1
stop //今回はメインループは不要
*click_check
if ginfo_act != 0 : return
if iparam = 0 {
if leftclick_pre = 0 {
gsel 0 //もし他の窓が選択されている可能性があれば指定が必要
mes "" + mousex +", "+mousey
}
}
return
*test
gsel 0,1
return
なお、余談ですがgselによるウィンドウの「アクティブ化」はWindowsの仕様(?)により絶対に正確じゃない場合があることに注意してください。(単なる操作先ウィンドウの変更は正確に動作します。)
通常は正常にアクティブ化されますが、絶対に設定したウィンドウが想定のタイミングでアクティブにならないとプログラムがクラッシュする恐れがある…というような処理は書かない方が安全です。
可能であれば、強制的にアクティブウィンドウを変更することによって動作の競合を起こす可能性のあるコーディングは避けるようにしてください。