|
![](../images/spacer.gif) |
|
2022/1/19(Wed) 00:05:49|NO.95107
オブジェクトの位置やサイズを視覚的に変更できて、自動でスクリプトエディタに上書きするモジュール
ObjPosMod.hsp が出来ました!
>GUIエディタを考えています。(motimotiさん)
http://hsp.tv/play/pforum.php?mode=all&num=94631
↑こちらで↓の話題が出たので、久々に自分の返信コメントを見返しまして、
http://hsp.tv/play/pforum.php?mode=pastwch&num=68664
昔の【やりたいなって思ってたこと】が今なら出来るかな、と思ったんですが、、、
安易に手を出したらなんかメッッチャ大変でした。。。(ツカレタ…
使い方は、普通にスクリプトを書いていて「オブジェクトがいくつか出てきたな。位置を視覚的に決めたい」
って思ったときに、
#include "ObjPosMod.hsp"
するだけです。
これで、Ctrlキーを押しながらマウスの左クリックで位置を、右クリックでサイズを変更できるようになります。
リストから書き換えたいオブジェクトを選び「スクリプト変更」ボタンを押すと、エディタ上のスクリプトが自動で書き換えられます。
(対応環境 : Windows8以降)
GitHubにモジュールを置いてます。
https://github.com/MIZUSHIKI/HSP-Module/blob/master/ObjPosMod.hsp
「Raw」ボタンの上で右クリック → 名前を付けてリンク先を保存 → #include でお願いします。
また、下記のサンプルですとGitHubから自動でダウンロードする処理が組み込まれています。
// ※ netincludeという自作モジュールで、GitHubに置いてあるモジュールを取得しに行く処理が入ってます。
// 実行したときのカレントディレクトリに保存されますが、
// もしそういった動作が嫌な場合は上記のリンク先からのダウンロードと通常の#includeへの書き換えを行ってください。
#ifdef _debug
#include "hspinet.as"
#include "mod_regexp.as"
#define netinclude(%1,%2=_) addition %1* %2
exist"hsptmp":if strsize>0{t@_@="":d@_@=dir_exe+"\\common\\":notesel t@_@:noteload"hsptmp":noteunsel:matches t@_@,t@_@,"#netinclude\\s*\"(.+?)\"\\s*/\\s*,*\\s*(\\w*)":repeat stat:r@_@="":if t@_@.cnt.2="common"{r@_@=d@_@}exist r@_@+t@_@.cnt.1:t@_@.cnt="0":if strsize<0{if r@_@!d@_@{t@_@.cnt="1":n@_@++}else{t@_@.cnt="2":m@_@++}}loop:if n@_@+m@_@>0{a@_@=dir_cur+"\\\n\nに\n\n":repeat 2,1:if n@_@=0&cnt=1{continue}if m@_@>0&cnt=2{if n@_@!0{a@_@+="\nをダウンロード、\n------\n\n"}else{a@_@=""}a@_@+=d@_@+"\n\nに\n\n"}r@_@=""+cnt:foreach t@_@:if t@_@.cnt!r@_@{continue}a@_@+="・"+t@_@.cnt.1+"\n":loop:loop:dialog a@_@+"\nをダウンロードします",2,"#net\include":if stat=6{netinit:foreach t@_@:if t@_@.cnt="0"{continue}c@_@=dir_cur:if t@_@.cnt="2"{chdir d@_@}split t@_@.cnt.1,"/",r@_@:if stat>0{repeat stat-1:dirlist a@_@,r@_@.cnt,5:if stat=0{mkdir r@_@.cnt}chdir r@_@.cnt:loop}neturl "https://raw.githubusercontent.com/"+getpath(t@_@.cnt.1,32):netload getpath(t@_@.cnt.1,8):chdir c@_@:loop:dialog"再実行して下さい":end}}sdim t@_@}
#else
#define netinclude(%1,%2=_) include %1
#endif
#netinclude "MIZUSHIKI/HSP-Module/master/ObjPosMod.hsp"/
; _ObjPosMod_BlackListID_ = 1 ;ObjPosModしないウィンドウIDを指定できる配列
; _ObjPosMod_WhiteListID_ = 0 ;ObjPosModをこのウィンドウIDだけするというのを指定できる配列
screen 0, 480,320
font "MS ゴシック", 14
pos 10,10
ipt="オブジェクトやmesの位置を、Ctrlキーを押しながら"
input ipt, 380, 20
mes "左ドラッグで移動、右ドラッグでサイズ変更ができます。"
mes "[スクリプト変更]ボタンでエディタ上のスクリプトを書き換えます。"
objsize 380, 20
combox comb, ,"リストビューでダブルクリックをするとスクリプトエディタの該当行に移動します。"
color 0,0,255
boxf 150, 93, 157, 100
color : pos 170, 90 : mes "メッセージ"
msbx="オブジェクトの操作時にあわせてShiftも押すと移動の縦横制限をしたり、サイズを縦横同時に合わせることができます。"
pos 145, 110 : mesbox msbx, 115, 100
objsize 70, 65
pos 271, 110 : button goto "実行", *go
objsize 70, 25
pos 271, 185 : button gosub "変更", *ch
pos 145, 215
winobj "msctls_trackbar32","",,$50000000|$100|$10|$8, 195, 20
objsize 100, 30 : chkbox "チェックボックス",b
color 255,0,0
circle 365,200,455,290
line 43, 305, 463, 305
line 150,180
line 5, 180
color 0,255,0
grect 60,140, M_PI*60/360, 50,75
screen 1,480,320
gsel 0, 1 : gsel 1
mes "すべてのウィンドウ、#include先も対応"
color 0,0,255
boxf 40, 40, 90, 90
color 255,0,0 : boxf 115, 80, 199, 164
color
pos -170, 200
exist dir_tv+"koma.png"
if strsize ! -1 : picload dir_tv+"koma.png", 1
pos 250,20
exist "c:\\hsp36\\sample\\basic\\sysinfo.hsp"
if strsize ! -1 {
mes "#include \"c:\\hsp36\\sample\\basic\\sysinfo.hsp\"\n"
#addition "c:\\hsp36\\sample\\basic\\sysinfo.hsp" ; addition == include(non error)
}else {
exist "c:\\hsp351\\sample\\basic\\sysinfo.hsp"
if strsize ! -1 {
mes "#include \"c:\\hsp351\\sample\\basic\\sysinfo.hsp\"\n"
#addition "c:\\hsp351\\sample\\basic\\sysinfo.hsp" ; addition == include(non error)
}
}
stop
*go
gsel 0 : title "実行"
stop
*ch
gsel 0 : title "変更"
return
![](../images/bbs/mark_main.gif)
| |
|
2022/1/19(Wed) 21:48:45|NO.95118
すごい...便利ですね...
|
|
2022/1/19(Wed) 23:16:02|NO.95119
>す²さん
感想ありがとうございます!
宣伝カテゴリはコメントが付きにくいので嬉しいです。
さて、
私のホームページの方でもモジュールを公開しました。
ダウンロードの場合は、GitHubからよりもコチラからの方がやり易いと思います。
http://suwa.pupu.jp/HSP/index.html
また、動画も置いてますのでどんな感じの操作感なのかも掴めるかと思います。
あと、前回書くのを忘れてましたが、このモジュールでオブジェクトを配置、スクリプトを書き換えた後は
#include "ObjPosMod.hsp" を消してください。
オブジェクトを調整したいときだけ #include する形となっております。
|
|
2022/1/20(Thu) 22:03:12|NO.95126
#include"ObjPosMod.hsp"
input a
上記スクリプトを実行してコントロールをCtrl+クリックすると
強制終了してしまいます。
|
|
2022/1/21(Fri) 01:04:10|NO.95128
>雪月夜さん
お試し頂きありがとうございます。
input に指定する変数が数値型の場合、強制終了してしまうようになっていました。
バグを修正してGitHub、ホームページにアップしました。(Ver.1.1)
ObjPosMod.hsp の再ダウンロードをお願いしたいのですが、
もし、#netinclude でダウンロードして頂けていた場合は、カレントディレクトリにダウンロードされた
\MIZUSHIKI\HSP-Module\master\ObjPosMod.hsp
を一度削除頂いてから、再度前回のサンプルを実行等をしてください。
お手数お掛けしますが、ご確認の程をよろしくお願い致します。
|
|
2022/1/23(Sun) 22:47:11|NO.95171
すごいですね!
これで直感的にGUI配置ができますね!
自分もGUIエディタのようなものを作っていますが、
ここまでのようなことはできません笑
ひとつだけ、デュアルディスプレイ使用時限定かもですが、
吸着の補助線が画面外に表示されることがあります。
|
|
2022/1/24(Mon) 21:55:32|NO.95177
>motimotiさん
ご感想ありがとうございます!
motimotiさんの立てたスレッドで自分の昔のコメントを見つけて、作り直そうかなと思うきっかけになりました。
ここまで大変になるとは思ってませんでしたが(^^;;;
>デュアルディスプレイ使用時限定かもですが、
>吸着の補助線が画面外に表示されることがあります。
バグ報告ありがとうございます! Ver.1.2 で対処しました。
ホームページ: http://suwa.pupu.jp/HSP/index.html
GitHub: https://github.com/MIZUSHIKI/HSP-Module/blob/master/ObjPosMod.hsp
内部でドットを表示するウィンドウと大体同じ扱いになるように変更してしまいました。
他にも、以下のような変更点があります。
- スクリプト末尾の方のオブジェクトから書き換えていくようにした。
- 右クリックで矩形選択するとオブジェクトに少しでも重なれば選択できるようにした。
- オブジェクトを動かした後連続して他を動かすとき前回選択を解除するようにした。
- listbox,comboxにオブジェクトサイズの制限があるのである程度頑張って対処した。
- その他、細かい変更やバグの修正。
motimotiさんも他所スレッドで話題に挙げているlistboxですが、
実はlistboxだけ忘れてて確認作業の中に入ってませんでした(〜_〜;
#include "ObjPosMod.hsp"
pos 10, 10 : objsize 100, 34
listbox listb, , "1: リストボックス\n2: だけサイズが\n3: うまく変更した\n4: 通りにできない。\n5: 2,5,8行とかは\n6: HSP実行時に\n7: 1行減らされて\n8: しまう。\n9: どうやっても…"
なんか扱いが難しいですよね・・・
リストボックスのサイズを変更したあと、実際にセットできたサイズを取得してオブジェクトサイズに制限を設けてみましたが。。。
(モジュール内ではさらに取得できた数値に余分を見て+10してます。丁度で作ると大概1行減らされました。環境によるかも。暫定処置)
サンプルに書いた通り、「HSP実行」直後は絶対に表示できない行数(サイズ)があるんですよね。
オブジェクトのサイズを変更すれば出来るみたいなんですけど、2行、5行、8行のサイズのものとかは
1ピクセルずつ減らしていって「HSP実行」してみても突然3行から1行にガクンと下がっちゃいます。
(私はこうでしたが、環境によって変わるかもしれません。)
![](../images/bbs/mark_main_g.gif)
| |
|
2022/1/24(Mon) 23:27:11|NO.95179
私のpcの備忘録。(※間違ってたらすみません)
この問題、実は、listbox だけでなく
comboxも関係があったりする...
(※ listbox程では、ないですが)
objmode 2 を使って、フォント、サイズ変更
と後、(listbox、combox両方?)
p3パラメータ内の文字列の行の
多さ、OSによって左右されるらしい。
comboxの場合、p2パラメータ(拡張yサイズ)が
無視される場合がある。
vb6、vc++ の古書籍を見ると、オブジェクト関係
の拡張yサイズ等の処理は、かなーり面倒で
上で書いた物を、色々計算/指定して
合わせないといけないらしい。
(※ 大体の場合で、目的のサイズの、近似値にしかならない。)
私、最初、hsp3側の仕様?と思っていたのですが
Windowsの小人の仕業 (...すみません 仕様です。)
Windows10 でも、解消されてなかったんですね。
|
|
2022/4/7(Thu) 02:07:11|NO.95926
>zrs90(5さい)さん
情報ありがとうございます。
基本的にObjPosModの仕事範囲としてはスクリプトのpos,objsize等のパラメータをいじくる所までかなと思ってます。
使用者も急にsendmsg等が書き加えられてしまうと面食らうと思いますので、仕様/制限ということにしておこうと思います。
検討してみて、Ver.2.0更新時に報告と共に返信しようと思ってたので返事が遅くなりました。
申し訳ありません。
で、、、
|
|
2022/4/7(Thu) 02:08:28|NO.95927
Ver.2.0 が出来ました。
ホームページ: http://suwa.pupu.jp/HSP/index.html#objposmod
GitHub: https://github.com/MIZUSHIKI/HSP-Module/blob/master/ObjPosMod.hsp
今回の更新で、独自モジュールのオブジェクトも位置・サイズを操作できるようになりました。
<Ver.2.0の更新内容>
- 拡張オブジェクト(独自モジュール)を登録できるように大幅改造。
- リストの全選択ボタンを追加。
- sysfontに対応できていなかったを修正。
- HSP3.7β2から修正予定のpicloadバグFixにも対応できるように修正。
ただ、この拡張オブジェクトの対応の仕方なんですが、、、
ObjPosMod.hsp の中で行っている処理の一部を 拡張用ファイル(ObjPosMod_grpbox.hsp)の中で記述して処理を追加していく形になります。
ObjPosMod がどういう処理をしているのか理解しないといけないので大変かもしれません。。。
ObjPosMod_grpbox.hsp(独自のグループボックスモジュール)、ObjPosMod_hsp3util.hsp(hsp3util内オブジェクト)に使用例があるので、
それを見て真似て作って欲しいのですが、だいぶ無理やり拡張してる感じもしてるのでちょっと厳しいとは思ってます。
//netincludeモジュール(自動でGitHubからモジュールをダウンロードします)
#ifdef _debug
#include "hspinet.as"
#include "mod_regexp.as"
#define netinclude(%1,%2=_@_@) addition %1*
exist"hsptmp":if strsize>0{a@_@="":b@_@="":w@_@=dir_exe+"\\common\\":y@_@="#net\include":notesel a@_@:noteload"hsptmp":noteunsel:matches a@_@,a@_@,y@_@+"\\s*\"((?:net/)?)(.+?)\"\\s*/\\s*,?\\s*(\\w*)":repeat stat:x@_@=w@_@:if"current"=a@_@.cnt.3{x@_@=""}exist x@_@+a@_@.cnt.1+a@_@.cnt.2:a@_@.cnt="0":if strsize<0{a@_@.cnt="":if""=x@_@{a@_@.cnt.3="2":m@_@++}else{a@_@.cnt.3="1":n@_@++}}
loop:if n@_@+m@_@>0{s@_@="","","":z@_@="ダウンロード":repeat 2,1:i@_@=cnt:foreach a@_@:if"0"=a@_@.cnt{continue}if""+i@_@!a@_@.cnt.3{continue}if""!a@_@.cnt.1{if""=b@_@{netinit:neturl"https://main-timetag.ssl-lolipop.jp/HSP3NetModules/netmod.php?req=data":netrequest_get"":repeat:netexec n@_@:if n@_@{break}await 50:loop:netgetv b@_@:matches b@_@,b@_@,"^(.*?)\t(.*?)$":j@_@=stat}k@_@=cnt
a@_@.cnt="0":repeat j@_@:if getpath(b@_@.cnt.1,16)=getpath(a@_@.k@_@.2,16){a@_@.k@_@=b@_@.cnt.2:a@_@.k@_@.2=b@_@.cnt.1:break}loop:if"0"=a@_@.cnt{continue}s@_@.i@_@+=">net/(->"+a@_@.cnt+")"+a@_@.cnt.2+"\n"}else{s@_@.i@_@+=">"+a@_@.cnt.2+"\n"}loop:loop:if""=s@_@.1+s@_@.2{dialog"モジュールデータが見つかりませんでした",1,y@_@:end}if""!s@_@.1{s@_@.0+=w@_@+"\n\nに\n\n"+s@_@.1:if""!s@_@.2{
s@_@.0+="\nを"+z@_@+"、\n------\n\n"}}if""!s@_@.2{s@_@.0+=dir_cur+"\n\nに\n\n"+s@_@.2}dialog s@_@.0+"\nを"+z@_@+"します。",2,y@_@:if stat=6{s@_@="":x@_@=dir_cur:if""=b@_@{netinit}foreach a@_@:if"0"=a@_@.cnt{continue}if"1"=a@_@.cnt.3{chdir w@_@}a@_@.cnt.1+=a@_@.cnt.2:a@_@.cnt=a@_@.cnt+a@_@.cnt.2:split a@_@.cnt.1,"/",b@_@:repeat stat-1:dirlist _@_@,b@_@.cnt,5:if stat=0{mkdir b@_@.cnt}
chdir b@_@.cnt:loop:neturl"https://raw.githubusercontent.com/"+a@_@.cnt:netrequest_get"":repeat:netexec n@_@:if n@_@{break}await 50:loop:netgetv b@_@:if"40"=strmid(b@_@,0,2){s@_@+=">"+a@_@.cnt+"\n"}else{notesel b@_@:notesave getpath(a@_@.cnt,8)}chdir x@_@:loop:if""!s@_@{dialog z@_@+"に失敗しました。\n\n"+s@_@,,y@_@:end}dialog z@_@+"しました。\nHSPを再実行して下さい。",,y@_@:end}}sdim a@_@}
#else
#define netinclude(%1,%2=_@_@) include %1
#endif
#netinclude "net/ObjPosMod.hsp"/
// Object Pos Module 拡張用のファイルをインクルード
#netinclude "net/ObjPosMod_hsp3util.hsp"/
#netinclude "net/ObjPosMod_grpbox.hsp"/
// user32.asとgdi32.asはスタティックテキストのフォント変更と中央表示設定のためにインクルードしているだけです。
#include "user32.as"
#include "gdi32.as"
// 普通にモジュールを使うためのインクルード。(ObjPosMod_hsp3util.hsp等の中で重複するが実行ファイル作成時に必要となる)
#include "hsp3util.as"
#netinclude "net/mod_grpbox.hsp"/
screen 0, 480,320, , 50,50
font "MS ゴシック", 14
pos 10,10
ipt="オブジェクトやmesの位置を、Ctrlキーを押しながら"
input ipt, 380, 20
mes "左ドラッグで移動、右ドラッグでサイズ変更ができます。"
mes "[スクリプト変更]ボタンでエディタ上のスクリプトを書き換えます。"
objsize 375, 20
combox comb, , "リストビューでダブルクリックをするとスクリプトエディタの該当行に移動します。"
pos 365, 85 : objsize 100, 100
listbox listb, 0, "リストボックスは\nうまく指定行の\n高さにできない\nことがあります。\n\n(現状、仕様です。)"
color 0,0,255
boxf 150, 93, 157, 100
sysfont 17 : color : pos 170, 90 : mes "メッセージ"
msbx="オブジェクトの操作時にあわせてShiftも押すと移動の縦横制限をしたり、サイズを縦横同時に合わせることができます。"
pos 145, 110 : mesbox msbx, 115, 100
objsize 70, 65
pos 271, 110 : button goto "実行", *go
objsize 70, 25
pos 271, 185 : button gosub "変更", *ch
pos 145, 215
winobj "msctls_trackbar32","",,$50000000|$100|$10|$8, 195, 20
objsize 100, 30 : chkbox "チェックボックス",b
color 255,0,0
circle 380,215,455,290
line 43, 305, 463, 305
line 150,180
line 5, 180
color 0,255,0
grect 60,140, M_PI*60/360, 50,75
screen 1,480,320, ,ginfo_wx2+10, ginfo_wy1
sysfont 17
mes "基本オブジェクト以外にも拡張できます。\n例えば hsp3util のスタティックテキスト (ObjPosMod_hsp3util.hsp)\n"
statictext "hsp3util\nスタティックテキスト",120,40
hStatic = objinfo_hwnd(stat)
SetWindowLong hStatic, -16, GetWindowLong( hStatic, -16) | $1 ;中央表示
GetStockObject 17 : sendmsg hStatic, $30, stat ;フォント変更
mes ""
mes "また、独自モジュールのオブジェクトも拡張オブジェクトとして登録できます (ObjPosMod_grpbox.hsp)"
pos 17, 110
grpbox "GROUP", 150, 100
pos 187, 110 : color 230,0,0
edgebox "グループ", 150, 100
pos 10, 220 : color
;progbar 200,20
;pos 0,
;scrollbar ginfo_sx,20
repeat 4
mes "cnt="+cnt+" (リピートは先頭のみ操作対象)"
loop
gsel 0
screen 2,480,320, ,ginfo_wx1, ginfo_wy2+20
gsel 0, 1 : gsel 2
mes "すべてのウィンドウ、#include先も対応"
color 0,0,255
boxf 40, 40, 90, 90
color 255,0,0 : boxf 115, 80, 199, 164
color
pos -170, 200
exist dir_tv+"koma.png"
if strsize ! -1 : picload dir_tv+"koma.png", 1
pos 250,20
exist "c:\\hsp36\\sample\\basic\\sysinfo.hsp"
if strsize ! -1 {
mes "#include \"c:\\hsp36\\sample\\basic\\sysinfo.hsp\"\n"
#addition "c:\\hsp36\\sample\\basic\\sysinfo.hsp" ; addition == include(non error)
}else {
exist "c:\\hsp351\\sample\\basic\\sysinfo.hsp"
if strsize ! -1 {
mes "#include \"c:\\hsp351\\sample\\basic\\sysinfo.hsp\"\n"
#addition "c:\\hsp351\\sample\\basic\\sysinfo.hsp" ; addition == include(non error)
}
}
stop
*go
gsel 0 : title "実行"
stop
*ch
gsel 0 : title "変更"
return
拡張オブジェクトのスクリプト
GitHub: https://github.com/MIZUSHIKI/HSP-Module/tree/master/ObjPosModExp
![](../images/bbs/mark_main_g.gif)
| |
|
2022/4/7(Thu) 19:24:55|NO.95928
MIZUSHIKI さん
返答して頂き、ありがとうございます。
少しでも参考になった(?)のであれば
幸いです。
(※お手間を取らせてしまっただけ
...ではないかと。
今なら、楽に実装出来る別の方法が
ありそうな気がするんですが...)
|
|
2022/4/7(Thu) 21:48:58|NO.95929
>zrs90(5さい)さん
情報自体は大歓迎です。
どういうことが出来てどこまで対応しようか検討もできますし。
あと単純に、そんなメッセージや方法があるんだ〜って楽しいです(*´∪`*)v
|
|