ドラッグ&ドロップのプログラムをシンプルに扱うために
色々なアプローチを試したのですが解決できなくて
最終的に oncmd gosub の動作が理不尽で暗礁にのりあげております。
[問題点]
通常の gosub の場合サブルーチンを呼び出した後は
直下の行を実行します。
しかし oncmd gosub はサブルーチン内でreturnしても
直下の行を実行してくれません。
しかも動作的にはreturnと記述しているが実質STOP命令のような
素振りを見せます。
(スキル的にHELPを見ても理解できませんでした…)
言葉だけでは説明しにくいと思うのでスクリプトを書いておきます
ドロップされた時だけ実行するようにしたいのです。
HSP3.3添付のサンプルに手を加えています
#uselib "shell32.dll"
#func DragAcceptFiles "DragAcceptFiles" int,int
#func DragQueryFile "DragQueryFileA" int,int,int,int
#func DragQueryPoint "DragQueryPoint" int,int
#func DragFinish "DragFinish" int
#define WM_DROPFILES 0x0233
title "ウィンドウにファイルをドロップしてください"
DragAcceptFiles hwnd, 1
oncmd gosub *OnDropFiles, WM_DROPFILES
//①999が返された場合ドロップされたと判断する
mes "stat "+stat :if stat != 999 :stop
//②ドロップされた時だけ実行する
mes "ドロップされました"
stop
*OnDropFiles
hdrop = wParam
DragQueryFile hdrop, -1, 0, 0
ndrop = stat
syscolor 5 : boxf
syscolor 8 : pos 0,0
sdim filename, 260
repeat ndrop
DragQueryFile hdrop, cnt, varptr(filename), 260
mes filename
loop
DragFinish hdrop
//③ここの戻り値の扱いも不明。便宜上値を999にしています
return 999
現状では oncmd goto で return の代わりに goto で②に飛ぶ
又はサブルーチン内で処理を行う。
どちらもシンプルでないので汎用性に欠けます。
何か解決方法はありませんでしょうか。