|
|
2015/8/14(Fri) 22:52:49|NO.70762
スレを建てる程でもないが、あると少し便利に成るモジュールを自由に書くスレッドです。
|
|
2015/8/14(Fri) 22:53:40|NO.70763
やはり言い出しっぺが書くのが基本ですよね。
文章を切り抜くモジュールです。
#module 文字列加工
/*
p1 文章の開始を示す特徴文
p2 元の文章が入った変数
p3 文章の終了を示す特徴文
p4 何個目を調べるか
文字列の中から特定の文字列で囲まれた文字列を切り抜きます。
instrとstrmidで行っていた作業を自動化しているだけです。
p4は一定のルールで並べられたデータを整形するときに使います。
主に、htmlに対して使うことを想定しています。
基本的には0で問題ありません。
*/
#defcfunc cat str str1 ,str str2 ,str str3,int ct
ct2=ct
開始文字数 = strlen(str1)
終了文字数 = strlen(str3)
開始=str1
文字列=str2
終了=str3
開始in=0
終了in=0
repeat ct2+1
開始in = instr(文字列,開始in,開始)+開始文字数+開始in
loop
終了in = instr(文字列,開始in,終了)+開始in
最終=strmid(文字列,開始in,終了in-開始in)
return 最終
/*
パラメーターはcatと同じ。
特定の文字列を削除します。
*/
#defcfunc delcat str str1 ,str str2 ,str str3
開始文字数 = strlen(str1)
全体文字数 = strlen(str2)
終了文字数 = strlen(str3)
開始=str1
最終=""
文字列=str2
終了=str3
開始in=0
repeat
開始in = instr(文字列,0,開始)
if 開始in!-1:{
終了in = instr(文字列,開始in,終了)+開始in
if 終了in!-1:{
文字列=""+strmid(文字列,0,開始in)+""+strmid(文字列,終了in+終了文字数,全体文字数)+""
}else:break
}else:break
loop
return 文字列
#global
文字列="HSPとは、ホット スープ スクリプトの、略です。"
mes 文字列
mes cat("、",文字列,"の、",0)
mes delcat("、",文字列,"の、")
mes delcat("ク",delcat("プ ",delcat(" ス",delcat("ホ",文字列,"ッ")," ス")," プ "),"プ")
| |
|
2015/8/15(Sat) 00:55:17|NO.70764
作ってみたけども思ったほど画期的には便利にならなかったモジュールってことでもいいのでしょうか。
いくつかありますが、文字列操作つながりでこんなのどうでしょうか。
m_stringモジュール
http://mclab.uunyan.com/dl/dl16.htm
標準命令にない文字列操作命令/関数を追加します。
・文字列の挿入・削除
・文字列の描画領域のサイズ取得
・指定幅での自動改行挿入(禁則処理対応)
・文字のマルチバイト判定。
表示領域の幅に収まるように自動的に改行を挿入出来ます。改行を気にせずにデータが作れます。
アドベンチャーゲームとかでの利用を想定してたんですが自分でも使う機会がほぼ無く…。
|
|
2015/8/15(Sat) 02:04:01|NO.70767
>>作ってみたけども思ったほど画期的には便利にならなかったモジュールってことでもいいのでしょうか。
問題ありませんがm_stringはいつも使わせて頂いています。
特にADVノベルゲームみたいなのでは必須ですw
便利すぎてないと非常に困ります・・・
|
|
2015/8/15(Sat) 08:50:34|NO.70769
クリック判定できるテキスト
#module
// ウィンドウメッセージで検出可能なテキストを表示
#deffunc mes2 str _str, int _w, int _h
winobj "static",_str,,$50000000 | $100,_w,_h
h=objinfo(stat,2) // ハンドル
mref m,67: sendmsg h,$30,m(38) // スタティックテキストのフォント変更 ※
return h // statでハンドルを返す
// ※ mes2 実行時のウィンドウのフォントが適用されます
#global
title "クリック判定できるテキスト"
// ウィンドウメッセージによる割り込み
oncmd gosub *click, $0111
;font "MS P明朝",18 // フォントを変えてみる場合
;syscolor 15: boxf: syscolor 8 // スタティックテキストと同じ背景色にする場合
// mes2 表示テキスト,横幅,縦幅 statにハンドルが返るので変数に入れて管理
pos 215,100: mes2 "クリックできるのー♪",220,18: h_mes(0)=stat
pos ,120: mes2 "2つめのメッセージなのー♪",220,18: h_mes(1)=stat
pos ,140: mes2 "わぁい♪",220,18: h_mes(2)=stat
pos ,160: mes2 "ここをクリックで終了",220,18: h_mes(3)=stat
pos 215,240
mes "ハンドル一覧:"
repeat 4: mes "h_mes("+cnt+") = "+h_mes(cnt): loop
stop // stop wait await のときに割り込みが入る
*click
h=lparam // 原因となったオブジェクトのハンドル
if h=h_mes(3) { dialog "おわり♪": end } // 終了
dialog "押したのー♪\nハンドル="+h
return
|
|
2015/8/16(Sun) 00:37:24|NO.70782
> 問題ありませんがm_stringはいつも使わせて頂いています。
あああ、ありがとうございます。
今までモジュール作ってきてリアクションいただいたことがほとんどないのでとても励みになります。
次こそはもっと使いどころがわからないやつを!(そうじゃなくて少し便利になる…)
数値を2進数(文字列)に変換するモジュール
#module
#defcfunc tobit int num
s=""
repeat 32
s = str((num & 1<<cnt)!0) + s
loop
return s
#global
mes tobit( 5 )
デバッグする時にlogmesと併用して…とか。
|
|
2015/8/16(Sun) 01:46:14|NO.70783
モジュールはまだ勉強不足なんで、モジュール化は出来ていないのですが、
repeat〜loop内で正確に60fpsを出す方法です。
if (cnt\3)=0 : await 16 : else : await 17
;16msで1回,17msで2回待機させると16.666666...=60fpsとなる
|
|
2015/8/16(Sun) 01:52:18|NO.70784
漁っていたら過去に書いたものを見つけたので
// 画像サイズ取得モジュール
// NYSLです
// 変数名からしてやる気がないです
// コードからダルさが滲み出てます
// 簡易的なファイルチェックにも使えます
#ifndef imgsize
#module imgsize
// 画像の大きさ取得
// getimgsize ファイル名[S], 横幅[Vo], 高さ[Vo]
// S…文字列 I…数値 D…実数 V…変数 A…配列
// 無印…入力 o…出力
//
// 返り値
// 0…正常終了
// 1…ファイルが存在しない
// 2…ファイルのサイズが足りない
// 3…ヘッダが不正
// 4…未実装のファイルタイプ
// 5…不明なファイルタイプ
#deffunc getimgsize str f, var w, var h, \
local s, local d
w = -1
h = -1
exist f
s = strsize
if strsize < 0 : return 1
/*
d = ginfo_sel
buffer 200, 1, 1
picload f
w = ginfo_sx
h = ginfo_sy
buffer 200, 1, 1
gsel d
/*/
switch getpath(f, 18)
case ".bmp"
sdim d, 55
if s < 18 : return 2
bload f, d, 18
if wpeek(d, 0) != 0x4D42 : return 3
switch lpeek(d, 14)
// OS/2
case 12
if s < 26 : return 2
bload f, d, 26
w = wpeek(d, 18)
h = wpeek(d, 20)
swbreak
// Win
case 40
if s < 54 : return 2
bload f, d, 54
w = lpeek(d, 18)
h = lpeek(d, 22)
swbreak
// Unknown
default
return 3
swbreak
swend
swbreak
case ".png"
dim d, 9
if s < 33 : return 2
bload f, d, 33
if d(0) != 0x474E5089 : return 3
if d(1) != 0x0A1A0A0D : return 3
if d(2) != 0x0D000000 : return 3
if d(3) != 0x52444849 : return 3
w = (peek(d,16)<<24) | (peek(d,17)<<16) | (peek(d,18)<<8) | peek(d,19)
h = (peek(d,20)<<24) | (peek(d,21)<<16) | (peek(d,22)<<8) | peek(d,23)
// CRCチェックは省略
swbreak
case ".gif"
dim d, 4
if s < 13 : return 2
bload f, d, 13
if (d(0) & 0x00FFFFFF) != 0x00464947 : return 3
// バージョンチェックは省略
w = wpeek(d, 6)
h = wpeek(d, 8)
swbreak
case ".jpg"
case ".jpeg"
// めんどいので未サポート
// だれかやって
return 4
swbreak
// 謎のファイル
default
return 5
swbreak
swend
//*/
return 0
#global
#endif
| |
|
2015/8/16(Sun) 05:52:35|NO.70786
R,G,Bを入力するとHSVカラーのH(色相)を0〜360の範囲で返すモジュール
#defcfunc RGBtoHSV int red, int green, int blue
max =mathmax(red,mathmax(green, blue))
min =mathmin(red,mathmin(green, blue))
if (max == min):hue = 0:else{
if (max == red):hue = ((60 * (green - blue) / (max - min) + 360))\360
if (max == green):hue = (60 * (blue - red) / (max - min)) + 120
if (max == blue):hue = (60 * (red - green) / (max - min)) + 240
}
return hue
#defcfunc mathmax int a, int b
if a<b:return b
return a
#defcfunc mathmin int a, int b
if a>=b:return b
return a
|
|
2015/8/16(Sun) 07:16:42|NO.70788
60FPSはこっちのがスッキリ。
じつはこれでもタイマー精度の問題で微妙にズレるけどね。
hsp3dish(Android)もこれでいけます(こっちは精度が高く問題なし)。
await 17-(cnt\3)=0
|
|
2015/8/16(Sun) 09:40:19|NO.70792
セパレータライン
#module
// セパレータライン
#deffunc sepline int _p1, int _p2, int _p3
if _p3 { i=$800000 } else { i=$1000 }
winobj "static","",,$50000000 | i,_p1,_p2
return
#global
syscolor 15: boxf
syscolor 8
// sepline 横幅,縦幅,タイプスイッチ(0:影付 1:単線)
pos 120,120: sepline 400,2 // 影付
pos ,140: sepline 400,3 // 影付
pos ,160: sepline 400,8 // 影付
pos ,220: sepline 400,1,1 // 単線
pos ,240: sepline 400,2,1 // 単線
pos ,260: sepline 400,8,1 // 単線
|
|
2015/8/16(Sun) 09:49:35|NO.70793
ボックス線
#module
// ボックス線
#deffunc boxline int _x1, int _y1, int _x2, int _y2
line _x1+(_x2<_x1)-(_x2>_x1),_y1,_x2,_y1
line _x1,_y2,_x2,_y2
line _x1,_y1,_x1,_y2
line _x2,_y1,_x2,_y2
return
#global
// boxline x1,y1,x2,y2
repeat
color rnd(255),rnd(255),rnd(255)
boxline rnd(640),rnd(480),rnd(640),rnd(480)
await 16
loop
|
|
2015/8/16(Sun) 18:13:56|NO.70812
数式の文字列を計算するモジュール
いい変数名が思いつかなかったためわかりにくくなっています
#module mojikeisan
//数式の文字列を計算するモジュール
//使い方 keisan(数式,計算方法[0=整数型,1=実数型,2=簡易数式チェック])
//整数型の場合返し値は整数型(int)
//実数型の場合返し値は実数型(double)
//簡易数式チェックの場合 0=数式はおかしい 1=数式は正しい (注意: ()+-*/以外の文字のチェックはしません)
//計算方法に0から2以外の数を入れた場合整数型で計算します
#define I tmp.0
#define J tmp.1
#define K tmp.2
#define L tmp.3
#define M tmp.4
#define N tmp.5
#define O tmp.6
#define P tmp.7
#define Q tmp.8
#define R tmp.9
#define S tmp.10
#define T tmp.11
#defcfunc keisan str p1 , int atype , local sushiki , local nagasa , local stmp , local tmp , local btype , local dtmp//ローカル変数はつけ外ししてください
sushiki=p1
nagasa=strlen(sushiki)
btype=atype
if atype<0 | atype>2 : btype=0
if btype==1{
ddim dtmp,5
sdim stmp,nagasa*8+1,4
}else{
sdim stmp,nagasa+1,4
}
dim tmp,12
I=0
K=0
while I<nagasa//数式チェック
J=peek(sushiki,I)
if J=='(' : K+=1
if J==')' : K-=1{
if I<nagasa-1
if J=='(' | J=='+' | J=='-' | J=='/' | J=='*'{
J=peek(sushiki,I+1)
if J=='+' | J=='-' | J=='/' | J=='*'{
K=-1 : _break
}
J=peek(sushiki,I)
}
}
if I==0{
if J==')' | J=='+' | J=='-' | J=='/' | J=='*'{
K=-1 : _break
}
}
if I==nagasa-1{
if J=='(' | J=='+' | J=='-' | J=='/' | J=='*'{
K=-1 : _break
}
}
I++
wend
if K!=0 : return 0//かっこの数が合わない場合
if btype==2 : return 1
while//計算
if peek(sushiki,0)=='-' | peek(sushiki,0)==0 : _break
//かっこの中身を取り出し
I=0
J=instr(sushiki,I,"(")
while J!=-1 & J<instr(sushiki,I,")")
I+=(J+1)
J=instr(sushiki,I,"(")
wend
J=instr(sushiki,I,")")
if J==-1 : J=strlen(sushiki)-I
poke stmp.0,J,0
memcpy stmp.0,sushiki,J,,I
if J+I<nagasa {
poke stmp.1,nagasa-(J+I+1),0
memcpy stmp.1,sushiki,nagasa-(J+I+1),,J+I+1
}else{
poke stmp.1,0,0
}
if I>0 : poke sushiki,I-1,0 : else : poke sushiki,0,0
//中身を計算
T=J
while instr(stmp.0,0,"*")!=-1 | instr(stmp.0,0,"/")!=-1//掛け算と割り算を先に計算
//前から計算
K=0
L=0
while L!=-1
K+=(L+1)
L=instr(stmp.0,K,"+")
M=instr(stmp.0,K,"/")
N=instr(stmp.0,K,"*")
if N==-1 : N=J
if M==-1 : M=J
if L==-1 | L>N | L>M : L=instr(stmp.0,K,"-")
if L==-1 | L>N | L>M : L=-1
wend
if K==1 : K=0
L=instr(stmp.0,K,"/")
M=instr(stmp.0,K,"*")
if M==-1 : M=J-K
if L>M | L==-1 : L=M
if L==-1 : L=J-K
poke stmp.2,L,0
memcpy stmp.2,stmp.0,L,,K
if btype==0 : O=int(stmp.2)
if btype==1 : dtmp.0=double(stmp.2)
M=instr(stmp.0,K+L,"+")
S=instr(stmp.0,K+L+1,"*")+1
R=instr(stmp.0,K+L+1,"/")+1
T=instr(stmp.0,K+L,"-")
if S==0 : S=J-(K+L)
if R==0 : R=J-(K+L)
if T==-1 : T=J-(K+L)
if M==-1 | M>T : M=T
if M==-1 | M>S : M=S
if M==-1 | M>R : M=R
if M==-1:M=J-(K+L)
poke stmp.2,M-1,0
memcpy stmp.2,stmp.0,M-1,,K+L+1
if btype==0 : P=int(stmp.2)
if btype==1 : dtmp.1=double(stmp.2)
if btype==0{
if peek(stmp.0,K+L)=='*' : O*=P
if peek(stmp.0,K+L)=='/' : O/=P
}
if btype==1{
if peek(stmp.0,K+L)=='*' : dtmp.0*=dtmp.1
if peek(stmp.0,K+L)=='/' : dtmp.0/=dtmp.1
}
poke stmp.3,J-(M+K+L)
memcpy stmp.3,stmp.0,J-(M+K+L),,M+K+L
poke stmp.0,K,0
if btype==0 : stmp.0+=str(O)+stmp.3
if btype==1 : stmp.0+=str(dtmp.0)+stmp.3
J=strlen(stmp.0)
wend
if instr(stmp.0,0,"+")==-1 & instr(stmp.0,0,"-")==-1{
poke stmp.0,J,"+0"
J+=2
poke stmp.0,J,0
}
while instr(stmp.0,0,"+")!=-1 | instr(stmp.0,0,"-")!=-1//足し算と引き算を後に計算
//後ろから計算
K=-1
L=0
while L!=-1
K+=(L+1)
L=instr(stmp.0,K,"+")
N=instr(stmp.0,K,"-")
if N==-1 : N=J
if L==-1 | L>N : L=N
if L==J : L=-1
wend
if K==1 : K=0
L=instr(stmp.0,K,"+")
M=instr(stmp.0,K,"-")
if M==-1 : M=J-K
if L>M | L==-1 : L=M
if L==-1 : L=J-K
poke stmp.2,L,0
memcpy stmp.2,stmp.0,L,,K
if btype==1 : dtmp.0=double(stmp.2)
if btype==0 : O=int(stmp.2)
M=0
S=-1
N=0
while N!=-1
S+=(N+1)
N=instr(stmp.0,S,"+")
Q=instr(stmp.0,S,"-")
if Q==-1 : Q=K-1
if N==-1 | N>Q : N=Q
if N==K-1 : _break
//N=R
M=S
wend
poke stmp.2,N,0
memcpy stmp.2,stmp.0,N,,M
if btype==1 : dtmp.1=double(stmp.2)
if btype==0 : P=int(stmp.2)
if btype==0{
if M>0 : if peek(stmp.0,M-1)=='-' : P=-P
if peek(stmp.0,K-1)=='+' : Q=P+O
if peek(stmp.0,K-1)=='-' : Q=P-O
}
if btype==1{
if M>0 : if peek(stmp.0,M-1)=='-' : dtmp.1=-dtmp.1
if peek(stmp.0,K-1)=='+' : dtmp.2=dtmp.1+dtmp.0
if peek(stmp.0,K-1)=='-' : dtmp.2=dtmp.1-dtmp.0
}
poke stmp.3,J-(K+L),0
memcpy stmp.3,stmp.0,J-(K+L),,K+L
if btype==0{
if Q>0 {
poke stmp.0,M,0
}else{
if M>0 : poke stmp.0,M-1,0 : else : poke stmp.0,0,0
}
stmp.0+=str(Q)+stmp.3
}
if btype==1{
if dtmp.2>0 {
poke stmp.0,M,0
}else{
if M>0 : poke stmp.0,M-1,0 : else : poke stmp.0,0,0
}
stmp.0+=str(dtmp.2)+stmp.3
}
J=strlen(stmp.0)
J=strlen(stmp.0)
if peek(stmp.0,0)=='-'{
if I>1 {
switch peek(sushiki,I-2)
case '+'
poke sushiki,I-2,0
I--
nagasa=(nagasa-(T+I+1))+(J)+(I-1)
memcpy sushiki,stmp.0,J,I-1
if peek(stmp.1,0)!=0 {
memcpy sushiki,stmp.1,(nagasa-(T+I+1)),(J)+(I-1)
}else{
nagasa=(J)+(I-1)
}
swbreak
case '-'
poke sushiki,I-2,0
I--
nagasa=(nagasa-(T+I+1))+(J)+(I-1)
memcpy sushiki,stmp.0,J,I-1
poke sushiki,I-1,'+'
if peek(stmp.1,0)!=0 {
memcpy sushiki,stmp.1,(nagasa-(T+I+1)),(J)+(I-1)
}else{
nagasa=(J)+(I-1)
}
swbreak
swend
}else{
nagasa=(nagasa-(T+I+1))+(J)
memcpy sushiki,stmp.0,J
if peek(stmp.1,0)!=0{
memcpy sushiki,stmp.1,(nagasa-(T+I+1)),J
}else{
nagasa=J
}
}
poke sushiki,nagasa,0
_break
}
if instr(stmp.0,0,"+")==-1 & instr(stmp.0,0,"-")==-1{
R=nagasa
if I>0 : I--
nagasa=(nagasa-(T+I+1))+J+I
memcpy sushiki,stmp.0,J,I
if peek(stmp.1,0)!=0{
memcpy sushiki,stmp.1,(R-(T+I+1)),J+I
}else{
nagasa=J+I
}
poke sushiki,nagasa,0
_break
}
wend
if peek(sushiki,0)==0 {
memcpy sushiki,stmp.0,J : nagasa=J
if peek(stmp.1,0)!=0{
memcpy sushiki,stmp.1,(nagasa-(T+I+1)),J
nagasa+=(nagasa-(T+I+1))
}
poke sushiki,nagasa,0
}
if instr(sushiki,0,"(")==-1 & instr(sushiki,0,")")==-1{
if instr(sushiki,0,"+")==-1 & instr(sushiki,0,"-")==-1{
if instr(sushiki,0,"*")==-1 & instr(sushiki,0,"/")==-1{
_break
}
}
}
wend
if btype==0 : return int(sushiki)
if btype==1 : return double(sushiki)
#global
//サンプル(数字は適当)
a=keisan("1000+10+(1+(1-42/21+6*1*3/2-820))")+1
mes a
mes keisan("")
mes keisan("4+5*2-1/2")//掛け算割り算は優先
mes keisan("17+0")
mes keisan("(7+1)")
mes keisan("1+(4)")
mes keisan("((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((45))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))+1")//100重かっこ
mes keisan(")+3")//エラー処理
mes keisan("12+3(",2)//エラーチェック
mes keisan("1+6",2)//エラーチェック
mes keisan("1+7",6)//エラーチェック
mes keisan("1/3",1)//実数計算
mes keisan("1-(1-2)",1)
ダウンロード先
https://aa38020e42f53ca54e166915354734af1f102cbd.googledrive.com/host/0B9vewWZYDiXefmNjRWZCb1FrUmpab3o2dk5nTXRkRFdGTXFqTWZjNExVTm41OHUwWFdRUG8/apps/calculat.txt
| |
|
2015/8/16(Sun) 20:37:03|NO.70816
オブジェクトの表示されている文字列(タイトル)を取得するだけのモジュール
#module gettext
#define INVALID_HANDLE_VALUE $FFFFFFFF
#define WM_GETTEXT $0000000D
#define WM_GETTEXTLENGTH $0000000E
#uselib "user32.dll"
#cfunc GetWindowTextLength "GetWindowTextLengthA" int
#deffunc textshutoku var p1 , int handle// , local textlength
if handle==INVALID_HANDLE_VALUE : return 0
textlength= GetWindowTextLength(handle)
//sendmsg handle, WM_GETTEXTLENGTH : textlength=stat //sendmsgでWM_GETTEXTLENGTHを送ってもいい
memexpand p1,textlength+1
sendmsg handle, WM_GETTEXT, textlength+1,varptr(p1)
poke p1,textlength,0
return textlength
#global
//サンプル
//ウィンドウスタイル
#define WS_CHILDWINDOW $40000000
#define WS_VISIBLE $10000000
#define WS_VSCROLL $00200000//縦スクロールバー
#define WS_HSCROLL $00100000//横スクロールバー
#define ES_AUTOHSCROLL $00000080//横に自動でスクロール
#define ES_AUTOVSCROLL $00000040//縦にに自動でスクロール
//ウィンドウスタイル(エディトコントロール専用)
#define ES_READONLY $00000800//書き換え禁止
#define ES_MULTILINE $00000004//mesbox化
#define ES_NUMBER $00002000//数字のみを入力できるようにする
//拡張ウィンドウスタイル
#define WS_EX_CLIENTEDGE $00000200//mesboxと同じ縁
#define WM_SETTEXT $0000000C
sdim texttmp
winobj "edit" , "" , WS_EX_CLIENTEDGE , WS_HSCROLL | WS_VSCROLL | WS_CHILDWINDOW | WS_VISIBLE | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL , ginfo_winx/2 , ginfo_winy-25
pos ginfo_winx/2,0
winobj "edit" , "" , WS_EX_CLIENTEDGE , ES_READONLY | WS_HSCROLL | WS_VSCROLL | WS_CHILDWINDOW | WS_VISIBLE | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL , ginfo_winx-ginfo_winx/2 , ginfo_winy-25
pos 0,ginfo_winy-25
objsize ginfo_winx,25
button gosub "左から右にコピー",*fukusha
stop
*fukusha
textshutoku texttmp , objinfo_hwnd(0)
sendmsg objinfo_hwnd(1) , WM_SETTEXT ,, texttmp
return
| |
|
2015/8/16(Sun) 22:58:23|NO.70818
画像比較モジュール。前に誰かが似たようなものを公開してた気がする・・・
一応、処理と正確性のバランスを調整できます。
#module
//比較除外色の情報をすべてクリア
#deffunc imghclsdel
dim IMGHCOLOR,1:return
// 比較する対象から除外する色を指定
// imghclsadd R,G,B
#deffunc imghclsadd int p1, int p2, int p3
if IMGHCOLOR=0{sdim IMGHCOLOR,64,0:IMGHCOLOR.(length(IMGHCOLOR)-1)=""+p1+","+p2+","+p3
}else{:IMGHCOLOR.(length(IMGHCOLOR))=""+p1+","+p2+","+p3:}:return
/*
imgh
p1 比較元ウィンドウID
p2 比較先ウィンドウID
p3 類似率を算出するアルゴリズム。
0で色の違いの度合いも含めて算出
1で色が少しでも違った場合、完全に違う色として算出
0だと類似率が高くなりがち、1だと低め。基本的に1推奨
p4 正確度。総ピクセル/p4で比較するピクセルの数を決定する為、
値を高くすればするほど処理は早くなるが正確性は失われる。
比較する画像・目的によっても変わるが、総px/1000.0程度の値を指定しても正確性は問題ない。
隠し機能として、比較するかしないかをRGB個別に指定可能。
下にあるAは上からR,G,Bに割り当てられていて、0で比較なし、1で比較あり。
デフォだとRGB全て比較。
*/
#defcfunc imgmc int 比較元,int 比較先,int モード,int sc2
sc=sc2
A.0=1
A.1=1
A.2=1
操作先ウィンドウID=ginfo(3)
gsel 比較元
mref 比較元px,66
比較サイズx=ginfo_winx:比較サイズy=ginfo_winy
sc=limit(sc,1,(比較サイズx*比較サイズy)/10.0)
総px=double(比較サイズx*比較サイズy)/sc
gsel 比較先
mref 比較先px,66
if 比較サイズx!ginfo_winx or 比較サイズy!ginfo_winy:Dialog "比較元のウィンドウサイズと\n比較先のウィンドウサイズが異なります。",1,"ウィンドウサイズが異なります":return -1
dim 元,3,総px
dim 先,3,総px
dim 差,3
類似値=double(0.0)
repeat 総px
ct=cnt
repeat 3
if A.cnt=1:{
元.cnt.ct=peek (比較元px,(ct*sc)+(2-cnt))
先.cnt.ct=peek (比較先px,(ct*sc)+(2-cnt))
if (元.cnt.ct-先.cnt.ct)>=0 & モード=0:{
差.cnt+(元.cnt.ct-先.cnt.ct)
}else{
差.cnt+(先.cnt.ct-元.cnt.ct)
}
if (元.cnt.ct-先.cnt.ct)!0 & モード=1:{
差.cnt+255
}
}
loop
loop
repeat 3
if A.cnt=1:類似値+(100.0-(double(差.cnt)/double(総px*2.55)))
loop
類似値/double(A.0+A.1+A.2)
gsel 操作先ウィンドウid
return 類似値
#global
Screen 0,500,500
dialog "",16,"画像"
if stat=1:picload refstr,1:else:Color 255,0,0:boxf 10,10,490,490
Screen 1,ginfo_winx,ginfo_winy
dialog "",16,"画像"
if stat=1:picload refstr,1:else:Color 150,0,0:boxf 5,5,495,495
正確性=(ginfo_winx*ginfo_winy)/10.0
title ""+imgmc(0,1,0,正確性)
| |
|
2015/8/16(Sun) 23:16:41|NO.70819
窓月ららさん>
理論式を使って、真ならば1が入るのを利用するとすごく短くなるようですね。
今後、活用させていただきます。
|
|
2015/8/17(Mon) 00:04:42|NO.70824
皆さんのモジュールが便利すぎる・・・
特に窓月ららさんの描画系や脳漿さんのレイヤードウィンドウは使い所が多そうですね。
|
|
2015/8/17(Mon) 06:57:19|NO.70829
数式の文字列を計算するモジュール、私も書いてみました。
一度逆ポーランド記法に変換することで簡単にしてみました。
#module c
// 演算子の優先順序
// 低い
#enum UNKNOWN = -1
#enum PAREN // 括弧は例外
#enum XOR_
#enum OR_
#enum AND_
#enum LESS
#enum GRTER
#enum EQUAL
#enum ADD
#enum SUB
#enum MULT
#enum DIV
#enum POW
// 高い
#define stack(%1,%2) sdim %1,20,%2:%1_i=0
#define push(%1,%2) %1(%1_i)=%2:%1_i++
#define ctype pop(%1) _pop@c(%1(%1_i-1),%1_i)
#defcfunc local _pop var val, var index
index--
return val
#define logstack(%1) _tmp="%1:":repeat %1_i:_tmp+=%1(cnt)+",":loop:logmes _tmp
// 計算を行う
#defcfunc calc str f
// 逆ポーランド記法でスタックpriに計算式を積む
import f
// 浮動小数点数で計算するかどうか
is_double = 0
repeat pri_i
token = pri(cnt)
// 小数点が含まれていればそれ以降浮動小数点として扱う
is_double |= (instr(token, 1, ".") != -1)
if ( to_ope(token) == UNKNOWN ) { // 数値なら
push sec, token
} else { // 演算子なら
// 左辺、右辺を取得
right = pop(sec)
left = pop(sec)
// 文字列から変換
if (is_double) {
right = double(right)
left = double(left)
} else {
right = int(right)
left = int(left)
}
// 計算処理
switch(to_ope(token))
case XOR_
push sec, str(int(left) ^ int(right))
swbreak
case OR_
push sec, str(int(left) | int(right))
swbreak
case AND_
push sec, str(int(left) & int(right))
swbreak
case LESS
push sec, str(left < right)
swbreak
case GRTER
push sec, str(left > right)
swbreak
case EQUAL
push sec, str(left == right)
swbreak
case ADD
push sec, str(left + right)
swbreak
case SUB
push sec, str(left - right)
swbreak
case MULT
push sec, str(left * right)
swbreak
case DIV
is_double = 1
push sec, str(double(left) / double(right))
swbreak
case POW
push sec, str(powf(left, right))
swbreak
swend
}
loop
if (is_double) {
return double(sec(0))
} else {
return int(sec(0))
}
return
#deffunc local import str f
stack pri, 100
stack sec, 50
target = f
val_tmp = ""
is_val = 0 // トークンが数値であるかどうか
// 文字列の解析
repeat strlen(target)
token = strmid(target,cnt,1)
// 数字の場合
token_c = peek(token, 0)
if ('0' <= token_c && token_c <= '9' || token_c == '.') {
val_tmp += token // val_tmpに数値リテラルを作成する
is_val = 1
continue
}
// 数字と演算子の境で、val_tmpを積む
if (is_val) {
push pri, val_tmp
val_tmp = ""
}
is_val = 0 // 演算子
// 括弧は積むだけ
if (token == "(") {
push sec, token
continue
}
// 対応する括弧までの演算子を移動する
if (token == ")") {
while(sec(sec_i-1) != "(")
push pri, pop(sec)
wend
sec_i--
continue
}
// 演算子の優先順序の処理
if (sec_i > 0) {
if (to_ope(sec(sec_i-1)) > to_ope(token)) {
repeat sec_i
if (sec(sec_i-1) == "(") :break
push pri, pop(sec)
loop
}
}
// 積む
push sec, token
loop
// 数値リテラルが余っていれば積んどく
if (is_val) {
push pri, val_tmp
}
// 残りの演算子を移動する
repeat sec_i
push pri, pop(sec)
loop
return
#defcfunc local to_ope str ope
// 演算子の判定
switch(ope)
case "~"
return XOR_
case "|"
return OR_
case "&"
return AND_
case "<"
return LESS
case ">"
return GRTER
case "="
return EQUAL
case "+"
return ADD
case "-"
return SUB
case "*"
return MULT
case "/"
return DIV
case "^"
return POW
case "("
case ")"
return PAREN
swbreak
swend
return UNKNOWN
#global
pi = calc("4*(1-1/3+1/5-1/7+1/9-1/11+1/13-1/15+1/17-1/19+1/21-1/23+1/25)")
mes "PI="+pi
mes
e = calc("1+1/1+1/(1*2)+1/(1*2*3)+1/(1*2*3*4)+1/(1*2*3*4)+1/(1*2*3*4*5)")
mes "E="+e
mes
cos1 = calc("1-1/(1*2)+1/(1*2*3*4)-1/(1*2*3*4*5*6)+1/(1*2*3*4*5*6*7*8)")
mes "COS(1)="+cos1
sin1 = calc("1-1/(1*2*3)+1/(1*2*3*4*5)-1/(1*2*3*4*5*6*7)+1/(1*2*3*4*5*6*7*8*9)")
mes "SIN(1)="+sin1
mes "COS^2(1)+SIN^2(1)="+calc(strf("%f^2+%f^2", cos1, sin1))
mes
mes "2^2^2^2="+calc("2^2^2^2")
mes
mes "(2^4=4^2)&(5^3<3^5)="+calc("(2^4=4^2)&(5^3<3^5)")
mes
mes "(1~(1&0))=((1~1)|(1~0))="+calc("(1~(1&0))=((1~1)|(1~0))")
| |
|
2015/8/17(Mon) 11:18:36|NO.70830
すみません。数式の文字列を計算するモジュールで渡した文字列によってはバッファーオーバーフローが起き、エラーになる不具合がありました。
if instr(stmp.0,0,"+")==-1 & instr(stmp.0,0,"-")==-1{
poke stmp.0,J,"+0"
J+=2
poke stmp.0,J,0
}
なかほどのこの部分の
poke stmp.0,J,"+0"
にてオーバーフローが発生する場合がありました。
初めのほうの
if btype==1{
ddim dtmp,5
sdim stmp,nagasa*8+1,4
}else{
sdim stmp,nagasa+1,4
}
をこのように修正してください。
if btype==1{
ddim dtmp,5
sdim stmp,nagasa*8+4,4
}else{
sdim stmp,nagasa+4,4
}
エラーが起きる例
keisan("1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890")
またなかほどの
poke stmp.2,N,0
memcpy stmp.2,stmp.0,N,,M
においてもオーバーフローが発生する場合がありました。
次のように修正してください。
poke stmp.2,N,0
if N+M>=nagasa+4: N=nagasa+3-M//追加
memcpy stmp.2,stmp.0,N,,M
エラーが起きる例
keisan("1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1")
修正版のダウンロードURLは前と同じ
https://aa38020e42f53ca54e166915354734af1f102cbd.googledrive.com/host/0B9vewWZYDiXefmNjRWZCb1FrUmpab3o2dk5nTXRkRFdGTXFqTWZjNExVTm41OHUwWFdRUG8/apps/calculat.txt
です。
|
|
2015/8/17(Mon) 11:37:24|NO.70831
すみません。また間違えてしまいました。
poke stmp.2,N,0
if N+M>=nagasa+4: N=nagasa+3-M//追加
memcpy stmp.2,stmp.0,N,,M
ではなく
if N+M>=nagasa+4: N=nagasa+3-M//追加
poke stmp.2,N,0
memcpy stmp.2,stmp.0,N,,M
に修正してください。同じような投稿を連続でしてすみません。
|
|
2015/8/17(Mon) 17:58:02|NO.70841
|
|
2015/8/17(Mon) 21:47:44|NO.70854
UTF-8関係便利そうですね。(文字コードってよく分からなくて私には難しいです。)
UTF-8で文字数カウントが必要になったときに利用したいです。
cnvstowはUTF-16を吐き出すらしいので特にUTF-8にこだわる必要がない場合の文字数カウントモジュール書いてみました。
参考資料: http://www.hspcenter.com/hsptvm/archives/2007/05/post_20.html
#module
#defcfunc strlenUni var a
repeat
if wpeek(a,cnt*2)=0 : len=cnt : break
loop
return len
#global
sdim a,64
cnvstow a, "abcあいうdef"
mes "LEN="+strlenUni(a)
でもこれサロゲートペア?とかなんとかがこれじゃ不正確な気がする。
WinAPIを使用した文字数カウント。
#include "kernel32.as"
sdim us
s = "aiueoあいうえお"
cnvstow us, s
mes "Shift-JIS : " + s
mes "Shift-JIS文字長さ : " + strlen(s)
mes "Unicode(表示不可): " + us
mes "Unicode->Shift-JIS : " + cnvwtos(us)
lstrlenW varptr(us)
mes "Unicode文字数 : " + stat
埋もれている標準添付のモジュールってのもありですよね。
おまけ。Shift-JISとutf-8の相互変換。
#include "encode.as"
sdim us
s = "aiueoあいうえお"
;SJIS -> utf-8
sjis2utf8n us, s
mes "Shift-JIS : " + utf8n2sjis(us) ; utf-8 -> SJIS
mes "utf-8 : " + us
マニュアル記載のない標準添付モジュールってどのくらいあるんでしょうね。
|
|
2015/8/17(Mon) 23:18:15|NO.70864
モジュールというかマクロですが、私が今現在書いてるスクリプトで使ってる中では一番汎用性高くて便利なものです。
;
; 外積・クロス積(二次元)
; res = CrossProduct(x1,y1, x2,y2)
;
#define global ctype CrossProduct(%1,%2,%3,%4) ((%1) * (%4) - (%2) * (%3))
;
; 内積・スカラー積
; res = ScalarProduct(x1,y1, x2,y2)
;
#define global ctype ScalarProduct(%1,%2,%3,%4) ((%1) * (%3) + (%2) * (%4))
|
|
2015/8/18(Tue) 05:42:31|NO.70874
GENKIさん、自分の書いたモジュールに反応してもらえてうれしいです。でも多分あなたが思うほど私は文字コードのことはよく知らないと思います。私が知っているのは文字コードは文字をどうコンピューター上で符号化して表すかの決まり事という程度です。
それよりGENKIさんのマクロのほうがすごいです。そこで私も今使っている自分用に作ったマクロを投稿します。
#define ctype GETMOUSEPOSX(%1) (%1-((ginfo_sizex-ginfo_winx)/2+ginfo_wx1))
#define ctype GETMOUSEPOSY(%1) (%1-ginfo_wy2+ginfo_winy+((ginfo_sizex-ginfo_winx)/2))
GETMOUSEPOSXはスクリーン上のx座標をウィンドウ上のx座標に変換するマクロです。
GETMOUSEPOSYはスクリーン上のy座標をウィンドウ上のy座標に変換するマクロです。
どこかで同じようなのをみたことがありますが使いたくなったときに見つからなかったので自分で書きました。
ボタンなどのオブジェクト上のマウスの座標を取得するときに役に立てば、とおもいます。
|
|
2015/8/18(Tue) 13:33:24|NO.70881
便利かどうかはわかりませんが、
#module
#define PS_CENTER 0 ;中央
#define PS_DEFAULT 1;通常と同じ
#define PS_ABSOLUTE 2;(0,画面yサイズ÷2)
#define PS_GRAPH 3;左下が原点
#deffunc xpos int type,int x,int y
if(type=0):pos (ginfo(12)/2)+x,(ginfo(13)/2)-y
if(type=1):pos x,y
if(type=2):pos x,(ginfo(13)/2)-y
if(type=3):pos x,ginfo(13)-y
pos x,y
return
#global
カレントポジションの設定方法変更機能付きposです。
使い方はわからないようなら聞いてください。
タイプ値は定数を使ってください。
定数で定義されてないタイプ値を指定したら、
通常通りの設定方法で設定します。
|
|
2015/8/18(Tue) 13:53:12|NO.70882
すみません、訂正です。
すべてのif文の後ろに、:returnをつけてください。
|
|
2015/8/18(Tue) 14:21:09|NO.70887
改行コードを変換するモジュール
複数の種類の改行コードが混在していても変換できるはず
CR+LF、CR、LFの改行コードに対応しています
今必要にせまられて作成したモジュールです
#module
//改行コードを変換する
//使い方
//kaigyohen p1 ,p2 ,p3 ,p4 ,p5 ,p6
//p1=変数名 : 変換先の変数
//p2=変数名 : 変換元の変数
//p3=0~2(0) : どの改行コードに変換するか変換 ( 0=CR+LF , 1=CR , 2=LF )
//p4=0~2(0) : 処理方法 ( 0=実際に処理 , 1=使われている改行コードの種類を求める(返し値 0=不明 , 1=CR+LF , 2=CR , 3=LF) , 2=実際の処理はせずに変換後の文字列の長さだけを計算(末尾の0は含まず)
//p5=0~(0) : 変換後の文字列が入るバッファーのサイズ (0の際は自動確保)
//p6=0~(0) : 変換する文字列の長さ (0の際は自動計算)
#define CR 13//先頭に戻る
#define LF 10//一行下に送る
#deffunc kaigyohenkan var henkanato , var henkanmae , int shurui , int dosuru , int nagasaato , int nagasamae , local j , local tmp , local motoshurui
if dosuru<0 | dosuru>2 : return 0
if shurui<0 | shurui>2 : return 0
if dosuru==1{
motoshurui=0 //motoshurui=0 不明 , motoshurui=1 CR+LF , motoshurui=2 CRだけ , motoshurui=3 LFだけ
repeat//元の改行コードの種類を求める
if nagasamae>0 : if cnt>=nagasamae : break
tmp=peek(henkanmae,cnt)
if tmp==0 : break
if tmp==CR{
if nagasamae>0 & cnt+1<nagasamae{
if peek(henkanmae,cnt+1)==LF : motoshurui=1 : break
motoshurui=2 : break
}
if nagasamae<=0 {
if peek(henkanmae,cnt+1)==LF : motoshurui=1 : break
motoshurui=2 : break
}
motoshurui=2 : break
}
if tmp==LF : motoshurui=3 : break
loop
return motoshurui
}
j=0
repeat
if nagasamae>0 : if cnt>=nagasamae : break
if nagasaato>0 & j>= nagasaato-1 : break
if nagasaato<=0 & dosuru!=2 : memexpand henkanato,j+2
tmp=peek(henkanmae,cnt)
if tmp==0 : break
if tmp==CR{
if (nagasamae>0 & cnt+1<nagasamae) | (nagasamae<=0) {
if peek(henkanmae,cnt+1)==LF{//CR+LFの組み合わせの時
if shurui==0{
if nagasaato<=0 & dosuru!=2 : memexpand henkanato,j+3
if nagasaato>0 & j>= nagasaato-2 : break
if dosuru!=2 : poke henkanato,j,CR : poke henkanato,j+1,LF
j+=2
}
if shurui==1{
if nagasaato>0 & j>= nagasaato-1 : break
if dosuru!=2 : poke henkanato,j,CR
j++
}
if shurui==2{
if nagasaato>0 & j>= nagasaato-1 : break
if dosuru!=2 : poke henkanato,j,LF
j++
}
continue cnt+2
}
}
}
if tmp==LF | tmp==CR{//CR単体 または LF単体の時
if shurui==0{
if nagasaato<=0 & dosuru!=2 : memexpand henkanato,j+3
if nagasaato>0 & j>= nagasaato-2 : break
if dosuru!=2 : poke henkanato,j,CR : poke henkanato,j+1,LF
j+=2
}
if shurui==1{
if nagasaato>0 & j>= nagasaato-1 : break
if dosuru!=2 : poke henkanato,j,CR
j++
}
if shurui==2{
if nagasaato>0 & j>= nagasaato-1 : break
if dosuru!=2 : poke henkanato,j,LF
j++
}
continue
}
if dosuru!=2 : poke henkanato,j,tmp
j++
loop
if dosuru!=2 : poke henkanato,j,0
return j
#global
moto="ちくわ1234567890a0123456789味噌1233211az- ここから前は入る\nmiso ここから後ろは入らない"
sdim buf
kaigyohenkan buf,moto,,1
if stat==0:mes "改行コードはわかりません"
if stat==1:mes "改行コードはCR+LF"
if stat==2:mes "改行コードはCRだけ"
if stat==3:mes "改行コードはLFだけ"
kaigyohenkan buf,moto,2,2,64,67
mes "67バイト分を改行コードをCR+LFからLFに変換した後の\n文字列の長さの計算(末尾の0は含みません) "+stat+"バイト"
mes "strlen(moto)="+strlen(moto)+"\n\n元の文字列\n"+moto+"\n\n67バイト分を改行コードをCR+LFからLFに変換"
kaigyohenkan buf,moto,2,,64,67
mes "返し値="+stat+" strlen(buf)="+strlen(buf)+"\n\nLFへの変換結果\n"+buf+"\n"
moto=buf
sdim buf
kaigyohenkan buf,moto,,1
if stat==0:mes "改行コードはわかりません"
if stat==1:mes "改行コードはCR+LF"
if stat==2:mes "改行コードはCRだけ"
if stat==3:mes "改行コードはLFだけ"
kaigyohenkan buf,moto,1,2,64
mes "最後までを改行コードをLFからCRに変換した後の\n文字列の長さの計算(末尾の0は含みません) "+stat+"バイト"
mes "最後までを改行コードをLFからCRに変換"
kaigyohenkan buf,moto,1,,64,//変換前の長さ(第6引き数)を省略すれば自動計算
mes "返し値="+stat+" strlen(buf)="+strlen(buf)+"\n\nCRへの変換結果\n"+buf+"\n"
button "次へ",*tsugi
stop
*tsugi
cls
moto=buf
sdim buf
kaigyohenkan buf,moto,,1
if stat==0:mes "改行コードはわかりません"
if stat==1:mes "改行コードはCR+LF"
if stat==2:mes "改行コードはCRだけ"
if stat==3:mes "改行コードはLFだけ"
kaigyohenkan buf,moto,,2
mes "改行コードをCRからCR+LFに変換した後の\n文字列の長さの計算(末尾の0は含みません) "+stat+"バイト"
mes "変換後の変数のメモリを自動確保させて改行コードをCRからCR+LFに変換"
kaigyohenkan buf,moto,,,,//変換後の結果が入る変数のサイズ(第5引き数)を省略すれば自動確保 ここで第5引き数に65以上の数を指定するとバッファーオーバーフロー
mes "返し値="+stat+" strlen(buf)="+strlen(buf)+"\n\nCR+LFへの変換結果\n"+buf
https://aa38020e42f53ca54e166915354734af1f102cbd.googledrive.com/host/0B9vewWZYDiXefmNjRWZCb1FrUmpab3o2dk5nTXRkRFdGTXFqTWZjNExVTm41OHUwWFdRUG8/apps/kaigyohn.txt
| |
|
2015/8/18(Tue) 14:30:22|NO.70888
kanamaruさん、便利そうなので使う機会があれば使わせてもらいます。
|
|
2015/8/18(Tue) 17:22:49|NO.70891
最早投稿する程でも無いかもしれないけどふと思い浮かんだので。
簡単な判定なら色分けや「if mx>50&my>50&mx>100&my>100:」と書かなくてもlimitを上手く使えば出来るんですね。
盲点だった・・・
boxf 50,50,100,100
repeat
mx=mousex:my=mousey
if limit(mx,50,100)=mx & limit(my,50,100)=my:title "範囲内":else:title "範囲外"
await 17
loop
|
|
2015/8/18(Tue) 20:23:09|NO.70898
単純に改行コードの置き換えだけに限定すれば、既存モジュールを使ってこんなマクロとかどうだろう。
#include "mod_regexp.as"
#define ctype UnifiedCRLF(%1="") replace( replace(%1,"\\r\\n|\\n","\r"), "\\r", "\n" )
; 改行コード
cr = "" : lf = "" : crlf = ""
;CR, \r
poke cr, 0, 13
;LF
poke lf, 0, 10
;CR+LF, \n
poke crlf, 0, 13
poke crlf, 1, 10
; 表示領域
objsize ginfo_winx, ginfo_winy
m = ""
mesbox m
id = stat
; 混在
l = "あいうえお\nCR" + cr + "LF" + lf + "CR+LF" + crlf
s = "混在\n"
s += l
; CR+LFに統一
s += "---\nCR+LFに統一\n"
s += replace( replace(l,"\\r\\n|\\n","\r"), "\\r", "\n" )
; CR+LFに統一(マクロ)
s += "---\nCR+LFに統一(マクロ)\n"
s += UnifiedCRLF( l )
objprm id, s
変換前に自前に文字数把握とかは出来ません。
> GETMOUSEPOSXはスクリーン上のx座標をウィンドウ上のx座標に変換するマクロです。
> GETMOUSEPOSYはスクリーン上のy座標をウィンドウ上のy座標に変換するマクロです。
p_scrwnd命令ていうのがあるみたいですがllmod3って個人的に使うのに抵抗があるのでマクロで実現できるのはありがたいです。
> カレントポジションの設定方法変更機能付きposです。
こういうの作る発想がなかった…便利そう。
|
|
2015/8/18(Tue) 21:07:16|NO.70899
カレントポジションの設定方法変更機能は便利そうですね。
中心を基準にしたい、となった場合posだとごちゃごちゃして可読性もメンテナンス性も悪い・・・
|
|
2015/8/18(Tue) 21:44:06|NO.70901
PREタグをつけ忘れていました。
/*
ADODO LICENSE
Whatever you use this for, you can free-
ly use it and hand it out to everybody.
If you make something from this or of or
with it, it's yours.
This is complitely copyright-free and
free.
This License is the first ver. of adodo
license. This License is licensed with a-
dodo license.
*/
/*HSP3.3で作った*/
/*一つ目の引数に使うDLLの名前*/
/*二つ目の引数に使う関数の名前*/
/*三つ目の引数に使う関数の引き数をいれた配列*/
/*四つ目の引数に使う関数の引き数の数*/
/*いれたら使おうってする関数します*/
#module
#uselib "kernel32.dll"
#func LoadLibrary "LoadLibraryA" str
#func GetProcAddress "GetProcAddress" int,str
#func FreeLibrary "FreeLibrary" int
#deffunc dllfunc str dlln,str funcn,array hiki,int hikik
/*dllnは使うDLLの名前*/
/*funcnは使う関数の名前*/
/*hikiは使う関数の引き数をいれた配列*/
/*hikikは使う関数の引数の数*/
kekka=0/*結果*/
dla=0/*関数のアドレスをとる変数*/
dll=0/*確保したDLLの場所をいれとく変数*/
LoadLibrary dlln/*DLLを確保する*/
dll=stat
if dll=0:return "ERROR"/*DLLを確保出来なかったらrefstrにERRORを入れる*/
GetProcAddress dll,funcn/*関数のアドレスをとる*/
dla=stat
if dla=0{
FreeLibrary dll/*関数のアドレスとれなかったらDLL解放する*/
return "ERROR"/*関数のアドレスとれなかったらrefstrにERRORをいれる*/
}
kekka=callfunc(hiki,dla,hikik)/*関数使う*/
FreeLibrary dll/*DLL解放する*/
return kekka
#global
/*例えば
hiki.0=hwnd
hiki.1=0
hiki.2=0
hiki.3=300
hiki.4=300
hiki.5=1
dllfunc "user32.dll","MoveWindow",hiki,6
if stat=1:mes "成功"
*/
ところでPREタグのPREはPreformatted Textの略らしいですがこの略し方は自分にはいまいちふに落ちません。
| |
|
2015/8/18(Tue) 21:57:55|NO.70902
設定方法変更機能付きposはお試しで作って見たものなのですが、
意外と評価が良くて驚きました。
|
|
2015/8/19(Wed) 08:36:58|NO.70903
今度は極座標で座標指定ができるのを作ってみました。
といってもhspの座標指定の性質上本当の極座標ではないことに注意してください。
本当の極座標はx軸から正の方向に角度を測りますが、
このモジュールでは負の方向に角度を測ります。
これは通常のxy座標がyは上向きが正なのに対し、
hspの座標系でyが下向きが正なのを踏まえてのことです。
#module
#deffunc cpos double r,double sita
pos r*cos(sita),-1*r*sin(sita)
#global
ただ、おそらくこれだと不便だと思います。
角度の範囲が限られますし。
そこで、前に投稿したモジュールと合体させました。
#module
#define PS_CENTER 0 ;中央
#define PS_DEFAULT 1;通常と同じ
#define PS_ABSOLUTE 2;(0,画面yサイズ÷2)
#define PS_GRAPH 3;左下が原点
#deffunc xpos int type,int r,int sita
x=r*cos(sita):y=-1*r*sin()
if(type=0):pos (ginfo(12)/2)+x,(ginfo(13)/2)-y
if(type=1):pos x,y
if(type=2):pos x,(ginfo(13)/2)-y
if(type=3):pos x,ginfo(13)-y
pos x,y
return
#global
これの用途としては、
例えば、シューティングゲームで、銃の照準を示すときの
座標指定に使えます。
|
|
2015/8/19(Wed) 08:39:00|NO.70904
すみません。
訂正です。
一つ前の投稿で、
二つ目のモジュールの命令の名前をcxposに変更してください。
xposを使っている人だと名前がかぶってしまうので。
|
|
2015/8/19(Wed) 12:32:55|NO.70910
何度も訂正すいません。
cxposの第2,3引数の型をdoubleにして、
yの-1*を取ってください。
|
|
2015/8/19(Wed) 17:37:50|NO.70924
モジュールでもなくマクロでもないほとんど需要はないであろうことですが、
前右クリック関係で結構苦労したことがあるのでそのスクリプトを投稿します。
説明しにくいのですが実行してみればわかると思います。
#uselib "user32.dll"
#cfunc WindowFromPoint "WindowFromPoint" int,int
#cfunc GetForegroundWindow "GetForegroundWindow"
#cfunc GetFocus "GetFocus"
#func AppendMenu "AppendMenuA" int,int,int,sptr//メニューの項目の追加 互換性維持のために残されている関数だがInsertMenuItem関数は構造体を使うからこっちのほうが簡単
#func TrackPopupMenu "TrackPopupMenu" int,int,int,int,int,int,int
#func DestroyMenu "DestroyMenu" int
#cfunc CreatePopupMenu "CreatePopupMenu"
#define APPSKEYCOAD 93 //右コントロールキーの左にあるキー(アプリケーションキー)のキーコード
//右メニュー設定関係(AppendMenu)
#define MF_POPUP $00000010//サブメニューを出すボタン(第3パラメーターにサブメニューのハンドルを指定すること)
#define MF_SEPARATOR $00000800//横線(区切り線)
#define MFS_CHECKED $00000008//チェックを入れる
#define MF_STRING $00000000//文字列
#define MF_DISABLED $00000002//無効表示(色が薄くなる)
#define MF_MENUBARBREAK $00000020//サブメニュー
//右メニュー表示関係(TrackPopupMenu)
#define TPM_NONOTIFY $00000080//WM_COMMANDは使わない
#define TPM_RETURNCMD $00000100//戻り値で選択番号を返す
#define TPM_RIGHTBUTTON $00000002//右クリックでも左クリックでも選択できる
dim i
dim hmesbox
buf="こっちはアプリケーションメニュー(右クリックメニュー)が違う"
buf2="こっちは普通"
buf3="A"
hclickmenu2=CreatePopupMenu()//サブメニューは先に作成
repeat 10,11
AppendMenu hclickmenu2,MF_STRING,cnt,"ダイアログ"+cnt+"(&"+buf3+")"
poke buf3,0,peek(buf3,0)+1
loop
hclickmenu=CreatePopupMenu()//メニューの作成
repeat 10,1
AppendMenu hclickmenu,MF_STRING,cnt,"ダイアログ"+cnt+"(&"+buf3+")"
poke buf3,0,peek(buf3,0)+1
loop
AppendMenu hclickmenu,MF_POPUP,hclickmenu2,"サブメニュー"
cls
mesbox buf,ginfo_winx/3,ginfo_winy/3,,0
pos ginfo_winx/3
mesbox buf2,ginfo_winx/3,ginfo_winy/3,,0
hmesbox=objinfo_hwnd(0)
onkey gosub *oshita
onexit *owari
//while
while
wait 1
getkey i,2
if i==1{
if WindowFromPoint(ginfo(0),ginfo(1))==hmesbox {
while I
//ウェイトを入れるとうまくシステム標準の右クリックメニューが出る前に割り込めない
getkey I,2
wend
gosub *rightclick
}
}
wend
*oshita
if wparam==APPSKEYCOAD & GetForegroundWindow()==hwnd & GetFocus()==hmesbox{
gosub *rightclick
}
return
*rightclick
TrackPopupMenu hclickmenu, TPM_NONOTIFY | TPM_RETURNCMD | TPM_RIGHTBUTTON , ginfo_mx, ginfo_my, 0, hwnd, 0
if stat>0{
dialog "メニュー番号: "+stat
}
return
*owari
DestroyMenu hclickmenu//ちゃんとメニューは破棄する
DestroyMenu hclickmenu2
end
ところで入力欄のHOMEのところにhttps://から始まるURLを入れても処理がうまくされない?のはどうしてでしょうか。
| |
|
2015/8/19(Wed) 21:25:39|NO.70932
メニュー関係は mod_menu.as が標準で入ってますが、命令少ないですよね。
メニューバーとか使ったものはつい作るのをためらっちゃうんですよね。
|
|
2015/8/19(Wed) 22:34:45|NO.70934
ハードディスクあさってたら昔作ったのが出てきたので上げてみます。
どうも2個めの命令はまともに動いてないっぽい。
;2010/06/24
;
; ウィンドウスタイル拡張モジュール
;
;ウィンドウスタイルを変更します。
;操作対象ウィンドウはgsel命令で指定してください。
;
#include "user32.as"
;###############################################################################
#module
#define GWL_STYLE (-16)
#define WS_MAXIMIZEBOX 0x00010000 ;最大化ボタンを持つウィンドウを作成
#define WS_THICKFRAME 0x00040000
#define WS_SIZEBOX WS_THICKFRAME ;サイズ変更境界を持つウィンドウを作成
;-------------------------------------------------
;
; ウィンドウのスタイルを変更
;
;現在選択されているウィンドウのスタイルを変更します。
;
;GuiExScreenStyle int p_mode
;p_mode : スタイル
; 0:何も追加しない。
; 1:最大化ボタンを持つ
; 2:サイズ変更境界を持つ
;
;現在選択されているウィンドウのスタイルを変更します。
;3を指定すると、最大化ボタンとサイズ変更境界を持つウィンドウになります。
;
#deffunc GuiExScreenStyle int p_mode
;ウィンドウのスタイル
style = 0
if p_mode & 1 : style |= WS_MAXIMIZEBOX ;最大化ボタンを持つ
if p_mode & 2 : style |= WS_SIZEBOX ;サイズ変更境界を持つ
GetWindowLong hwnd, GWL_STYLE
SetWindowLong hwnd, GWL_STYLE, stat | style
return
;-------------------------------------------------
;
; ウィンドウのスタイルを変更(除外)
;
;現在選択されているウィンドウのスタイルを変更します。
;
;GuiExScreenStyleCut int p_mode
;p_mode : スタイル
; 0:何も追加しない。
; 1:最小化/最大化ボタンなし
; 2:システムメニューなし
; 4:ウィンドウ境界線なし
; 8:タイトルバーなし
;
;現在選択されているウィンドウのスタイルを変更します。
;3を指定すると、最小化/最大化ボタンなし、システムメニューなしのウィンドウになります。
;
#deffunc GuiExScreenStyleCut int p_mode
;ウィンドウのスタイル
style = 0
if p_mode & 1 : style |= $20000 ;最小化/最大化ボタンなしウィンドウ
if p_mode & 2 : style |= $80000 ;システムメニューなしウィンドウ
if p_mode & 4 : style |= $400000 ;ウィンドウ境界線なしウィンドウ
if p_mode & 8 : style |= $800000 ;タイトルバーなしウィンドウ
GetWindowLong hwnd, GWL_STYLE
SetWindowLong hwnd, GWL_STYLE, (stat | style) - style
return
#global
;###############################################################################
;
; 実行サンプル
;
; あらかじめ最大サイズでウィンドウ作成
;p7, p8に実際に最初に表示するサイズを指定
screen 0, ginfo(20), ginfo(21), , ,, 100,100
GuiExScreenStyle 3 ;最大化+サイズ境界あり
title "最大化+サイズ境界あり"
;sendmsg hwnd, $112, $F030 ;ウィンドウの最大化
; ちゃんと動かないっぽい
screen 1
GuiExScreenStyleCut 2 ;システムメニューなし
title "システムメニューなし"
> mod_regexp.asというモジュールが標準であるとは知りませんでした。ただわたしには難しそうです。
正規表現っていうやつで、エスケープシーケンスをもっと高機能にしたようなものです。
秀丸とかサクラエディタ、EmEditorなど多機能なテキストエディタでよく見かける機能です。
少しだけ、ほんの一部を修得するだけでもテキストエディタを使った作業の効率が跳ね上がります。
| |
|
2015/8/19(Wed) 23:49:04|NO.70936
> 正規表現っていうやつで
正規表現を調べてみましたがおもしろそうですね。
> どうも2個めの命令はまともに動いてないっぽい。
全くの素人の意見ですが見る限りおかしいところはなさそうですし、動作も問題なさそうです。
もしできればでいいのでどういう記述でおかしい動作をするのか投稿してくれませんか。
忘れていなければですが素人なりにですが動作を検証します。
|
|
2015/8/20(Thu) 00:09:00|NO.70937
すみません。確かにGuiExScreenStyleCut 8の動作が少しおかしい気がします。
とりあえず直そうとおもいます。できるかはわかりませんが。
|
|
2015/8/20(Thu) 01:32:07|NO.70938
定義に
#define WS_MINIMIZEBOX 0x00020000
#define WS_BORDER 0x00800000
#define WM_SIZE $00000005//大きさ変更中
#define WS_CAPTION $00C00000//タイトルバーがある
#define WS_SYSMENU $00080000//システムメニュー
#define WS_DLGFRAME $00400000
を追加してGuiExScreenStyleCutの部分を
#deffunc GuiExScreenStyleCut int p_mode
;ウィンドウのスタイル
GetWindowLong hwnd, GWL_STYLE
style=0
style2=0
if p_mode & 1{//最小化/最大化ボタンなしウィンドウ
if stat & WS_MAXIMIZEBOX : style |= WS_MAXIMIZEBOX
if stat & WS_MINIMIZEBOX : style |= WS_MINIMIZEBOX
}
if p_mode & 2{//システムメニューなしウィンドウ
if stat & WS_SYSMENU : style |= WS_SYSMENU
}
if p_mode & 4{//ウィンドウ境界線なしウィンドウ
if stat & WS_BORDER : style |= WS_BORDER
//もしもWS_BORDERではなくWS_THICKFRAMEを意図していた場合「if stat & WS_BORDER : style |= WS_BORDER」ではなくこちらにしてください
//if stat & WS_THICKFRAME : style |= WS_THICKFRAME//枠線が細くなる分ウィンドウのクライアント領域が大きくなるので初期化サイズをあらかじめやや大きく(やや余裕をみて縦横ともに+15くらい?)しておかないと表示が変になる(クライアント領域が初期化サイズより大きくなるため)
}
if p_mode & 8{//タイトルバーのないウィンドウ bgscr的な
if stat & WS_CAPTION : style |= WS_CAPTION//一応外す
if stat & WS_BORDER : style |= WS_BORDER//ウィンドウサイズを可変にしていた場合上のほうを伸ばすとタイトルバー部分は初期化がされていないため表示が変になるので(この場合でも多少大きめに)
if (stat & WS_DLGFRAME)==0 : style2 |=WS_DLGFRAME
if stat & WS_THICKFRAME : style |= WS_THICKFRAME//枠線が細くなる分ウィンドウのクライアント領域が大きくなるので初期化サイズをあらかじめやや大きく(やや余裕をみて縦横ともに+15くらい?)しておかないと表示が変になる(クライアント領域が初期化サイズより大きくなるため)
}
SetWindowLong hwnd, GWL_STYLE, (stat-style) | style2
return
に置換えてください。
システムメニューをなくせば最小化ボタンも最大化ボタンも閉じるボタンもなくなるので、引数に3を渡した場合はスタイルを取り除きたい場合以外には見た目だけでいえば4を渡した場合と変わりありません。
| |
|
2015/8/20(Thu) 01:37:09|NO.70939
なにかGENKIさんの意図していたものからは遠くかけ離れたものができた気がします。
|
|
2015/8/20(Thu) 17:28:12|NO.70951
勉強してるときにちょっとしたことを思いついたので投稿します。
具体的には最大化ボタンつきウィンドウを作るときにウィンドウの初期化でメモリを使うのでその分を節約する方法です。
ツール系のソフトを作る際に少しでもメモリを節約したい場合には役に立つかもしれません。
モジュールではありません。
#uselib "user32.dll"
#cfunc GetWindowLong "GetWindowLongA" int,int
#func SetWindowLong "SetWindowLongA" int,int,int
#func MoveWindow "MoveWindow" int,int,int,int,int,int//ウィンドウ更新用
#func SystemParametersInfo "SystemParametersInfoA" int,int,var,int
#define SPI_GETWORKAREA $00000030//デスクトップのタスクバー以外の部分の大きさ
#define WS_MAXIMIZEBOX $00010000//最大化ボタン
#define WM_GETMINMAXINFO $00000024//ウィンドウのサイズ変更をする際のサイズの限界を設定
#define WM_SIZE $00000005//大きさ変更中
#define INTSIZE 4
screen 1,1,1,screen_palette+screen_hide
SetWindowLong hwnd, -16, GetWindowLong(hwnd, -16) | WS_MAXIMIZEBOX
dim workareasize,4//左上のX座標,左上のY座標,右下のX座標,右下のY座標(タスクバーは除きます)
a={"1*1しか初期化してないけどウィンドウのサイズを自由に変えられます。
右側はあけてあるので最小化してもとに戻すなどをすれば初期化をしていないのが分かると思います。
画面全体にすきまなくオブジェクトを配置すれば初期化していないことは目立ちません。
ここまでする意味は殆どないと思いますが。"}
mesbox a//gsel 1,1の時にWM_SIZEでサイズ調整されるからサイズは省略
hmesbox=objinfo_hwnd(0)
oncmd gosub *resize,WM_SIZE
oncmd gosub *sizelimit,WM_GETMINMAXINFO
//どちらのoncmdもMoveWindowの前に設定することが重要
MoveWindow hwnd,0,0,640,480,1 //widthだとHSPの初期化サイズより大きくできないから使えない
gsel 1,1
stop
*sizelimit
pos 250,24
memset workareasize,0,4*INTSIZE
SystemParametersInfo SPI_GETWORKAREA,0,workareasize,0//ここでデスクトップのタスクバー以外の部分を取得
dupptr limitsize,lparam,10*INTSIZE
limitsize.2 = workareasize.2 - workareasize.0
limitsize.3 = workareasize.3 - workareasize.1
limitsize.4 = workareasize.0
limitsize.5 = workareasize.1
return 0
*resize
MoveWindow hmesbox,0,0,ginfo_winx/2,ginfo_winy,1
return
モニタの解像度が2560*1440の環境下においてのメモリ使用量(10回試行したその平均)
上記のスクリプト 2.5MB
下記のスクリプト(パレットモード) 5.8MB
〃(フルカラーモード) 12.7MB
以下メモリ比較用のスクリプト
#uselib "user32.dll"
#cfunc GetWindowLong "GetWindowLongA" int,int
#func SetWindowLong "SetWindowLongA" int,int,int
#func MoveWindow "MoveWindow" int,int,int,int,int,int//ウィンドウ更新用
#func SystemParametersInfo "SystemParametersInfoA" int,int,var,int
#define SPI_GETWORKAREA $00000030//デスクトップのタスクバー以外の部分の大きさ
#define WS_MAXIMIZEBOX $00010000//最大化ボタン
#define WM_SIZE $00000005//大きさ変更中
#define INTSIZE 4
dim workareasize,4//左上のX座標,左上のY座標,右下のX座標,右下のY座標(タスクバーは除きます)
SystemParametersInfo SPI_GETWORKAREA,0,workareasize,0//ここでデスクトップのタスクバー以外の部分を取得
screen 1,workareasize.2 - workareasize.0,workareasize.3 - workareasize.1,screen_hide//+screen_palette//ここでパレットモードをつけ外ししてください
SetWindowLong hwnd, -16, GetWindowLong(hwnd, -16) | WS_MAXIMIZEBOX
a="素直に初期化してサイズ変更できるようにした場合"
mesbox a//gsel 1,1の時にWM_SIZEでサイズ調整されるからサイズは省略
hmesbox=objinfo_hwnd(0)
oncmd gosub *resize,WM_SIZE
MoveWindow hwnd,0,0,640,480,1
gsel 1,1
stop
*resize
MoveWindow hmesbox,0,0,ginfo_winx/2,ginfo_winy,1
return
| |
|
2015/8/20(Thu) 22:08:24|NO.70960
>>NO.70934
ウィンドウスタイル拡張モジュールのGuiExScreenStyleCut命令ですが4,8が反映されなかったのですがサンプルの修正での解決方法が見つかりました。
サイズ変更境界を持つウィンドウだと適切に反映されないみたいです。
;
; 実行サンプル
;
; あらかじめ最大サイズでウィンドウ作成
;p7, p8に実際に最初に表示するサイズを指定
screen 0, ginfo(20), ginfo(21), , ,, 100,100
GuiExScreenStyle 3 ;最大化+サイズ境界あり
title "最大化+サイズ境界あり"
;sendmsg hwnd, $112, $F030 ;ウィンドウの最大化
; 1,2は可変ウィンドウでも大丈夫
screen 1
GuiExScreenStyleCut 2
title "システムメニューなし"
; 4,8はサイズ固定ウィンドウじゃないとちゃんと動かない
screen 2,,, screen_fixedsize
GuiExScreenStyleCut 8
mes "タイトルバーなし"
; 4+8
screen 3,,, screen_fixedsize
GuiExScreenStyleCut 4|8
mes "ウィンドウ境界線なし + タイトルバーなし"
;4のみだとタイトルバーの位置に残像が表示されることがある。
Noaさん修正ありがとうございます。
ウィンドウのスタイルの組み合わせってよくわからない時がある。そのうちきっちり調べてみたいな。
|
|
2015/8/21(Fri) 00:27:08|NO.70962
> Noaさん修正ありがとうございます。
私は役に立てたのでしょうか。どちらにしても解決できてよかったです。
メモリを節約する?スクリプトについて訂正
*sizelimit
pos 250,24
のpos 250,24は余計ですのでなくてもいいです。
またそもそももともと画面いっぱいに最大化できるようになっているのをHSPのシステムが親切で初期化したサイズより大きくできないようにしているのを、
WM_GETMINMAXINFOメッセージに割り込んで邪魔をして画面いっぱいに最大化できるようにしているので画面いっぱいでいいのであれば(最大化した際画面を覆い隠す)設定を変えなくていいので割り込み先では何もしなくていいです。
つまりこういうことになります。
#uselib "user32.dll"
#cfunc GetWindowLong "GetWindowLongA" int,int
#func SetWindowLong "SetWindowLongA" int,int,int
#func MoveWindow "MoveWindow" int,int,int,int,int,int//ウィンドウ更新用
#define WS_MAXIMIZEBOX $00010000//最大化ボタン
#define WM_GETMINMAXINFO $00000024//ウィンドウのサイズ変更をする際のサイズの限界を設定
#define WM_SIZE $00000005//大きさ変更中
#define INTSIZE 4
screen 1,1,1,screen_palette+screen_hide
SetWindowLong hwnd, -16, GetWindowLong(hwnd, -16) | WS_MAXIMIZEBOX
a={"1*1しか初期化してないけどウィンドウのサイズを自由に変えられます。
右側はあけてあるので最小化してもとに戻すなどをすれば初期化をしていないのが分かると思います。
画面全体にすきまなくオブジェクトを配置すれば初期化していないことは目立ちません。
ここまでする意味は殆どないと思いますが。"}
mesbox a//gsel 1,1の時にWM_SIZEでサイズ調整されるからサイズは省略
hmesbox=objinfo_hwnd(0)
oncmd gosub *resize,WM_SIZE
oncmd gosub *sizelimit,WM_GETMINMAXINFO
//どちらのoncmdもMoveWindowの前に設定することが重要
MoveWindow hwnd,0,0,640,480,1 //widthだとHSPの初期化サイズより大きくできないから使えない
gsel 1,1
stop
*sizelimit
return 0
*resize
MoveWindow hmesbox,0,0,ginfo_winx/2,ginfo_winy,1
return
| |
|
2015/8/21(Fri) 15:08:23|NO.70973
HSP愛好家の一人として参加せざるをえない。
配列初期化のモジュールです。
配列内を0以外の任意の値で初期化したいときに使えると思います。
levの値を指定することで、どの次元まで初期化するか指定できます。
#module
#deffunc arrayreset array arr,int s,int lev,local a,local b,local c,local __cnt,local _cnt
a=length(arr)
b=length2(arr)
c=length3(arr)
d=length4(arr)
tlev=lev:if tlev=0{tlev=4}
if tlev>=1{
repeat a
___cnt=cnt
arr.___cnt=s
if tlev>=2{
repeat b
__cnt=cnt
arr.___cnt.__cnt=s
if tlev>=3{
repeat c
_cnt=cnt
arr.___cnt.__cnt._cnt=s
if tlev>=4{
repeat d
arr.___cnt.__cnt._cnt.cnt=s
loop
}
loop
}
loop
}
loop
}
return
#global
;サンプル
dim hairetu,2,2,2,2
arrayreset hairetu,-1
repeat length4(hairetu):c3=cnt
repeat length3(hairetu):c2=cnt
repeat length2(hairetu):c1=cnt
repeat length(hairetu)
mes"hairetu("+cnt+","+c1+","+c2+","+c3+")="+hairetu.cnt.c1.c2.c3
loop
loop
loop
loop
pos 200,0
arrayreset hairetu,3,3
repeat length4(hairetu):c3=cnt
repeat length3(hairetu):c2=cnt
repeat length2(hairetu):c1=cnt
repeat length(hairetu)
mes"hairetu("+cnt+","+c1+","+c2+","+c3+")="+hairetu.cnt.c1.c2.c3
loop
loop
loop
loop
それとGENKIさん、m_stringは自分もゲームなどを作るとき大変お世話になっています。
この場を借りてお礼申し上げます。
※若干修正しました。
| |
|
2015/8/22(Sat) 18:01:57|NO.70988
>> 雪月夜さん NO.70973
ご利用ありがとうございます。ちゃんと需要あったんですね。これかれも色々頑張れそうです。
モジュールですが、数が多いとループ回数が多くなるから、こうした方がいいかも。
ループ回数が掛け算で増えるのと足し算で増えるのでは、数が多くなったときに差がでてきます。
いやもっと効率化出来る!とか言われちゃいそうな気もしますが…。
#module
#deffunc arrayreset array arr,int s,int lev,local a,local b,local c
if lev = 0 : tlev = 4 : else : tlev = lev
if tlev >= 1{
a = length(arr)
b = length2(arr)
c = length3(arr)
d = length4(arr)
if tlev=1 : b=0 : c=0 : d=0
if tlev=2 : c=0 : d=0
if tlev=3 : d=0
arr = s
repeat a
memcpy arr, arr, 4, cnt*4
loop
repeat b
memcpy arr, arr, a*4, cnt*a*4
loop
repeat c
memcpy arr, arr, a*b*4, cnt*a*b*4
loop
repeat d
memcpy arr, arr, a*b*c*4, cnt*a*b*c*4
loop
}
return
#global
dim hairetu,4,3,2
arrayreset hairetu,-1
repeat length3(hairetu):c2=cnt
repeat length2(hairetu):c1=cnt
repeat length(hairetu)
mes"hairetu("+cnt+","+c1+","+c2+")="+hairetu.cnt.c1.c2
loop
loop
loop
pos 200,0
arrayreset hairetu,3,2
repeat length3(hairetu):c2=cnt
repeat length2(hairetu):c1=cnt
repeat length(hairetu)
mes"hairetu("+cnt+","+c1+","+c2+")="+hairetu.cnt.c1.c2
loop
loop
loop
しかしmemsetって1バイトでしか初期化出来なかったんですね。これじゃ0と255以外での使い道が難しそう。
| |
|
2015/8/25(Tue) 11:31:16|NO.71056
|
|
2015/8/28(Fri) 17:15:35|NO.71096
モジュールではないですが、マウスの動きを予測するプログラム。
ただし、何度か同じ動きをしないと予測できないです。
さて・・・何に使うんだろ。
#include "hspmath.as"
範囲=20
誤差=25
記録間隔=2
pointA=mousex,mousey
Screen 0,1280,1000
repeat
mx=ginfo_mx:my=ginfo_my
pointB=mx,my
一時距離2=distance2(pointA,pointB)
if 一時距離2>=記録間隔:{
ct+1
軌跡mx.ct=mx:軌跡my.ct=my
pointA=mx,my
}
redraw 0
Color 255,255,255:boxf
if ct>(範囲*2):{
Color 0,0,0
//repeat 20
//pos 軌跡mx.(ct-cnt),軌跡my.(ct-cnt):mes "●"
//loop
cc=0
ddim 距離,ct+1,範囲
ddim 蓄積誤差,ct+1
repeat ct-(範囲*2),範囲//過去の座標を元に最も近い軌道を調べる。
ct2=cnt
repeat 範囲
if cnt=0:{
補正x=軌跡mx.ct2-軌跡mx.ct
補正y=軌跡my.ct2-軌跡my.ct
}
pointA=軌跡mx.(ct2-cnt),軌跡my.(ct2-cnt)
pointB=軌跡mx.(ct-cnt)+補正x,軌跡my.(ct-cnt)+補正y
一時距離=distance2(pointA,pointB)
距離.(ct2-範囲).cnt=一時距離
蓄積誤差.(ct2-範囲)+一時距離
//Dialog ""+ct+","+ct2+"\n"+一時距離+""
loop
loop
最低誤差=1000000
Color 0,0,0
repeat ct-(範囲*2)
if 最低誤差>=蓄積誤差.cnt:最低誤差=蓄積誤差.cnt:誤差ct=cnt//最終的に、最も誤差が少なかった位置
pos 0,cnt*25:mes 蓄積誤差.cnt
loop
誤差ct+範囲
補正2x=mx-軌跡mx.誤差ct
補正2y=my-軌跡my.誤差ct
if 誤差ct>=範囲:誤差ct-範囲
Color 255,0,0
if 誤差ct>範囲{
repeat 範囲*2
posx=(軌跡mx.(誤差ct+cnt))+補正2x-6
posy=(軌跡my.(誤差ct+cnt))+補正2y-6
if cnt=0:posx2=posx:posy2=posy
line posx,posy,posx2,posy2//pos :mes "●"
posx2=posx:posy2=posy
loop
}
title ""+一時距離2+","+記録間隔+","+ct+""
//repeat 範囲*2
//Color 0,255,0:pos (軌跡mx.(誤差ct+cnt))-6,(軌跡my.(誤差ct+cnt))-6:mes "●"
//loop
Color 0,0,255
pos 軌跡mx.ct,軌跡my.ct:mes "■"
}
redraw 1
await 1
loop
| |
|
2015/8/30(Sun) 02:32:05|NO.71119
dirlist2のようなものです。
dirlistにてサブディレクトリも取得できればいいなと思いかいてみました。
かいた後にdirlist2の存在に気がつきました。
動作速度は遅いです。
#module
//サブディレクトリも取得できるdirlistのようなもの
//dirlistkai p1,p2,p3
//p1=変数名 : リストを格納する文字列型変数
//p2=文字列 : dirlistのファイルマスクと同じ
//p3=0~7(0) : dirlistのディレクトリ取得モードと同じ
//実行後statにフォルダの中に存在する数を返します(dirlistと同じ)(取得中にエラーが発生したら多分-1が返ります)
//dirlistでサブディレクトリも取得できたらいいなと思い作りました
//後でdirlist2の存在の存在に気がつきましたがこちらのほうがDLLを使わず機能は単純で使いやすいと思います
//dirlstでのメモリ確保は完全にHSPのシステム側に任せてあります
//遅いです
#define MAX_PATH 260
#define CR 13
#define LF 10
#define INVALID_HANDLE_VALUE $FFFFFFFF
//ファイル属性
#define FILE_ATTRIBUTE_READONLY $00000001//読み込みのみ
#define FILE_ATTRIBUTE_HIDDEN $00000002//隠しファイル
#define FILE_ATTRIBUTE_SYSTEM $00000004//システムファイル
#define FILE_ATTRIBUTE_DIRECTORY $00000010//フォルダ
#define FILE_ATTRIBUTE_ARCHIVE $00000020//アーカイブ
#define FILE_ATTRIBUTE_ENCRYPTED $00000040//暗号化されている
#define FILE_ATTRIBUTE_NORMAL $00000080//属性なし
#define FILE_ATTRIBUTE_TEMPORARY $00000100//一時ファイル
//WIN32_FIND_DATA構造体
#define dwFileAttributes 0
#define ftCreateTime 4
#define ftLastAccessTime 12
#define ftLastWriteTime 20
#define nFileSizeHigh 28
#define nFileSizeLow 32
#define dwReserved0 36
#define dwReserved1 40
#define cFileName 44//ファイル名(NULLつき)
#define cAlternateFileName 304//8.3形式(すごく昔のファイル名の形式: ファイル名本体が8文字 拡張子が3文字だけ)のファイル名(NULLつき)
#define WIN32_FIND_DATASIZE 320
#uselib "kernel32.dll"
#func FindFirstFile "FindFirstFileA" var, var//ファイル情報の取得に使う
#func FindClose "FindClose" int
#deffunc dirlistkai var p1, str p2, int p3, local i, local j, local k, local forudagoukei, local folders, local buf, local foldernum, local folderp, local atonagasa, local dircurbak, local relatpath, local dircurnum, local relatpathnum , local filegoukei, local winfind , local bbuf, local ifflag, local filegetflag
dim i:dim j:dim k
dim forudagoukei//フォルダの合計
sdim folders,,MAX_PATH//各フォルダの一覧
sdim buf,MAX_PATH
sdim bbuf,MAX_PATH
dim foldernum,MAX_PATH//各フォルダの一覧の長さ
dim folderp,MAX_PATH//今何番目のフォルダか
dim atonagasa
sdim dircurbak,MAX_PATH
sdim relatpath,MAX_PATH
dim dircurnum
dim relatpathnum
dim filegoukei//フォルダ以外のファイルの合計
sdim winfind,WIN32_FIND_DATASIZE//WIN32_FIND_DATA構造体
dim ifflag//if文で分けるときに使う
dim filegetflag,MAX_PATH//ファイルを二重にカウントするのを防止
dircurbak=dir_cur
dircurnum=strlen(dircurbak)
relatpath=dir_cur
repeat
if j!=1{
relatpath=dir_cur
relatpathnum=strlen(relatpath)
memcpy buf,relatpath,relatpathnum-dircurnum-1,,dircurnum+1
relatpathnum-=(dircurnum+1)
if relatpathnum<=0:relatpathnum=0
memcpy relatpath,buf,relatpathnum
poke relatpath,relatpathnum,0
dirlist folders.i,p2,5
foldernum.i=strlen(folders.i)
if p3==5 | p3==0 | p3==2 | p3==6 | p3==7{//フォルダの一覧取得
j=0
k=0
repeat// foldernum.i
if peek(folders.i,j)==0:break
if peek(folders.i,j)==CR{
poke bbuf,j-k,0
memcpy bbuf,folders.i,j-k,,k
memset winfind,0,WIN32_FIND_DATASIZE
FindFirstFile bbuf,winfind
if stat!=INVALID_HANDLE_VALUE{
FindClose stat
ifflag=0
if p3==2{
if lpeek(winfind,dwFileAttributes) & FILE_ATTRIBUTE_HIDDEN{
}else{
if lpeek(winfind,dwFileAttributes) & FILE_ATTRIBUTE_SYSTEM{
}else{
ifflag=1
}
}
}
if p3==6{
if lpeek(winfind,dwFileAttributes) & FILE_ATTRIBUTE_HIDDEN : ifflag=1
if lpeek(winfind,dwFileAttributes) & FILE_ATTRIBUTE_SYSTEM : ifflag=1
}
if (p3==5 | p3==0 | p3==7) : ifflag=1
if ifflag{
if peek(p1,0)!=0{
atonagasa+=2
memexpand p1,atonagasa+1
poke p1,atonagasa-2,"\n"
}
if i>0{
memexpand p1,atonagasa+(j-k)+relatpathnum+1+1
memcpy p1,folders.i,j-k,atonagasa+relatpathnum+1,k
poke p1,atonagasa+relatpathnum,'\\'
memcpy p1,relatpath,relatpathnum,atonagasa
poke p1,atonagasa+(j-k)+relatpathnum+1,0
atonagasa+=((j-k)+relatpathnum+1)
}else{
memexpand p1,atonagasa+(j-k)+1
memcpy p1,folders.i,j-k,atonagasa,k
poke p1,atonagasa+(j-k),0
atonagasa+=(j-k)
}
}else{
forudagoukei--
}
}else{
forudagoukei=-1
break
}
k=j+2
j++
}
j++
loop
if forudagoukei==-1{
forudagoukei=0
filegoukei=0
break
}
}
//dialog dir_cur,2:if stat=7:end
forudagoukei++
}
if filegetflag.i==0 & (p3==0 | p3==1 | p3==2 | p3==3 | p3==6 | p3==7){//ファイルの一覧取得
dirlist buf,p2,1
filegoukei+=stat
j=0
k=0
repeat// foldernum.i
if peek(buf,j)==0:break
if peek(buf,j)==CR{
poke bbuf,j-k,0
memcpy bbuf,buf,j-k,,k
memset winfind,0,WIN32_FIND_DATASIZE
FindFirstFile bbuf,winfind
if stat!=INVALID_HANDLE_VALUE{
FindClose stat
ifflag=0
if (p3==1 | p3==0) : ifflag=1
if p3==2 | p3==3{
if lpeek(winfind,dwFileAttributes) & FILE_ATTRIBUTE_HIDDEN{
}else{
if lpeek(winfind,dwFileAttributes) & FILE_ATTRIBUTE_SYSTEM{
}else{
ifflag=1
}
}
}
if p3==6 | p3==7{
if lpeek(winfind,dwFileAttributes) & FILE_ATTRIBUTE_HIDDEN : ifflag=1
if lpeek(winfind,dwFileAttributes) & FILE_ATTRIBUTE_SYSTEM : ifflag=1
}
if ifflag{
if peek(p1,0)!=0{
atonagasa+=2
memexpand p1,atonagasa+1
poke p1,atonagasa-2,"\n"
}
if i>0{
memexpand p1,atonagasa+(j-k)+relatpathnum+1+1
memcpy p1,buf,j-k,atonagasa+relatpathnum+1,k
poke p1,atonagasa+relatpathnum,'\\'
memcpy p1,relatpath,relatpathnum,atonagasa
poke p1,atonagasa+(j-k)+relatpathnum+1,0
atonagasa+=((j-k)+relatpathnum+1)
}else{
memexpand p1,atonagasa+(j-k)+1
memcpy p1,buf,j-k,atonagasa,k
poke p1,atonagasa+(j-k),0
atonagasa+=(j-k)
}
}else{
filegoukei--
}
}else{
forudagoukei=-1
break
}
k=j+2
j++
}
j++
loop
filegetflag.i=1
if forudagoukei==-1{
forudagoukei=0
filegoukei=0
break
}
}
j=0
if folderp.i>=foldernum.i{//フォルダの一覧を最後まで処理したまたはフォルダが一つもない
folderp.i=0
filegetflag.i=0
if i==0:break
i--
j=1
buf=getpath(dir_cur,32)
poke buf,strlen(buf)-1,0
memset winfind,0,WIN32_FIND_DATASIZE
FindFirstFile buf,winfind
if stat!=INVALID_HANDLE_VALUE{
FindClose stat
if lpeek(winfind,dwFileAttributes) & FILE_ATTRIBUTE_DIRECTORY{
chdir buf
continue
}
}
forudagoukei=0
filegoukei=0
break
}
j=folderp.i
repeat
if peek(folders.i,j)==0:break
if peek(folders.i,j)==CR:break
j++
loop
j-=folderp.i
memcpy buf,folders.i,j,,folderp.i
poke buf,j,0
folderp.i+=j
if peek(folders.i,folderp.i)==CR:folderp.i+=2
j=0
chdir buf
i++
folderp.i=0
loop
chdir dircurbak//カレントディクトリをもとに戻す
//title ""+atonagasa
if p3==1 | p3==3 : forudagoukei=1
return (forudagoukei-1)+filegoukei
#global
ダウンロード
https://aa38020e42f53ca54e166915354734af1f102cbd.googledrive.com/host/0B9vewWZYDiXefmNjRWZCb1FrUmpab3o2dk5nTXRkRFdGTXFqTWZjNExVTm41OHUwWFdRUG8/apps/dirlistk.txt
| |
|
2015/9/2(Wed) 13:33:49|NO.71250
低機能双方向連結リスト構造モジュール
#module
/*
|-----|-----|-----|-----|-----|-----|
整数だけのリスト構造を使用するためのモジュール
|-----|-----|-----|-----|-----|-----|
動作速度は重視していません
変数名はいいのが思い浮かばなかったためテキトウです
整数のみの対応です
|-----|-----|-----|-----|-----|-----|
データ構造 : 双方向連結リスト形式
要素の先頭から順に
後方へのポインタ - 4バイト(POINTERSIZE)
データ本体(整数のみ) - 4バイト(DATASIZE)
前方へのポインタ - 4バイト(POINTERSIZE)
合計で12バイト(POINTERSIZE*2+DATASIZE)
また0番目の要素の前方へのポインタ及び末尾の要素の後方へのポインタには0が代入されています
|-----|-----|-----|-----|-----|-----|
新規要素の挿入および後方への追加およびリスト構造の新規作成
addlist p1,p2
p1=ポインタ
p2=-1~(0) : 何番目の後に追加するか
statに新たしくつくられた要素の先頭アドレスが返されます
p2<-1の場合は0が返されます
エラーが発生した場合は0が返されます
p2に1を代入した場合要素1と要素2の間に要素がつくられ元要素2は要素3になります
p2に-1または存在しない要素の番号を代入した場合は末尾の後ろにつくられます
|-----|-----|-----|-----|-----|-----|
要素の削除およびリスト構造の一括削除
dellist p1,p2
p1=ポインタ : リストの先頭ポインタ
p2=-1~(0) : 何番目を削除するか
statに削除された要素の前方の要素のアドレスが返されます
(0番目を削除した場合にそのリスト構造の0番目となる要素のアドレスを取得する場合などに使えます)
(0番目を削除した場合に0が返った場合はそのリストの要素はすべて解放されたということです)
p1<=0またはp2<0の場合0が返されます
p2に存在しない要素の番号を指定した場合末尾の要素が削除されます
p2に-1を代入した場合ポインタが間違っていなければ1が返されまたそのポインタの示すリストの要素はすべて削除されます(リスト構造の一括削除)
|-----|-----|-----|-----|-----|-----|
リスト構造に含まれる要素の個数取得および既に削除されたリストかの確認および各要素のアドレス取得
getlistaddres p1,p2
p1=ポインタ : リストの先頭ポインタ
p2=-1~(0) : 何番目の要素の先頭アドレスを返すか
statに指定された番号の要素の先頭アドレスが入ります(p2=-1の場合は何番目までの要素があるかが返されます)
p1<=0またはp2<-1の場合0が返されます
p2に-1を代入した場合アドレスではなく要素の個数が返されます(0の場合そのリストはすでにすべて解放されています)
p2に存在しない要素の番号を指定した場合0が返されます
|-----|-----|-----|-----|-----|-----|
リスト構造からのデータ取り出し(整数のみ)
getvalue(p1,p2)
p1=ポインタ : リストの先頭ポインタ
p2=0~(0) : 何番目の要素のデータを返すか
p1<=0またはp2<0の場合0が返されます
p2に存在しない要素の番号を指定した場合0が返されます
|-----|-----|-----|-----|-----|-----|
リスト構造へのデータ書き込み(整数のみ)
setvalue p1,p2
p1=ポインタ : リストの先頭ポインタ
p2=0~(0) : 何番目の要素に書き込むか
p3=0~(0) : 書き込むデータ
成功した場合statに1が返されます
p1<=0またはp2<0の場合0が返されます
p2に存在しない要素の番号を指定した場合0が返されます
|-----|-----|-----|-----|-----|-----|
*/
//64ビットに移行した際の調整用
#define POINTERSIZE 4 //ポインタ部のサイズ
#define DATASIZE 4 //データ部のサイズ
#define PTRTYPE vartype("int") //ポインタ型
#define DATATYPE vartype("int") //データ型
#define ctype MAEP(%1) (%1+DATASIZE+POINTERSIZE)
#define ctype USHIROP(%1) %1
#define ctype DATAP(%1) (%1+POINTERSIZE)
#define GPTR $40//0で初期化された固定メモリ
#uselib "kernel32.dll"
#cfunc GlobalAlloc "GlobalAlloc" int,int
#func GlobalFree "GlobalFree" int
#cfunc GlobalSize "GlobalSize" int//すでにGlobalAllocで確保したメモリかどうかの判定に
#deffunc addlist int p1, int p6, local pointer1 , local tmp4, local addforw, local addbakwr, local pointer3
if p6<-1 : return 0
if p1<=0{//リスト新規作成
pointer1=GlobalAlloc(GPTR,POINTERSIZE*2+DATASIZE)
return pointer1
}
if GlobalSize(p1)==0 : return 0
pointer1=GlobalAlloc(GPTR,POINTERSIZE*2+DATASIZE)
if pointer1==0 : return 0
tmp4=p6
if p6==-1{
getlistaddres p1,-1//末尾の番号を取得
tmp4=stat-1
}
getlistaddres p1,tmp4
pointer3=stat
if pointer3<=0{
getlistaddres p1,-1//末尾の番号を取得
getlistaddres p1,stat-1
pointer3=stat
}
dupptr tmp4,MAEP(pointer3),POINTERSIZE,PTRTYPE//前方のアドレス取得
addforw=tmp4
/*dupptr tmp4,USHIROP(pointer3),POINTERSIZE,PTRTYPE//後方のアドレス取得
addbakwr=tmp4*/
if addforw>0{//前方要素に後方要素を結びつける処理
dupptr tmp4,USHIROP(addforw),POINTERSIZE,PTRTYPE
tmp4=pointer1
}
dupptr tmp4,MAEP(pointer1),POINTERSIZE,PTRTYPE//新たにつくられた要素に次の要素のアドレスを教えておく
tmp4=addforw
dupptr tmp4,MAEP(pointer3),POINTERSIZE,PTRTYPE
tmp4=pointer1
dupptr tmp4,USHIROP(pointer1),POINTERSIZE,PTRTYPE//新たにつくられた要素に前の要素のアドレスを教えておく
tmp4=p1
/*if addbakwr>0{//後方要素に前方要素を結びつける処理
dupptr tmp4,MAEP(addbakwr),POINTERSIZE,PTRTYPE
tmp4=pointer1
}*/
return pointer1
#deffunc dellist int p2, int p3, local tmp1, local delforw, local delbakwr, local pointer2
if p2<=0 | p3<-1 : return 0
if GlobalSize(p2)==0 : return 0
if p3==-1{
pointer2=p2
repeat
dellist pointer2,0
pointer2=stat
if pointer2<=0:break
loop
return 1
}
getlistaddres p2,p3//指定された番号の要素の先頭アドレス取得
pointer2=stat
if pointer2<=0{//指定された番号の要素が見つからなかった場合末尾の要素のアドレスを代入する
getlistaddres p2,-1
getlistaddres p2,stat-1
pointer2=stat
}
if pointer2<=0:return 0
dupptr tmp1,USHIROP(pointer2),POINTERSIZE,PTRTYPE//後方のアドレス取得
delbakwr=tmp1
dupptr tmp1,MAEP(pointer2),POINTERSIZE,PTRTYPE//前方のアドレス取得
delforw=tmp1
if delbakwr>0{//後方要素に前方要素を結びつける処理
dupptr tmp1,MAEP(delbakwr),POINTERSIZE,PTRTYPE
tmp1=delforw
}
if delforw>0{//前方要素に後方要素を結びつける処理
dupptr tmp1,USHIROP(delforw),POINTERSIZE,PTRTYPE
tmp1=delbakwr
}
GlobalFree pointer2
return delforw//delbakwr
#deffunc getlistaddres int p4, int p5 , local tmp2, local tmp3, local counter1
if p4<=0 | p5<-1 :return 0
tmp3=p4
counter1=0
if GlobalSize(p4)==0 : return 0
while p5==-1 | counter1<p5//リストをたどっていく
dupptr tmp2,MAEP(tmp3),POINTERSIZE,PTRTYPE
//mes "a"+tmp2+" "+p5
if tmp2==0: _break
tmp3=tmp2
counter1++
wend
if p5==-1 : return counter1+1
if counter1<p5 : tmp3=0//指定した番号の要素が存在しなかったとき
return tmp3
#defcfunc getvalue int p6, int p7, local tmp5, local pointer4
if p6<=0 | p7<0 :return 0
if GlobalSize(p6)==0 :return 0
getlistaddres p6,p7
pointer4=stat
if pointer4<=0 :return 0
if GlobalSize(pointer4)==0 :return 0
dupptr tmp5,DATAP(pointer4),DATASIZE,DATATYPE
return tmp5
#deffunc setvalue int p8, int p9, int p10, local tmp6, local pointer5
if p8<=0 | p9<0 :return 0
if GlobalSize(p8)==0 :return 0
getlistaddres p8,p9
pointer5=stat
if pointer5<=0 :return 0
if GlobalSize(pointer5)==0 :return 0
dupptr tmp6,DATAP(pointer5),DATASIZE,DATATYPE
tmp6=p10
return 1
#global
#uselib "kernel32.dll"
#cfunc GlobalSize "GlobalSize" sptr
addlist 0,0
a=stat
getlistaddres a,-1
mes "長さ"+stat
addlist a,-1
mes stat
getlistaddres a,-1
mes "長さ"+stat
addlist a,1
mes stat
getlistaddres a,-1
mes "長さ"+stat
dupptr b,a+8,4
mes "アドレス"+a+" "+b
setvalue a,1,100
mes stat
mes "1番目="+getvalue(a,1)
dellist a,1
mes stat
mes "1番目="+getvalue(a,1)
getlistaddres a,-1
mes "長さ"+stat
dellist a,-1//全削除
mes stat
//GlobalSizeで既にGlobalAllocで確保したメモリかどうかは判別してのエラー処理の確認
getlistaddres a,-1
mes "長さ"+stat
dellist a,1
mes stat
getlistaddres a,-1
mes "長さ"+stat
mes GlobalSize(a)
dellist a,0
mes stat
mes a
mes GlobalSize(a)
getlistaddres a,-1
mes "長さ"+stat
mes getvalue(a,0)
https://aa38020e42f53ca54e166915354734af1f102cbd.googledrive.com/host/0B9vewWZYDiXefmNjRWZCb1FrUmpab3o2dk5nTXRkRFdGTXFqTWZjNExVTm41OHUwWFdRUG8/apps/liststrr.txt
| |
|
2015/9/4(Fri) 14:51:34|NO.71311
ちかぢかホームページ(特に何もない)を移動しようかと思います。そこで移転したら投稿したURLは使えなくなります。
HSP3CLでmesで勝手に改行するのがいやなので改行しないmesをつくりました。
わざわざモジュールにするより直接呼び出したほうが早かったです。
#runtime "hsp3cl"
//コンソールで改行なしで使えるmes
#module
#uselib "crtdll.dll"
#func printf "printf" str,str
#deffunc mes2 str p1
printf "%s",p1
return
#global
mes2 "aa"
mes2 "bb"
mes2 "\r"
mes2 "bb"
mes2 "\n豆腐"
|
|
2015/9/6(Sun) 07:25:38|NO.71398
せっかくなのでscanfも使ってみました
#runtime "hsp3cl"
#uselib "crtdll.dll"
#func scanf "scanf" str,var
#func printf "printf" str,str
sdim tofu
printf "何か入力してください:",""
scanf "%"+5+"[^\n]%*[^\n]", tofu
mes tofu
|
|
2015/9/6(Sun) 13:10:21|NO.71408
モジュール型変数かを調べるモジュール
#module
#defcfunc ModCheck var mod_
if vartype(mod_)=5:if varuse(mod_)=1 : return 1
return 0
#global
foreachでモジュール型変数じゃなかったらbreakするマクロ
#define global ModForeach(%1)foreach %1 : if ModCheck(%1)=0:break
|
|
2015/9/6(Sun) 18:42:27|NO.71420
お借りします。たまに在るデータの暗号化云々用に。
/***************************************************************
■ rc_Codec 変数バッファ, バッファサイズ, 符号キー, 動作指定
変数バッファに格納されたデータを符号/複合化します。
変数バッファ自体を書き換え、statに処理後のバッファサイズを返します。
・バッファサイズ 変数バッファのデータサイズを指定します。
・符号キー 符号/複合化に用いる任意の32bit数値を指定します。
・動作指定 0:符号化 / 1:復号化 のどちらかを指定します。
・stat 処理後の変数バッファのサイズを返します。失敗時は0を返します。
■ rc_Save "ファイル名", 変数バッファ, バッファサイズ, キー指定
変数バッファに格納されたデータを符号化して、ファイルに保存します。
・バッファサイズ 変数バッファのデータサイズを指定します。
・キー指定 符号化に用いる任意の32bit数値、又は文字列を指定します。
・stat 保存したファイルのサイズを返します。失敗時は0を返します。
■ rc_Load "ファイル名", 変数バッファ, キー指定
ファイルを読み込み復号化して、変数バッファに格納します。
・キー指定 複合化に用いる任意の32bit数値、又は文字列を指定します。
・stat 複合後の変数バッファのサイズを返します。失敗時は0を返します。
***************************************************************/
#module _mod_rc_codec
#ifndef xDim
#uselib "kernel32.dll"
#func _VirtualProtect "VirtualProtect" var,int,int,var
#deffunc xDim array p0, int p1, local a
Dim p0,p1 :Dim a :_VirtualProtect p0,p1<<2,$40,a
If(stat==0){Dialog "failed xDim",1} :Return stat
#endif
#const kFix0 $C0DEC774 ;固定キー#0
;--[内部用]文字列を適当に32bitキー化("str") = key
#defcfunc _rc_A2K str p0, local a, local b
b=p0 :a.0=kFix0^$fedcba98,StrLen(b)
If(a.1){Repeat a.1 :Poke a.0,cnt&3,Peek(a.0,cnt&3)^Peek(b,cnt) :Loop}
Return a.0
;--[内部用]値置換テーブル作成(buf,seed)
#deffunc _rc_MakeTable array pa, int p0, local a, local fnc_makeTable
Dim pa,64 :a=varptr(pa),p0 :xDim fnc_makeTable,29
fnc_makeTable. 0=$51EC8B55,$8B575653,$758B0C5D,$8BC93308,$410888C6,$00F98140,$72000001,$8BC933F4
fnc_makeTable. 8=$8BD38BFE,$15EAC1C3,$0BE0C151,$07FFE281,$F2830000,$F8002569,$C20BFFFF,$8B01518D
fnc_makeTable.16=$25D88BCA,$00000FFF,$F1F7D233,$FC558959,$8816048A,$458B4707,$060C88FC,$00F98141
fnc_makeTable.24=$72000001,$0001B8BC,$5E5F0000,$C25D595B,$00000008
Return CallFunc(a,varptr(fnc_makeTable),2)
;--レンジコーダ符号化/複合化(buf,size,key,type[0:Encode 1:Decode]) <stat:buf-size>
#deffunc rc_Codec array pa, int p0, int p1, int p2, local a, local b, local c, local d, local fnc_rc_Codec
If(p0<1){Return 0} :a.0=0,0,p0<<1,p0,p1,p2&1 :_rc_MakeTable d,p1^kFix0
If(a.5){a.2=lPeek(pa) :a.2=((a.2&$3e0f83e0)>>5)|((a.2&$01f07c1f)<<5)|(a.2&$c0000000)}
xDim fnc_rc_Codec,365 :sDim b,a.3 :sDim c,a.2+4 :MemCpy b,pa,a.3 :a.0=varptr(b),varptr(c),varptr(d)
fnc_rc_Codec. 0=$53EC8B55,$45F65756,$7D8B011C,$0C758B10,$74085D8B,$18458B15,$14558B50,$53565752
fnc_rc_Codec. 8=$000367E8,$14C48300,$4D8B13EB,$458B5118,$56575014,$014EE853,$C4830000,$5B5E5F14
fnc_rc_Codec. 16=$0018C25D,$8BEC8B55,$108B0845,$EAC1CA8B,$03E1C11D,$8307E283,$E18347F2,$89CA0BF8
fnc_rc_Codec. 24=$FFE18008,$C35DC18B,$53EC8B55,$558BC033,$085D8B10,$E281C28A,$000000FF,$05144D8B
fnc_rc_Codec. 32=$000000FF,$8B930C01,$0A010C55,$1C74C085,$D14AD08B,$7401A8EA,$0DC28B0D,$00000100
fnc_rc_Codec. 40=$01085D8B,$C28B830C,$E475C085,$90C35D5B,$53EC8B55,$8B084D8B,$FF050C45,$33000000
fnc_rc_Codec. 48=$74C085DB,$4AD08B25,$01A8EAD1,$C28B0C74,$0001000D,$8104FF00,$C28B0AEB,$0001000D
fnc_rc_Codec. 56=$811C0300,$C085C28B,$C38BDB75,$90C35D5B,$53EC8B55,$7D8B5756,$10458B08,$8B8704FF
fnc_rc_Codec. 64=$02FF0C55,$F6332CEB,$038BDF8B,$7601F883,$8BE8D115,$50D8F7D6,$0C4D8B52,$45E85751
fnc_rc_Codec. 72=$83FFFFFF,$834610C4,$FE8104C3,$00000100,$458BD872,$0038810C,$73000100,$5B5E5FC9
fnc_rc_Codec. 80=$9090C35D,$53EC8B55,$0C4D8B56,$33085D8B,$89D233C0,$8B318B11,$00CA81D0,$C1000001
fnc_rc_Codec. 88=$D30302E2,$753B3203,$FF077610,$40C00302,$128B09EB,$1101C003,$3D02C083,$000000FF
fnc_rc_Codec. 96=$FF2CD372,$C35D5B5E,$81EC8B55,$FFF7E8C4,$53D233FF,$FF335756,$8314458B,$C003FFCE
fnc_rc_Codec.104=$4589DB33,$89C033F4,$4589F055,$E8858DF8,$33FFFFF7,$8B1089D2,$C981F84D,$00000100
fnc_rc_Codec.112=$9489D233,$FFF7E88D,$F845FFFF,$8104C083,$0100F87D,$DB720000,$4589C033,$8D016AF8
fnc_rc_Codec.120=$4D8AF045,$E8958DF8,$51FFFFF7,$75E85250,$83FFFFFE,$45FF10C4,$F87D81F8,$00000100
fnc_rc_Codec.128=$4D8BDB72,$14458B14,$F07C1F25,$E0E18101,$C13E0F83,$558B05E9,$05E0C114,$0000E281
fnc_rc_Codec.136=$C80BC000,$FF83CA0B,$F84D8904,$8D0C4D8B,$830F3904,$00000105,$47F8558A,$88FFE280
fnc_rc_Codec.144=$6DC14010,$FF8308F8,$E9ED7204,$000000ED,$D233C68B,$89F075F7,$4D8BF845,$88018A08
fnc_rc_Codec.152=$45FFFF45,$75B60F08,$858D56FF,$FFFFF7E8,$FE3AE850,$6DF7FFFF,$B5948BF8,$FFFFF7E8
fnc_rc_Codec.160=$C483D803,$0C4D8B08,$F855AF0F,$8B39048D,$EC4589F2,$558D2AEB,$A5E85218,$59FFFFFD
fnc_rc_Codec.168=$E9C1CB8B,$FFE18118,$8B000000,$04321055,$EC4D8B0A,$FF470188,$E6C1EC45,$08E3C108
fnc_rc_Codec.176=$331E048D,$18E8C1C3,$458BCC74,$00FE810C,$8D000100,$55893814,$8D4073E8,$E851184D
fnc_rc_Codec.184=$FFFFFD60,$C1D38B59,$E28118EA,$000000FF,$32104D8B,$558B1104,$470288E8,$8BE845FF
fnc_rc_Codec.192=$FFFF25C3,$00BE0000,$2B000100,$08E6C1F0,$8108E3C1,$010000FE,$3BC07200,$0472F47D
fnc_rc_Codec.200=$60EBC033,$4D8DD233,$FF558AF0,$F7E8858D,$5152FFFF,$FDB6E850,$C483FFFF,$14558B0C
fnc_rc_Codec.208=$FF144583,$850FD285,$FFFFFF04,$4D89C933,$0C458BF8,$8D38348D,$E8501845,$FFFFFCE4
fnc_rc_Codec.216=$C159D38B,$4D8B18EA,$FFE28110,$47000000,$3208E3C1,$06881104,$F845FF46,$04F87D83
fnc_rc_Codec.224=$C78BD572,$8B5B5E5F,$90C35DE5,$81EC8B55,$FFF6E0C4,$33C033FF,$53C933D2,$45895756
fnc_rc_Codec.232=$EC5589F4,$33FFCF83,$33DB33F6,$E84D89C0,$8DF84589,$FFF6E085,$104D8BFF,$0FF8558A
fnc_rc_Codec.240=$948809B6,$FFFEE00D,$FFD233FF,$10891045,$33F8558B,$00CA81C9,$83000001,$8C8904C0
fnc_rc_Codec.248=$FFF6E095,$F845FFFF,$00F87D81,$72000001,$89C033C8,$016AF845,$8AE8558D,$8D8DF845
fnc_rc_Codec.256=$FFFFF6E0,$E8515250,$FFFFFC5C,$FF10C483,$7D81F845,$000100F8,$33DB7200,$F84589C0
fnc_rc_Codec.264=$8D08558B,$4D89044A,$08558BE4,$2BEC458B,$C933F855,$8A08E0C1,$C10B034A,$8DEC4589
fnc_rc_Codec.272=$E8501845,$FFFFFBFC,$59E4558B,$E6C1C933,$8A023208,$8AC033C8,$FEE00D84,$45FFFFFF
fnc_rc_Codec.280=$E445FFF8,$7D83C60B,$F08B04F8,$4583BB72,$558B0808,$EC4D8BEC,$7C1FE181,$E28101F0
fnc_rc_Codec.288=$3E0F83E0,$8B05EAC1,$E1C1EC45,$00002505,$D10BC000,$5589D00B,$0C558BEC,$8DF44D8B
fnc_rc_Codec.296=$45890A04,$F4558BE0,$0FEC553B,$0000F983,$33C78B00,$E875F7D2,$8BF84589,$33C32BC6
fnc_rc_Codec.304=$F875F7D2,$F04D8D50,$E0858D51,$50FFFFF6,$FFFC6FE8,$FF4588FF,$558BC933,$FF4D8AF0
fnc_rc_Codec.312=$F855AF0F,$BC8BDA03,$FFF6E08D,$0CC483FF,$F87DAF0F,$458D2CEB,$45E85018,$8BFFFFFB
fnc_rc_Codec.320=$33590855,$08E6C1C9,$C88A0232,$E7C1C033,$0D848A08,$FFFFFEE0,$0B0845FF,$08E3C1C6
fnc_rc_Codec.328=$148DF08B,$C1D3331F,$CA7418EA,$0000FF81,$43730001,$51184D8D,$FFFB07E8,$08558BFF
fnc_rc_Codec.336=$BFC93359,$00010000,$FF250232,$C1000000,$8C8A08E6,$FFFEE005,$0BC38BFF,$FFFF25CE
fnc_rc_Codec.344=$F18B0000,$45FFF82B,$08E7C108,$8108E3C1,$010000FF,$33BD7200,$E8558DC0,$8DFF458A
fnc_rc_Codec.352=$FFF6E08D,$515250FF,$FFFB63E8,$0CC483FF,$8AE0458B,$1088FF55,$FFF445FF,$4D8BE045
fnc_rc_Codec.360=$EC4D3BF4,$FF07820F,$458BFFFF,$5B5E5FEC,$C35DE58B
a.5=CallFunc(a,varptr(fnc_rc_Codec),6) :If(a.5==0){Return 0}
sDim pa,a.5 :MemCpy pa,c,a.5
Return a.5
;--符号化&保存("filename",buf,size,<key>) <stat:file-size>
#define global rc_Save(%1,%2,%3=0,%4=0) _tmp_@_mod_rc_codec=%4:_rc_Save %1,%2,%3,_tmp_@_mod_rc_codec
#deffunc _rc_Save str p0, array pa, int p1, var pv, local a, local b
a.0=p1,int(pv),0 :If(a.0<1){a.0=StrLen(pa) :If(a.0<1){Return 0}}
If(vartype(pv)!=4){a.1=_rc_A2K(str(pv))} :sDim b,a.0 :MemCpy b,pa,a.0
rc_Codec b,a.0,a.1,0 :a.0=stat :If(a.0<1){Return 0} :bSave p0,b,a.0
;ファイル検査用フッタ追加
a.2=(((a.0&$cccccccc)>>2)|((a.0&$33333333)<<2))^a.1^kFix0 :bSave p0,a.2,4,a.0
Return a.0+4
;--読込&復号化("filename",buf,<key>) <stat:buf-size>
#define global rc_Load(%1,%2,%3=0) _tmp_@_mod_rc_codec=%3:_rc_Load %1,%2,_tmp_@_mod_rc_codec
#deffunc _rc_Load str p0, array pa, var pv, local a, local b
Exist p0 :a.0=strsize,int(pv),0 :If(a.0<1){Return 0}
If(vartype(pv)!=4){a.1=_rc_A2K(str(pv))} :sDim b,a.0 :bLoad p0,b,a.0
;フッタで簡易ファイル検査
a.0-=4 :a.2=lPeek(b,a.0)^a.1^kFix0
If((((a.2&$cccccccc)>>2)|((a.2&$33333333)<<2))!=a.0){Return 0}
rc_Codec b,a.0,a.1,1 :a.0=stat :If(a.0<1){Return 0}
sDim pa,a.0 :MemCpy pa,b,a.0
Return a.0
#global
/**** 動作テスト用 ********************************************
#module
#uselib "shell32.dll"
#func _DragAccept "DragAcceptFiles" sptr,int
#func _DragQuery "DragQueryFileA" sptr,int,sptr,int
#func _DragPoint "DragQueryPoint" sptr,var
#func _DragFinish "DragFinish" sptr
#uselib "winmm.dll"
#func _timeBeginPeriod "timeBeginPeriod" int
#func _timeEndPeriod "timeEndPeriod" int
#cfunc _timeGetTime "timeGetTime"
#define global file_DragDrop(%1=0,%2=1) _tmp_@=%1:_file_DragDrop _tmp_@,%2
#deffunc _file_DragDrop var p0, int p1
If(vartype(p0)!=1){Return 0} :oncmd gosub p0,$233 :_DragAccept hWnd,p1&1 :Return stat
#defcfunc file_DropFile int p0, int p1, local a, local b, local c
Dim a,3 :_DragPoint p0,a :a.2=((a.1&$ffff)<<16)|(a.0&$ffff) :sDim b,$10000,2 :_DragQuery p0,-1,0,0 :a.1=stat
Repeat a.1 :_DragQuery p0,cnt,varptr(b.1),$400 :If(p1)||(a.1==1){b.0=b.1 :Break} :b.0+=b.1+"\n" :Loop
_DragFinish p0 :mRef c,64 :c=a.2 :Return b.0
#deffunc count local a
If(_cTime){Goto *@f} :_timeBeginPeriod 1 :_cTime=_timeGetTime() :Return 0
*@ :a=_timeGetTime()-_cTime :_timeEndPeriod 1 :_cTime=0 :Return a
;--ファイルバイナリ比較("fileA","fileB") = FileSize[0=NoMatch]
#defcfunc file_CheckDiff str p0, str p1, local a, local b, local fnc_compFile
Exist p0 :a.2=strsize :Exist p1 :a.3=strsize
If((a.2*a.3)==0)||(a.2^a.3){Return 0} :xDim fnc_compFile,14
sDim b,(a.2+3)&$fffffffc,2 :bLoad p0,b.0,a.2 :bLoad p1,b.1,a.2
If(a.2<4){Return (b.0==b.1)*a.2} :a.0=varptr(b.0),varptr(b.1),(a.2+3)>>2
fnc_compFile.0=$53EC8B55,$5D8B5756,$0C4D8B10,$8B08558B,$8B12EBC3,$04C28332,$C183398B,$74F73B04
fnc_compFile.8=$EBC03304,$83F08B0B,$F685FFC0,$C38BE575,$5D5B5E5F,$00000CC2
If(CallFunc(a,varptr(fnc_compFile),3)){Return a.3} :Return 0
#global
*start
Dim i :Dim j :Dim s :Dim t :SysColor 15 :BoxF :SysColor 18
s ="ファイルをドラッグ&ドロップする事で\n符号化したデータを「ファイル名.rc」として吐き出します。\n\n"
s+="符号化されたファイルの場合、復号化し「ファイル名.dc」として吐き出し\n元のファイルとバイナリ比較を行います。"
Mes s :file_DragDrop *DaD :gSel 0,1 :Redraw 0
STOP
*DaD
s.0=file_DropFile(wParam,1),"" :s.1=GetPath(s.0,18)
Exist s :i=strsize,0,0 :If(i<1){Return 0}
SysColor 15 :BoxF ,200 :SysColor 18 :Pos ,200 :count
If(s.1==".rc"){rc_Load s,t,12345678 :i.1=stat :s.0=GetPath(s,1),s+".dc"
If(i.1>0){bSave s.1,t,i.1} :Exist s.0 :i.0=strsize :count :Mes StrF("■複合化 <%dms>",stat)
Mes StrF(" Src:%-48s [%9d]\n Put:%-48s [%9d]",GetPath(s.0,8),i.0,GetPath(s.1,8),i.1)
If(file_CheckDiff(s.0,s.1)){Mes " - Check OK -"}else{Mes " - Check Error!! -"}
}else{sDim t,i :bLoad s,t,i
rc_Save s+".rc",t,i,12345678 :i.1=stat :count :Mes StrF("■符号化 <%dms>",stat)
Mes StrF(" Src:%-48s [%9d]\n Put:%-48s [%9d]",GetPath(s,8),i.0,GetPath(s,8)+".rc",i.1)
} :Redraw 1 :Redraw 0
Return
/**************************************************************/
モノとしてはレンジコーダで符号化しつつキーを基にXORしてます。
その為、処理後のデータサイズは元のサイズとは異なります。
| |
|
2015/9/7(Mon) 11:40:29|NO.71428
何だかこのスレッドに上がったモジュールがこのまま過去ログへ行ってしまうのにもったいなさを感じます。
以前のHSP開発Wikiのようにまとめられる場所があればなぁ…
|
|
2015/9/7(Mon) 11:57:06|NO.71429
HSP開発Wikiですか。わたしが初めてHSPにさわった時(ようするにパソコンを使い始めた時)にはすでになくなっていた覚えがあります。
確かにHSPWikiではこういう内容は少ないのでそういう場所がほしいです。
だれかレンタルWikiでつくってくれないかなとは思います。自分でつくるのは管理が大変そうなのでいやです。
|
|
2015/9/7(Mon) 12:13:21|NO.71430
> Noaさん
10年ほど続いて、だいたい2年前に消滅した気がします。
そうですね、せっかく書いたページがまた消えてしまうのは非常にもったいないので、きちんと管理できる人にお願いしたいです。
|
|
2015/9/7(Mon) 12:24:02|NO.71433
自分もそう思います。自分だと管理できないとおもいます。
|
|
2015/9/7(Mon) 12:31:17|NO.71434
なくなってから2年しか経っていないのかと思い、みてみたら確かに最終更新日が2013年11月でした。
記憶ではもっと前になくなっていた覚えがあるのですが。
|
|
2015/9/7(Mon) 21:11:19|NO.71450
逆に10年も管理してたので 恩のじみたいとこありません?
inoviaさんとこで閲覧できますし
問題はその後に続くwikiが出なかったとこでしょう
とりあえず3年くらい運営できて
運営出来なくなったらコンテンツを譲渡出来る人みたいのでいいような
僕もここのBBSの流れでwiki設置しましたが
ほぼ一人でやってたりw
pukiwikiかなんかで
(別のでってでもOK 設置簡単なのなら)
設置要望あれば設置しますが
mjhdさんのサイト拝見させてもらいましたが
mjhdさんのがいいwiki運営出来そうなかんじはしますけど
でも移転とか考えるとhtmlのが楽ではあります
LINK文いじるだけだし
FFFTPで簡単にDL出来るし
|
|
2015/9/7(Mon) 21:35:08|NO.71452
連投すみません。
そのサイトの名前がわからず調べたのですが、
「HSP3ラウンジ掲示板」であっているのでしょうか?
|
|
2015/9/7(Mon) 22:12:35|NO.71456
確かにそこは見られなくっています。移転先を掲示板で聞こうと思っていました。
名前についてですが掲示板は「HSP3ラウンジ」と「HSP2ラウンジ」があったので正しいです。
そのホームページがあったホームページスペースがサービス終了(データ削除)したため見られなりました。
|
|
2015/9/7(Mon) 22:15:32|NO.71457
わたしがHSPを始めたころはHSPのコミュニティがほかにもありましたが、今ではHSP公式掲示板とHSPWikiしかないのはどうしてですか。
|
|
2015/9/7(Mon) 22:15:56|NO.71458
なるほど、サービス終了してしまったんですね。
Googleのcacheから見れないか、とも思ったのですがほぼ全滅でした。
|
|
2015/9/7(Mon) 22:23:20|NO.71459
Yahoo!知恵袋のHSPカテゴリのことを忘れていました。
私はYahoo! JAPANの検索キャッシュから見ようとしましたがなくなってすぐは見られましたがすぐに見られなくなってしまいました。
またバックアップは残っていないと思います。だれか移転先を知りませんか。
|
|
2015/9/7(Mon) 22:57:43|NO.71462
ところでもしWikiシステムを借りるか置くかにしてこのスレッドの内容を保存する場合ライセンスはどうなりますか。
難しくてよくわかりませんが著作権や著作者人格権はどうなるのでしょうか。Yahoo!知恵袋の場合は著作権と著作者人格権は行使しないことになっていたと思いますが。
|
|
2015/9/7(Mon) 23:42:10|NO.71465
>>GENKI
なるほど、インターネットアーカイブの存在を忘れていました。
それにしても検索できるサービスなんてあったんですね。
|
|
2015/9/7(Mon) 23:54:29|NO.71467
> 以前のHSP開発Wikiのようにまとめられる場所があればなぁ…
素直にHSPwiki使えばいいと思います。
http://quasiquote.org/hspwiki/
HSP開発Wiki…いいところだったんですけどね。モジュールもいっぱいあった。
しかしwikiの維持には手間も金もかかるので仕方ないです。一部データだけでも見れるようにしていただけてありがたい限りです。
自分が書いたところだけでも自分のサイトに転載しようかとも思ったんですが、他の人も手を入れてる可能性あるんですよね。…困った。
> 今ではHSP公式掲示板とHSPWikiしかないのはどうしてですか。
HSP以外のことで忙しくなり、放置した結果、消滅したという流れだとおもいます。
個人的にはLet's HSP!とかなくなると困ります。なくなると困るサイトはバックアップとっとかないとダメかー。
|
|
2015/9/8(Tue) 00:31:16|NO.71468
>素直にHSPwiki使えばいいと思います。
HSPWikiはHSP全般の情報のためのWikiなのでHSPWikiとは別にするのがいいと思います。
>著作権に関する議論は今までに何度かされています。
そうでしたか。それならモジュールをそのまま勝手に使えないことになるのでは。規約に著作権と著作者人格権のことを書けばいいのにと思います。
|
|
2015/9/8(Tue) 00:44:45|NO.71469
もしモジュールをそのまま勝手に使えないのであればアルゴリズムを参考にするくらいしかできないのでは。
>自分が書いたところだけでも自分のサイトに転載しようかとも思った
初めから書き直したらいいと思います。
|
|
2015/9/8(Tue) 00:47:30|NO.71470
だれかHSP HELP CENTERのぷまさんに連絡とれませんか。
|
|
2015/9/8(Tue) 00:58:03|NO.71471
そういえばHSPWikiにもプラグイン・モジュールのリストがありました。あまり機能していないようですが。
|
|
2015/9/8(Tue) 08:26:24|NO.71478
僕がこのスレッドや他のスレッドで公開したものは
再配布、改造はご自由にどうぞ。
(といっても大したものは投稿してませんが。)
|
|
2015/9/8(Tue) 11:39:15|NO.71482
HSP3ラウンジのサルベージですが、合計1053個のスレッドを復元できました。
問題はこれをどうするか。著作権的に、公開していいのかな・・・?
まぁ訴えられる事はないだろうし、皆の役に立つと思うけど・・・
|
|
2015/9/8(Tue) 11:51:12|NO.71483
連投すみません。
そもそもインターネットアーカイブは世界的に同じことをしてるわけで、
そこら辺の著作権はどうなってるのか?と思って調べてみた。
http://www.gabacho-net.jp/whims/whim0118.html
インターネットアーカイブの主張を要約すると、
「パスワードも特権も無しに一般に公開されてるファイルを集めてるだけ、
でも著作権者を尊重するから言ってくれれば削除するよ。」
って感じなので、著作権を主張したり自分のものだと偽って公開しない限り、問題はなさそうですね。
|
|
2015/9/8(Tue) 12:17:08|NO.71484
> 素直にHSPwiki使えばいいと思います。
確かに、十分な機能がありますね。
管理人さんにも連絡が付きそうですし、安定そうです。
> 著作権
著作権の話はモジュールの作者各自で考えるのが良いと思います。
このスレッドに書き込むと同時にWikiにも書いてもらえたら、より役立てられるんじゃないかなと思います。
|
|
2015/9/8(Tue) 14:03:50|NO.71486
著作権法の法文で公開するのに関係しそうなのをみました
難しすぎて全くわからなかったので間違っていたらすみません
なにかの役にたつかと思います
自分はちょっと公開するのは微妙な気がします
参考 http://law.e-gov.go.jp/cgi-bin/idxselect.cgi?IDX_OPT=1&H_NAME=%92%98%8d%ec%8c%a0%96%40&H_NAME_YOMI=%82%a0&H_NO_GENGO=H&H_NO_YEAR=&H_NO_TYPE=2&H_NO_NO=&H_FILE_NAME=S45HO048&H_RYAKU=1&H_CTG=1&H_YOMI_GUN=1&H_CTG_GUN=1
第七章 権利侵害
第百十二条
これによると著作権者はいつでも著作権侵害をやめるよういったりしようとするのをやめされされます
第二章 著作者の権利
第三節 権利の内容
第五款 著作権の制限(第三十条―第五十条)
第三十条の二
これによると写真にちょっと何かのキャラクターがはいったくらいならいいということです
第四十七条の六
これによると検索エンジンで検索のための情報ならいいというです
第三十二条
これによると引用ならいいということです
第四十二条の四
これによると国立国会図書館の館長は法律の範囲内でWayback Machineのようなことをできるらしいです
第四十七条の三
これによるとソフトはふつうに一人で使う分であれば自由にコピーしたりしていいらしいです
第百十三条第二項の規定を除くらしいです
第四十七条の五 1項
多分これが一番関係しそうです
これによると遅くなったりサーバーが壊れたりしないように代わりにデータを送るのはいい
それと見られなくなったらときのためにデータを保存しておくのはいい(普段は公開しておいたらだめ)
第四十七条の一、二
これによると美術館や売るときに紹介するためならちょっと写真をのせたりはできる
HSPWikiについてですが書きこんだものの所有権はHSP-ML(HSPメーリングリスト)に行きますが、最初に自分ひとりで書きこんだものは自分が著作権および著作者人格権を持つものでいいのですか。よくわかりません。
またHSPWikiの管理者についてですがHSPメーリングリストのウェブサイトがなくなっている(3.3のマニュアルには書いてあるが3.4のマニュアルには書いてない)ので管理者に連絡はつかない気がします。3.4のマニュアルにはhsp-devメーリングリストが書いてあるのでもしかしたら名前が変わったのかもしれませんが。(URLはマニュアルとは変わっているようです。)
HSPWikiのこと自体は3.4のマニュアルにも書いてあります。
変なことをかいていたらすみません。
| |
|
2015/9/8(Tue) 14:18:38|NO.71487
>>Noaさん
詳しく調べて頂きありがとうございます。
HSP3ラウンジの場合、既に元のページが見られなく成っているので、
公開しても大丈夫って事ですね。
|
|
2015/9/8(Tue) 14:19:07|NO.71488
ただ自分が著作権者であるということを証明するのはURLを書くか何かしておかないとむずかしいので実際は勝手に公開しても閉鎖させられるようなことは少ないと思いますが。
|
|
2015/9/8(Tue) 14:20:30|NO.71489
よくはわかりませんがもう見られなくなっているのでというのはだめなような。
|
|
2015/9/8(Tue) 14:33:41|NO.71490
Waybackのアーカイブを見ましたが利用規約のようなものは見つけられなかったのでそれぞれのかきこみの著作権や著作者人格権はそれぞれの書きこんだ人がその人がなにか宣言をしたりしていない限りは今でも行使できると思います。
書きこんだ本人であるということを証明するのは難しそうなので著作権侵害が親告罪である限りはないとは思いますが、非親告罪になった場合は著作権侵害で閉鎖させられそうな気もします。
非親告罪になった場合はフェアユース的なものができるでしょうから実際は逆にどうどうと公開できるようになると思いますが。
自分はほとんど法律を理解できていないとおもうので間違いが多分にあると思うので注意してください。
|
|
2015/9/8(Tue) 14:39:09|NO.71491
今思ったのですが掲示板にモジュールを書きこんだ際はURLなどを書くなどして自分が著作権者本人であるということわかりやすくしておく、どう使っていいのかを明記しておかないと
自分のプログラムでも使用できないということになる気がします。
|
|
2015/9/8(Tue) 14:42:09|NO.71492
まとめるとフェアユース的なのが日本でもできれば問題解決だと思います。
|
|
2015/9/8(Tue) 16:24:07|NO.71493
わたしにはちんぷんかんぷんなので、著作権のことは分かりません。
|
|
2015/9/8(Tue) 20:03:47|NO.71498
Noa さん
思いつくたびにレスを返すより、考えをまとめて書く方が良いですよ。
著作権に付いては、日本では基本的に放棄出来なかったと思います。
ただ、その著作権を行使しない事が放棄と同じ事になります。
一般的に不特定多数の人が自由に書き込め閲覧できる環境は、明示して
いない限り「パクリ上等!」と解釈されます。利用して貰うために書き
込んでいるんだから当然ですよね。
書き込んだ人が特定出来ない・意思表示をしていない場合は、サイトの
一部と見なされますので著作権者は不明でもサイトの所有財産に該当し
ます。なので良く「○○のサイトから引用しました」と言うのを見た事
が有ると思いまが、著作権者が曖昧なので掲示元を明示する事で問題を
解決しています。
ちなみに今回の「ちょっと便利になる」程度では、著作権を主張出来な
い事が多いです。だって「偶然似たような物になった」と言われたら言
い返せません、かなり特徴的・独創的で多数の人に利益をもたらすよう
な物で認知度が高い場合にオリジナルと判断されます。
難しい事を書きましたが、意思表示をしたいのならスクリプトなどの先頭に
;2015/09/08
;KA
;自由に使って下さい
とでも書いておきましょう、投稿したサイト自体に「無断使用禁止」などと
書かれているとややこしくなりますが、基本的に意思表示が優先されます。
最後にスレタイから外れた話題だとは言いませんが、主旨からすると淡々と
スクリプトを貼り付けて議論は別にした方が良い気もします。後から見た人
が「議論ばかりで肝心のやつを探せない!」なんてことも。
|
|
2015/9/8(Tue) 20:20:18|NO.71499
なんだか盛大に話がそれてるのに誰も何も言わないのね…まあいいか。
…と書いたところでKAさんが。
>>自分が書いたところだけでも自分のサイトに転載しようかとも思った
>
>初めから書き直したらいいと思います。
その手があったか。資料を参考に新たに書き下ろせば何の問題もありませんね。
時間出来たらそのうちやろう。
> そういえばHSPWikiにもプラグイン・モジュールのリストがありました。あまり機能していないようですが。
使われてないから使いやすいよう整備する人が出てこない。という悪循環が起きてるんだと思います。積極的に使えばいいと思います。
HSPWiKiは他のサイトより閉鎖のリスクが少ないので積極的に使ったほうがいい…はずなんですが私はなんで使わなかったんだっけ。(´・ω・`)
> アーカイブ漁れば部分的にサルベージできるかもしれませんね。
拾い上げたデータは自分のPCに保管して転載しないつもりで書いたんですが、転載ですか。
権利やら法律やら長期管理やら大変そうですが頑張ってください。
> 何だかこのスレッドに上がったモジュールがこのまま過去ログへ行ってしまうのにもったいなさを感じます。
ということなのでどうぞ。
http://quasiquote.org/hspwiki/HSPTV%21%E6%8E%B2%E7%A4%BA%E6%9D%BF%E3%81%AB%E5%85%AC%E9%96%8B%E3%81%95%E3%82%8C%E3%81%9F%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB
他にも優秀なモジュールが投下されたらこのページに追加すると便利なんじゃないでしょうか。
補足
> 日本では基本的に放棄出来なかったと思います。
著作人格権の事。
その他の著作権については放棄や譲渡、売買が可能です。
これ以上の詳しいことは新しくスレッド立てる方がいいでしょう。
|
|
2015/9/8(Tue) 20:27:12|NO.71500
>思いつくたびにレスを返すより、考えをまとめて書く方が良いですよ。
すみません。思いつくたびに書いていたのではなくこの掲示板にふさわしい内容かどうか等をじっくり考えて、まとめたら分かりにくいかと思い少しずつ分けて投稿していました。
まとめて書いたほうが分かりやすかったのですか。教えていただきすみません。
>ちなみに今回の「ちょっと便利になる」程度では、著作権を主張出来な
い事が多いです。
それです。ずっとそのことを書きたかったのですが、独創的ということばが思い浮かばず長々と書いてしまいました。
>難しい事を書きましたが、意思表示をしたいのなら
そういうふうにすればいいのですか、掲示板に書きこむということ自体がこの掲示板が初めてなので知りませんでした。
>主旨からすると淡々と
スクリプトを貼り付けて議論は別にした方が良い気もします。
確かにスレッドの名前からして議論はふさわしくないなとは思っていましたがどうしようか分からずそのままこのスレッドに書きこんでいました。
そしてHSPWikiの管理者はどうなのでしょうか。
|
|
2015/9/8(Tue) 20:50:52|NO.71502
確かに趣旨とずれていますね。
申し訳ございません。
ではモジュールを1つ。
ランダムな文字列を出力します。
#module
#defcfunc rndstr int p0,int p1,int p2,int p3,int p4//p1文字数 p2大文字あり p3小文字あり p4数字あり p5アンダーバーあり
sdim irand,p0
sdim keta,p0
randomize
keta=p0
ch(0)=p1
ch(1)=p2
ch(2)=p3
ch(3)=p4
sdim irand,256
bb=0
repeat 4
if ch(cnt)=1{
ifm(bb)=cnt
bb+
}
loop
if bb=0:stop
repeat int(keta)
switch ifm(rnd(bb))
case 0
moji=""
poke moji,0,int($+rnd(26)+$41)
swbreak
case 1
moji=""
poke moji,0,int($+rnd(26)+$61)
swbreak
case 2
moji=str(rnd(10))
swbreak
case 3
moji="_"
swbreak
swend
irand+=moji
loop
return irand
#global
|
|
2015/9/8(Tue) 21:05:09|NO.71504
VRAMを操作し色を取得します。pgetの高速版ですね。
まぁ自力で全て書いたわけではなく、かなりの部分を暇人さんに頼っています。
http://hsp.tv/play/pforum.php?mode=pastwch&num=59115
当時のスレはこちらです。
#module "mod_vpx"//VRAMのモジュール
#deffunc VRAMset
mref vramA,66
winx=ginfo_winx+(ginfo_sx-ginfo_winx) //サイズ可変ウィンドウに対応
winym=ginfo_winy-1+(ginfo_sy-ginfo_winy) //一番上のライン
winx2=((winx*3+3)&-4) //VRAM横1ラインのサイズ
vramptr=varptr(vramA)
return
#define global vpxget(%1=0, %2=0) p@mod_vpx=(winym@mod_vpx-(%2))*winx2@mod_vpx+(%1)*3
#define global ctype vpxset(%1=0) peek(vramA@mod_vpx,p@mod_vpx+(%1))
//おまけ
//vpxrgb x,y でvpx_rgbに24ビットで色が返る
//色毎のデータはvpx_r、vpx_g、vpx_bで取得
#define global vpxrgb(%1=0, %2=0) memcpy rgb@mod_vpx,vramA@mod_vpx,3,0,(winym@mod_vpx-(%2))*winx2@mod_vpx+(%1)*3
#define global vpx_rgb (rgb@mod_vpx)
#define global vpx_r ((rgb@mod_vpx>>16))
#define global vpx_g ((rgb@mod_vpx>>8)&$ff)
#define global vpx_b (rgb@mod_vpx&$ff)
#global
|
|
2015/9/8(Tue) 21:24:41|NO.71505
ついに100か..
|
|
2015/9/8(Tue) 23:12:32|NO.71508
> GENKIさん
Wikiの編集わざわざありがとうございます。非常に助かりました。
|
|
2015/9/9(Wed) 09:23:10|NO.71514
本スレッドにあるプログラムを全てHSPwikiに載せ、
更に利用範囲を明確にする、というのはどうでしょうか?
取り敢えずテンプレートを作ってみました。
もしよかったら使ってください。
「許可」「拒否」の二択です。「許可」をするほど利用範囲が広がります。
【1.他のプログラムへのインクルード】
【1.1.インクルードしたプログラム、コンパイル済みのソフトを配布】
【1.2.DLL等の必須ファイルを同封して配布】
【1.3.二次加工】
【1.4.著作名を表記しない】
【1.5.商用利用】
【2.プログラムそのものを配布】
【2.1二次加工】
【2.2著作名を表記しない】
【2.3商用利用】
【3.転載】
【3.1著作名を表記しない】
【3.2二次加工】
【3.3HSP関連のサイトに転載】
【4.フェアユース】
フェアユースとは「公正な利用」という意味です。
詳しくはwikiを見てください。
https://goo.gl/clLXMi
こんな感じでどうでしょうか?とりあえず自分から。
【1.他のプログラムへのインクルード】許可
【1.1.インクルードしたプログラム、コンパイル済みのソフトを配布】許可
【1.2.DLL等の必須ファイルを同梱して配布】許可
【1.3.二次加工】許可
【1.4.著作名を表記しない】許可
【1.5.商用利用】拒否
【2.プログラムそのものを配布】許可
【2.1二次加工】許可
【2.2著作名を表記しない】拒否
【2.3商用利用】拒否
【3.転載】許可
【3.1著作名を表記しない】拒否
【3.2二次加工】許可
【3.3HSP関連のサイトに転載】許可
【4.フェアユース】許可
|
|
2015/9/9(Wed) 10:01:35|NO.71515
とりあえずNoaさんとkanamaruさんと自分のモジュールをHSPwikiに書きました。
やっつけ仕事なのでもしミスがあったら修正お願いします・・・
|
|
2015/9/9(Wed) 10:37:08|NO.71516
いますぐ消してください。HSPWikiにかきこんだものの所有権はHSPWiki側に行くのでNYSLで公開できなくなるのでできれば今すぐ消してください。
|
|
2015/9/9(Wed) 10:50:06|NO.71517
申し訳ございません、全て削除しました。
|
|
2015/9/9(Wed) 11:01:14|NO.71518
Noaさんのホームページはこちらのサイトであっていますよね。
http://www.kmonos.net/nysl/
よくある質問のところに、転載再配布自由と書いていたので、
てっきりHSPwikiにも公開していいのかと思っていました。
大変申し訳ございませんでした。
|
|
2015/9/9(Wed) 11:03:53|NO.71519
いいえちがいます。そこはわたしとは全くの無関係です。わたしはそんなことができるほどすごくはありません。
昔どうしてHSPWikiを使わなかったのか思い出しました。所有権がHSPWiki側に渡ってしまうので自由にライセンスを決められなくなってしまうからでした。
HSPWikiについて
http://quasiquote.org/hspwiki/HSPWiKi%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6
また慌てて書いたので強い口調になりすみません。NYSLで公開しているのでスペースさんが改造してWikiに公開することは問題ありませんが、
自分のをそのまま自分のとして公開されると所有権が自分からHSPWiki側に渡ってしまいNYSLで公開できなくなるかもしれないと思い投稿しました。
どうか編集履歴に残っているのも管理者に問い合わせるか何かを削除してくれませんか。
|
|
2015/9/9(Wed) 11:16:52|NO.71521
>>Noaさん
「HSPWikiについて」のページに、
「このWikiページのコンテンツの所有権は、著作者がHSP-MLに参加しているかどうかに関わりなく、
HSP-MLへ譲渡されるものとします。」と書いていますがHSP-MLのサイトに接続できないので、
このページの管理者はもうHSPwikiを放置状態なのではないでしょうか。
|
|
2015/9/9(Wed) 11:24:57|NO.71523
連投すみません。
>>このスレッドで公開したマクロおよびモジュールについては別途明示していない限りNYSL 0.9982
この文章を読み、「NYSL 0.9982」がNoaさんのホームページ名か何かだと思ったのですが、
ライセンス名だったんですね。勘違いをしていました。
|
|
2015/9/9(Wed) 11:37:13|NO.71524
確かになくなっていますがだれもそのことをいわないのでみんな管理者への連絡方法を知っているのかと勘違いしていました。すみません。
ではHSPWikiはいつなくなってもおかしくない状態なのではないのでしょうか。それと
http://www.kmonos.net/nysl/
はNYSLのライセンス文が公開されているわけであり、わたしはNYSLでわたしのかいたソフトウェアといえるのかも怪しいものをライセンスしているだけであり、またライセンス文をわたしとはそのウェブページは無関係です。
わたしはあんなにすごいソフトをつくれるような人ではありません。
わたしのウェブページはとてもこじんまりしています。
わたしのページ(Noapとなっているのはもともとこの掲示板に書きこむ際にNoaと打ち間違えてそのままその名前で書いているためです)
http://nopswebpages.webcrow.jp/apps/
NYSLのFAQ( http://www.kmonos.net/nysl/faq.html)をみればわかりますが
NYSLで公開されていても他人のつくったものを改造せずに「そのまま」自分のとすることはできません。改造したのであれば自分のと主張できます。つまりスペースさんが少し書き換えてスペースさんのものとしてHSPWikiに公開するのは完全に個人の自由なのでスペースさんの自由ですが、わたしの書いたものをそのまま改造せずにわたしのとして公開することはわたしが所有権をHSPWikiに渡すことになるのでそれはどうしてもいやだと思ったのです。HSPWikiで公開するのであればURLで記載してほしいです。
またもし仮にURLを記載する際はわたしが書いたなかでもできるだけ独創的なのをえらんでください。スペースさんが削除する前にすでに同じような記事があるとしてscanfとprintfは削除されていました。
HSPWikiの規約の解釈に間違いがあるかもしれません。間違っていれば教えてください。
|
|
2015/9/9(Wed) 13:13:03|NO.71530
ライセンス表記が分かりにくくてすみません。ホームページで公開しているソフトのライセンス表記も勘違いしないよう修正しておきました。
またホームページは移転したのでいままでGoogle Driveにアップロードしたファイルは削除しました。
わたしが議論ばかりになってすみません。
改めて
スレッド「少し便利になるモジュール」(URL: http://hsp.tv/play/pforum.php?mode=all&num=70762)にてわたしが公開したスクリプトは別途明示していない限り
NYSL 0.9982のライセンスの下で公開いたします。
(注意: NYSLはライセンスの名称であり、NYSLのウェブサイトとわたしは全くの無関係です。NYSLに関することはNYSLのウェブサイト( http://www.kmonos.net/nysl/)に行ってください。)
|
|
2015/9/9(Wed) 19:09:10|NO.71541
NYSLについて
個人的にNYSLは結構有名なライセンスだと思っていました。(Yahoo! JAPANで検索したら意外と少なかったです)(このスレッドの中でもFlatさんがバージョンの明記はありませんでしたがNYSLを使っていました)
またもし仮に知らなくてもNYSLの筆者はグーグルのエンジニアでNoahという圧縮展開ソフトの作者なので、まさかわたしのような素人とNYSLの筆者が混同されることはないだろうと思っており、ライセンスの表記がややあいまいになってしまっていたことをあやまります。
おそらくNoaという掲示板上の名前がNoahと似ていたので混同されてしまったと思うので以降NoaではなくNoapの名前にさせていただきます。(もともとNoaはNoapの打ち間違いでした)
著作権について
またHSPWikiの規約ですがよく考えてみればそもそもわたしはNYSLというライセンスの中で著作権を放棄しているため当然だれがそのNYSLでライセンスされたスクリプトを書き込んだとしても、著作物の財産権をHSP-MLに譲渡するということはできず、ここで規約に矛楯が発生します。
よって矛楯が発生するのでそもそもHSPWikiの規約ははたして「効力をもつのか」が疑問です。いずれにしても譲渡ができないので別にHSPWikiに書きこまれてもNYSLで配布し続けられると思います。この点についてさきほどあやまった考えを記してしまいすみません。
あなたが名前を変えるなどして「少しでも変更」すればそれは「あなた」の著作物となるためそれはHSP-ML側に「あなたのその変更したスクリプト」に対する著作物の財産権を譲渡するということに「あなた」が同意されるのであればそれはHSPWikiに書きこめるということになると思います。
さきほど「消してください」と書いたのはその時は感情的になり書いてしまったので言葉遣いが不適切な面もあると思うので反省していますが私はNYSLというライセンスのなかで著作権を放棄しているためそもそも譲渡なんかできないので書き込むことはできないというです。
おそらくHSPWikiが活用されていないのは管理者への連絡が取れず、またこのように著作権に関する規約があやふやなことによるものではと考えます。
さきほどまでやや感情的になり書きこんだことをあやまります。
またこの投稿のなかでここまで書きこんだことはすべてわたしがNYSLで公開したスクリプトが著作権や著作者人格権が発生するようなものであると仮定したうえでのことですので、そんな著作権や著作者人格権が発発生するほどようなものでもない特徴的で独創的でもないスクリプトであればあなたのとして投稿でいることになります。
以上何かまちがいがあればごめんなさい。
参考
http://www.cric.or.jp/qa/hajime/hajime2.html
http://chosakuken.bunka.go.jp/naruhodo/outline/5.html
----------------------------
//アナログ時計
//NYSL 0.9982のライセンスの下で公開します
//(注意: NYSLはライセンスの名称であり、NYSLのウェブサイトとこのサイトは全くの無関係でありわたしが勝手に自分のソフトをNYSLでライセンスしているだけです)
#define HOURHAND 40.0//短針の長さ
#define MINUHAND 70.0//長針の長さ
#define SECOHAND 70.0//秒針の長さ
#define HOUR time.0
#define MINUTE time.1
#define SECOND time.2
#define NOON time.3//0=午前 1=午後
#define CLOCKX 100.0//時計の中心
#define CLOCKY 100.0//時計の中心
#define CLOCKLEN 180//時計の縦の長さ
#define SIGN1 10.0//周りの線の長さ
#define SIGN2 1.0//周りの線の長さ
#define WM_TIMER $00000113//一定の時間ごとにウィンドウに来るメッセージ
#define SW_SHOW 5
#define SW_HIDE 0
#uselib "user32.dll"
#func SetTimer "SetTimer" int,int,int,sptr//タイマー
#func KillTimer "KillTimer" int,int
#packopt hide 1
gsel 0,-1
dim time,4
width 200,200
SetTimer hwnd , 1 , 1000 , 0
cls
onexit *owari
oncmd gosub *jikandasu, WM_TIMER
gosub *jikandasu
gsel 0,1
stop
*jikandasu
color 255,255,255
boxf
color 0,0,0
repeat 12
line CLOCKX+MINUHAND*cos(deg2rad(90-cnt*30)),CLOCKY-MINUHAND*sin(deg2rad(90-cnt*30)),CLOCKX+(SIGN1+MINUHAND)*cos(deg2rad(90-cnt*30)),CLOCKY-(SIGN1+MINUHAND)*sin(deg2rad(90-cnt*30))//周りの線を
loop
repeat 60
if cnt\5>0:line CLOCKX+MINUHAND*cos(deg2rad(90-cnt*6)),CLOCKY-MINUHAND*sin(deg2rad(90-cnt*6)),CLOCKX+(SIGN2+MINUHAND)*cos(deg2rad(90-cnt*6)),CLOCKY-(SIGN2+MINUHAND)*sin(deg2rad(90-cnt*6))//周りの線を
loop
HOUR=gettime(4)
MINUTE=gettime(5)
SECOND=gettime(6)
if HOUR>=12{
NOON=1//午後
HOUR-=12
}else{
NOON=0//午前
}
color 0,0,0
line CLOCKX,CLOCKY,CLOCKX+HOURHAND*cos(deg2rad(90-(HOUR*30+MINUTE/2))),CLOCKY-HOURHAND*sin(deg2rad(90-(HOUR*30+MINUTE/2)))//短針
line CLOCKX,CLOCKY,CLOCKX+MINUHAND*cos(deg2rad(90-(MINUTE*6+SECOND/10))),CLOCKY-MINUHAND*sin(deg2rad(90-(MINUTE*6+SECOND/10)))//長針
color 255,0,0
line CLOCKX,CLOCKY,CLOCKX+SECOHAND*cos(deg2rad(90-SECOND*6)),CLOCKY-SECOHAND*sin(deg2rad(90-SECOND*6))//秒針
pos 0,CLOCKLEN
color 0,0,0
if NOON=0:mes "午前"+HOUR+"時"+MINUTE+"分"+SECOND+"秒"
if NOON=1:mes "午後"+HOUR+"時"+MINUTE+"分"+SECOND+"秒"
title strf("%02d",HOUR+NOON*12)+":"+strf("%02d",MINUTE)+":"+strf("%02d",SECOND)
return
*owari
KillTimer hwnd,1//さくじょしなくてよかった気もするけどさくじょしておく
end
----------------------------
NYSL 0.9982 ライセンス文
NYSLのウェブサイト http://www.kmonos.net/nysl/
注意: NYSLはライセンスの名称であり、NYSLのウェブサイトとこのウェブサイトは全くの無関係です
NYSLに関することはNYSLのウェブサイト( http://www.kmonos.net/nysl/)に行ってください
あなたが使う場合は「著作者人格権は Noa に帰属します。」の「Noa」の部分をあなたの名前に書き換えてお使いください。
ライセンス文自体はCC0( http://creativecommons.org/publicdomain/zero/1.0/)の下で公開されています
-----ライセンス文始まり-----
A. 本ソフトウェアは Everyone'sWare です。このソフトを手にした一人一人が、
ご自分の作ったものを扱うのと同じように、自由に利用することが出来ます。
A-1. フリーウェアです。作者からは使用料等を要求しません。
A-2. 有料無料や媒体の如何を問わず、自由に転載・再配布できます。
A-3. いかなる種類の 改変・他プログラムでの利用 を行っても構いません。
A-4. 変更したものや部分的に使用したものは、あなたのものになります。
公開する場合は、あなたの名前の下で行って下さい。
B. このソフトを利用することによって生じた損害等について、作者は
責任を負わないものとします。各自の責任においてご利用下さい。
C. 著作者人格権は Noa に帰属します。著作権は放棄します。
D. 以上の3項は、ソース・実行バイナリの双方に適用されます。
------ライセンス文終わり-----
| |
|
2015/9/9(Wed) 19:45:28|NO.71543
HSPWikiの規約と質問を見ると
ボランティア的な著作権者(著作権を主張する気もない)の代理とし
て所有権を保持する目的の様です。平たく言えば一次配布先はココだ
と明示するための所有権で、悪意を持った利用を制限するための所有
権と言えます。
オレが作ったんだから他に転載するのもオレの自由だろ?と言う理屈
はもっともですが、一次配布元として所有権を渡した以上は本人だろ
うが流用する時は一次配布元を明記する必要が有ると言う事です。
そういう意味では Noa さんの様に、明らかに一次配布元がある物を更
に一次配布元への転載はおかしな事になり、どちらかを消さなければ
なりません。
法律って正確に解釈しようとすると難しいね!
個人で使う分には難しく考える必要は有りませんが、公開を前提とした
場合は引用や参照したサイト・資料の条件を良く読むのは大切です。
------------------------------------------------
>>HSP-MLのサイトに接続できないので・・・もうHSPwikiを放置状態
接続出来なくても所有権は消えません、許可を得る代替手段として「転
載元を明記」と書かれていますよ?。著作権者にも所有者にも連絡出来
ないけど、これだけ書いておけば何でもOKと言う事です。
HSPWikiの管理人(代表?)は iwata さんになるのかな?
|
|
2015/9/9(Wed) 20:00:47|NO.71545
書き忘れた!
今までの経験上、レスが多くなると段々主旨「少し便利に成るモジュール」
から外れてきます。(良いかどうかはスレ主の判断ですが・・・。)
|
|
2015/9/9(Wed) 20:38:02|NO.71549
KAさん、そうです。その通りです。そもそもNYSLで著作権を放棄しているので譲渡はできませんし、HSPWikiに書きこむ場合はそこが第一次配布場場所になるので自分のホームページで公開している場合はホームページを転載先とするかもしくはどちらかを消さなければならない。その通りです。
自分でかいていてよく分からなくなってきていたのでまとめてうれてありがとうございます。
そこで「HSPWiKi:管理の履歴」は2009年で止まっていますが放置されていないということであればたのんで編集履歴を消してくれませんか。消したとはいえ編集履歴からみられるのはなにかイヤです。
|
|
2015/9/9(Wed) 20:48:37|NO.71553
訂正
>注意: NYSLはライセンスの名称であり、NYSLのウェブサイトとこのウェブサイトは全くの無関係です
「注意: NYSLはライセンスの名称であり、NYSLのウェブサイトとわたしは全くの無関係です」のまちがいです。(このウェブサイトではなくわたし)
>まとめてうれて
「訂正してくれて」の間違い
|
|
2015/9/9(Wed) 22:41:30|NO.71558
ええーと、自分の意見を率直に言うと煙たがられるので話に合わせ
つつポイントを書いたつもりでしたが諦めました。
1:スレタイと無関係(微関係かな?)のレスの多さ。
2:それにより元々の趣旨が失われる?
3:第三者がスレタイに興味津々で見てみたが・・・・。
熱弁を交わしても、所詮いつか過去ログ行きです。
後々の事を考えたら、議論は議論で新たなスレでして下さい。
以上、このスレでの私の書き込みは終わりにします。
|
|
2015/9/10(Thu) 00:18:13|NO.71559
文字コード判定用モジュール。
/***************************************************************
■ cc_CheckCode(変数バッファ, バッファサイズ) = 文字コード値
変数バッファに格納されたテキストデータの文字コードを判定します。
・バッファサイズ 変数バッファのデータサイズを指定します。
・文字コード値 以下の値で文字コードの判定結果を示します。
0:バイナリファイル
2:ASCII (半角英数字のみ)
3:JIS (iso-2022-jp)
4:Shift-JIS
5:EUC-JP
6:UTF-8
7:UTF-7
8:UnicodeBE (UTF-16BE)
9:Unicode (UTF-16LE)
10:UTF-32BE
11:UTF-32LE
※変換はIMultiLanguage等で別途ご用意下さい。
***************************************************************/
#module _mod_charcode
#ifndef xDim
#uselib "kernel32.dll"
#func _VirtualProtect "VirtualProtect" var,int,int,var
#deffunc xDim array p0, int p1, local a
Dim p0,p1 :Dim a :_VirtualProtect p0,p1<<2,$40,a :If(stat==0){Dialog "failed xDim",1} :Return stat
#endif
;--文字コード判定(buf,size,flgNoBinary) = CharCode
; 0:BINARY 2:ASCII 3:JIS
; 4:Shift-JIS 5:EUC 6:UTF-8 7:UTF-7
; 8:UTF-16BE 9:UTF-16LE 10:UTF-32BE 11:UTF-32LE
#defcfunc cc_CheckCode var p0, int p1, int p2, local a, local fnc_chkCharCode
a=varptr(p0),p1,p2 :xDim fnc_chkCharCode,311
fnc_chkCharCode. 0=$83EC8B55,$C033D8C4,$558DC933,$575653F8,$C6D85D8D,$C602FF45,$8900FE45,$4D8AF045
fnc_chkCharCode. 8=$01F98310,$1BF44D8D,$88D8F7C0,$C0331045,$C70001C6,$00000103,$C3834000,$F8834104
fnc_chkCharCode. 16=$8BED7204,$4D8B0845,$89C103F0,$458BE845,$0C453BF0,$042F830F,$C0330000,$2B0C4D8B
fnc_chkCharCode. 24=$5589F04D,$E85D8BEC,$C83BF38B,$1E8A0476,$FFB302EB,$88EC7D8B,$45FF401F,$F88346EC
fnc_chkCharCode. 32=$FFE77206,$45FFF045,$8DC033E8,$4D8DD85D,$003980F4,$3B830774,$FE027400,$C3834009
fnc_chkCharCode. 40=$F8834104,$83EA7203,$7501F07D,$EF3A8061,$7A801075,$0A75BB01,$BF027A80,$45C60475
fnc_chkCharCode. 48=$3A8006FF,$801775FF,$75FE017A,$027A8011,$C0940F00,$0301E083,$88090CC0,$028AFF45
fnc_chkCharCode. 56=$7501420A,$027A8010,$800A75FE,$75FF037A,$FF45C604,$FE3A800A,$7A800A75,$0475FF01
fnc_chkCharCode. 64=$08FF45C6,$02FF7D80,$037B850F,$45F60000,$327401F0,$75003A80,$01428A14,$0D72063C
fnc_chkCharCode. 72=$09777E3C,$08FF45C6,$00035CE9,$017A8000,$8A137500,$72063C02,$777E3C0D,$FF45C609
fnc_chkCharCode. 80=$0343E909,$4D8B0000,$03E183F0,$7501F983,$0A028A3D,$420A0142,$80157502,$7206037A
fnc_chkCharCode. 88=$037A800F,$C609777E,$E90AFF45,$00000319,$0A034A8A,$4A0A014A,$80137502,$0E72063A
fnc_chkCharCode. 96=$777E3A80,$FF45C609,$02FBE90A,$7D800000,$17740010,$033C028A,$7F3C0872,$FF3C0474
fnc_chkCharCode.104=$45C60975,$DEE900FF,$80000002,$66751B3A,$26017A80,$7A800A75,$04754002,$03FF45C6
fnc_chkCharCode.112=$24017A80,$7A802D75,$06744002,$42027A80,$45C60475,$7A8003FF,$17752802,$3C03428A
fnc_chkCharCode.120=$3C0C7444,$3C08744F,$3C047450,$C6047551,$8003FF45,$7528017A,$02428A13,$0874423C
fnc_chkCharCode.128=$0474493C,$04754A3C,$03FF45C6,$03FF7D80,$0273840F,$7D800000,$137502FF,$1B3C028A
fnc_chkCharCode.136=$7F3C0474,$45C60976,$C93304FF,$83E44D89,$7400E47D,$7F3A8064,$C0330776,$EBE44589
fnc_chkCharCode.144=$F77D8058,$803A7400,$06752D3A,$00F745C6,$3A8038EB,$8023722B,$05722C3A,$762E3A80
fnc_chkCharCode.152=$3A3A8019,$3A800572,$800F7640,$05725B3A,$76603A80,$7A3A8005,$C9331076,$EBE44D89
fnc_chkCharCode.160=$2B3A8009,$45C60475,$7D8301F7,$097400E4,$00F77D80,$45FF0374,$803A80E4,$FDA1820F
fnc_chkCharCode.168=$7D80FFFF,$787500F4,$813C028A,$9F3C0472,$DF3C0476,$7A802D76,$06724001,$7E017A80
fnc_chkCharCode.176=$7A800C76,$31728001,$FC017A80,$45C62B77,$C93302F4,$83FE4D8A,$4D0101E1,$FE4D80D8
fnc_chkCharCode.184=$C616EB01,$3301F445,$FE458AC0,$8301E083,$450101F0,$FE6580D8,$F47D8006,$800F7400
fnc_chkCharCode.192=$0A74803A,$74A03A80,$FC3A8005,$C9330A75,$FED84D89,$08EBF445,$458AC033,$D84501F4
fnc_chkCharCode.200=$00F57D80,$0098850F,$3A800000,$8A21758E,$A13C0142,$DF3C1A72,$45C61677,$C93302F5
fnc_chkCharCode.208=$83FE4D8A,$F18302E1,$DC4D0102,$05FE6580,$758F3A80,$01428A2B,$2472A13C,$2077FE3C
fnc_chkCharCode.216=$3C02428A,$3C1972A1,$C61577FE,$3303F545,$FE4D8AC9,$E183F9D1,$DC4D0101,$02FE4D80
fnc_chkCharCode.224=$A13C028A,$FE3C2472,$428A2077,$72A13C01,$77FE3C19,$F545C615,$8AC93302,$F9D1FE4D
fnc_chkCharCode.232=$0101E183,$4D80DC4D,$7D8002FE,$0A7400F5,$458AC033,$DC4501F5,$C93308EB,$FEDC4D89
fnc_chkCharCode.240=$7D80F545,$850F00F6,$000000B1,$C03C028A,$008F820F,$FD3C0000,$0087870F,$E03C0000
fnc_chkCharCode.248=$02B90773,$EB000000,$F03A8029,$03B90773,$EB000000,$F83A801D,$04B90773,$EB000000
fnc_chkCharCode.256=$FC3A8011,$05B90773,$EB000000,$0006B905,$01B80000,$3B000000,$801576C8,$7280023C
fnc_chkCharCode.264=$023C8006,$330476BF,$4005EBC0,$EB77C83B,$3174C085,$83F64D88,$177502F9,$4D8AC933
fnc_chkCharCode.272=$02F9C1FE,$8301E183,$4D0101F1,$FE6580E0,$3312EB03,$FE458AC0,$8302F8C1,$450101E0
fnc_chkCharCode.280=$FE4D80E0,$F67D8004,$330A7400,$F64D8AC9,$EBE04D01,$89C03308,$45FEE045,$F04D8BF6
fnc_chkCharCode.288=$0F0C4D3B,$FFFBD182,$FF7D80FF,$8B297504,$553BDC55,$8B1076E0,$453BDC45,$B20476D8
fnc_chkCharCode.296=$3312EB01,$8B0EEBD2,$453BD845,$330476E0,$B202EBD2,$FF550802,$02FF7D80,$458B0F75
fnc_chkCharCode.304=$05E8C10C,$73E4453B,$FF45C604,$8AC03307,$5E5FFF45,$5DE58B5B,$00000CC2
Return CallFunc(a,varptr(fnc_chkCharCode),3)
#global
ご利用・転載・改変・再配布・「俺が作った」等、自己責任においてご自由にどうぞ。
判定精度はそれなりだと思います。
| |
|
2015/9/10(Thu) 20:08:31|NO.71567
著作権についてのことに熱中して迷惑をかけました。すみません。以後迷惑をかけないようにします。
EUC-JPをSHiftJISに変換するモジュール
//eucenc p1,p2,p3,p4,p5
//p1=変数 : 変換結果が代入される文字列型変数
//p2=変数 : 変換元の文字列が代入されている文字列型変数
//p3=0~1(0) : 0=実際に変換する 1=変換した場合の長さだけを求める
//p4=0~(0) : 変換結果が代入される文字列型変数のバッファーサイズ(p4<=0の場合自動拡張される)
//p5=0~(0) : 変換元の文字列の長さ(p5<=0の場合NULLまでが処理される)
//処理後statに変換後の文字列の長さが返されます
//NYSL 0.9982のライセンスの下で公開します
//(注意: NYSLはライセンスの名称であり、NYSLのウェブサイトとこのソフトは全くの無関係でありわたしが勝手に自分のソフトをNYSLでライセンスしているだけです)
#module
#deffunc eucjpenc var ato, var mae, int mode, int atosize, int maesize, local i, local j, local maesizev, local tmp, local ttmp
if maesize<=0{
maesizev=strlen(mae)
}else{
maesizev=maesize
}
j=0
for i,0,maesizev
tmp=peek(mae,i)
if i<maesizev-1{
ttmp=peek(mae,i+1)
//半角カタカナ
if tmp==$8e{
if ttmp>=$a1 & ttmp<=$df{
if atosize>0{
if j>=atosize : _break
}else{
if mode==0{
memexpand ato,j+2
poke ato,j+1,0
}
}
if mode==0 : poke ato,j,ttmp
j++
_continue
}
}
//全角文字
if tmp>=$a1{
if tmp<=$fe{
if ttmp>=$a1 & ttmp<=$fe{
tmp-=$80
ttmp-=$80
if tmp\2==0{
tmp=tmp/2+$70
ttmp+=$7d
}else{
tmp=(tmp+1)/2+$70
ttmp+=$1f
}
if tmp>=$a0 : tmp+=$40
if ttmp>=$7f : ttmp++
if atosize>0{
if j>=atosize-1 : _break
}else{
if mode==0{
memexpand ato,j+3
poke ato,j+2,0
}
}
if mode==0{
poke ato,j,tmp
poke ato,j+1,ttmp
}
i++ : j+=2
_continue
}
}
}
}
//その他の文字(ASCIIなど)
if atosize>0{
if j>=atosize : _break
}else{
if mode==0{
memexpand ato,j+2
poke ato,j+1,0
}
}
if mode==0 : poke ato,j,tmp
j++
next
return j
#global
ダウンロード: http://nopswebpages.webcrow.jp/apps/eucjpenc.txt
| |
|
2015/9/10(Thu) 20:26:26|NO.71569
とうとうここも120個目に・・・
|
|
2015/9/10(Thu) 22:57:12|NO.71582
音声の入力デバイスの一覧を取得するサンプル
#uselib "winmm.dll"
#cfunc waveInGetNumDevs "waveInGetNumDevs"
#func waveInGetDevCaps "waveInGetDevCapsA" int,var,int
#define SHORTINTSIZE 2
#define INTSIZE 4
#define POINTERSIZE 4
#define MAXPNAMELEN 32
//WAVEINCAPS構造体
#define wMid 0
#define wPid SHORTINTSIZE
#define vDriverVersion (SHORTINTSIZE*2)
#define szPname (SHORTINTSIZE*2+INTSIZE)
#define dwFormats (SHORTINTSIZE*2+INTSIZE+MAXPNAMELEN)
#define wChannels (SHORTINTSIZE*2+(INTSIZE*2)+MAXPNAMELEN)
#define wReserved1 (SHORTINTSIZE*3+(INTSIZE*2)+MAXPNAMELEN)
#define WAVEINCAPSSIZE (SHORTINTSIZE*4+(INTSIZE*2)+MAXPNAMELEN)
sdim debaisujouhou,WAVEINCAPSSIZE
debaisukazu=waveInGetNumDevs()
sdim debaisunamae,MAXPNAMELEN
mes "入力デバイスは"+debaisukazu+"こあります\n"
repeat debaisukazu
waveInGetDevCaps cnt,debaisujouhou,WAVEINCAPSSIZE
memcpy debaisunamae,debaisujouhou,MAXPNAMELEN,,szPname
mes debaisunamae
loop
|
|
2015/9/11(Fri) 16:04:04|NO.71590
しばらく前にtds12様に作っていただいた、データベースへの複数同時接続可能モジュールが
あんまりにも便利すぎるのでこちらにも。hspdb.dllがいらんくなります。( ゚ω゚ )
私が追記したコマンドもケツにちょこっとあり。
#ifndef _MOD_CEZDB_AS_
#define _MOD_CEZDB_AS_
#module MOD_CEZDB flag,henv,hdbc,hstmt,ResultOut,StringOut,sepchr
#define SQL_SUCCESS 0
#define SQL_NTS $FFFFFFFD
#define SQL_DRIVER_COMPLETE_REQUIRED $00000003
#define SQL_DRIVER_NOPROMPT $00000000
#define SQL_DROP $00000001
#define SQL_SUCCESS_WITH_INFO $00000001
#define SQL_C_CHAR $00000001
#uselib "odbc32.dll"
#cfunc SQLAllocEnv "SQLAllocEnv" int
#cfunc SQLAllocConnect "SQLAllocConnect" int,int
#cfunc SQLAllocStmt "SQLAllocStmt" int,int
#cfunc SQLDriverConnect "SQLDriverConnect" int,int,int,int,int,int,int,int
#cfunc SQLExecDirect "SQLExecDirect" int,int,int
#cfunc SQLFetch "SQLFetch" int
#cfunc SQLNumResultCols "SQLNumResultCols" int,int
#cfunc SQLGetData "SQLGetData" int,int,int,int,int,int
#func SQLDisconnect "SQLDisconnect" int
#func SQLFreeEnv "SQLFreeEnv" int
#func SQLFreeConnect "SQLFreeConnect" int
#func SQLFreeStmt "SQLFreeStmt" int,int
#uselib "msvcrt.dll"
#cfunc cstrlen "strlen" int
#define CEZDB_MODE_NONE 0
#define CEZDB_MODE_ERROR 1
#define CEZDB_MODE_ENVREADY 2
#define CEZDB_MODE_DBCREADY 3
#define CEZDB_MODE_SQLFETCH 4
#define CEZDB_MODE_MAX 5
#define CEZDB_OUTBUFSIZE 1024
#modinit
res = 0
flag = CEZDB_MODE_NONE
henv = 0
StringOut = ""
ResultOut = ""
sepchr = ','
res = SQLAllocEnv(varptr(henv))&$ffff
if res != SQL_SUCCESS{
flag = CEZDB_MODE_ERROR
return
}
sdim StringOut,CEZDB_OUTBUFSIZE
sdim ResultOut,CEZDB_OUTBUFSIZE
flag = CEZDB_MODE_ENVREADY
mref tmpownid,2
ownid = tmpownid
dim tmpownid
exist "mod_db2_err.log"
if strsize = -1 {
txt = "// mod_db2 errorlog\n"
bsave "mod_db2_err.log", txt, strlen(txt)
}
return ownid
#modterm
cezdb_Disconnect thismod
if henv != 0{
SQLFreeEnv henv
henv = 0
}
sdim StringOut
sdim ResultOut
flag = CEZDB_MODE_NONE
return
#modcfunc cezdb_Connect str _dsn,int mode
dsn = _dsn
res = 0
if flag != CEZDB_MODE_ENVREADY:return -1
res = SQLAllocConnect(henv,varptr(hdbc))&$ffff
if res != SQL_SUCCESS{
flag = CEZDB_MODE_ERROR
return -2
}
switch mode
case 1
res = SQLDriverConnect(hdbc,0,varptr(dsn),SQL_NTS,varptr(StringOut),CEZDB_BUFSIZE,0,SQL_DRIVER_COMPLETE_REQUIRED)&$ffff
swbreak
default
res = SQLDriverConnect(hdbc,0,varptr(dsn),SQL_NTS,varptr(StringOut),CEZDB_BUFSIZE,0,SQL_DRIVER_NOPROMPT)&$ffff
swbreak
swend
if res != SQL_SUCCESS{
SQLFreeConnect hdbc
flag = CEZDB_MODE_ERROR
return -3
}
flag = CEZDB_MODE_DBCREADY
return 0
#modfunc cezdb_Disconnect
if flag >= CEZDB_MODE_DBCREADY{
if flag == CEZDB_MODE_SQLFETCH:SQLFreeStmt hstmt,SQL_DROP
SQLDisconnect hdbc
SQLFreeConnect hdbc
flag = CEZDB_MODE_ENVREADY
}
return
#modcfunc cezdb_SendSQL str _pstr
pstr = _pstr
res = 0
if flag != CEZDB_MODE_DBCREADY:return -1
res = SQLAllocStmt(hdbc,varptr(hstmt))&$ffff
if res != SQL_SUCCESS{
return -2
}
res = SQLExecDirect(hstmt,varptr(pstr),SQL_NTS)&$ffff
if (res != SQL_SUCCESS)&&(res != SQL_SUCCESS_WITH_INFO){
return -3
}
flag = CEZDB_MODE_SQLFETCH
return 0
#modcfunc cezdb_GetResult var buf,int size
res = 0
leftsize = 0
column = 0
maxcol = 0
sz = 0
len = 0
if flag != CEZDB_MODE_SQLFETCH:return -1
res = SQLFetch(hstmt)&$ffff
if (res != SQL_SUCCESS)&&(res != SQL_SUCCESS_WITH_INFO){
SQLFreeStmt hstmt,SQL_DROP
flag = CEZDB_MODE_DBCREADY
return -2
}
column = 1
res = SQLNumResultCols(hstmt,varptr(maxcol))&$ffff
if res != SQL_SUCCESS:maxcol = 1
leftsize = size
p = varptr(buf)
poke buf,p - varptr(buf),0
repeat -1
if column > maxcol:break
if leftsize < 1:break
res = SQLGetData(hstmt,column,SQL_C_CHAR,p,leftsize,varptr(len))&$ffff
if (res != SQL_SUCCESS)&&(res != SQL_SUCCESS_WITH_INFO):break
column++
len = cstrlen(p)
p + len
leftsize - len
if leftsize < 1:break
poke buf,p - varptr(buf),sepchr
p++
leftsize--
loop
poke buf,p - varptr(buf),0
sz = cstrlen(varptr(buf))
if sz{
if peek(buf,sz - 1) == sepchr:poke buf,sz - 1,0
}
return sz
#modcfunc cezdb_GetResultBuffer
if cezdb_GetResult(thismod,ResultOut,CEZDB_OUTBUFSIZE) < 0:return ""
return ResultOut
#modcfunc cezdb_GetMode
return flag
#modfunc cezdb_SetSeparator int chr
sepchr = chr
return
#global
#endif
#ifndef _MOD_HSPDB_AS_
#define _MOD_HSPDB_AS_
#module MOD_HSPDB
#define CEZDB_MODE_NONE 0
#define CEZDB_MODE_ERROR 1
#define CEZDB_MODE_ENVREADY 2
#define CEZDB_MODE_DBCREADY 3
#define CEZDB_MODE_SQLFETCH 4
#define CEZDB_MODE_MAX 5
#deffunc dbclear onexit
if vartype(db) == vartype("struct"){
foreach db
delmod db(cnt)
loop
}
return
#defcfunc dbini
newmod db,MOD_CEZDB
dbid = stat
if cezdb_GetMode(db(dbid)) == CEZDB_MODE_ERROR:return -1
return dbid
#deffunc dbbye int _dbid
if varuse(db(_dbid)) != 0:delmod db(_dbid)
return 0
#deffunc dbopen int _dbid,str ep1,int ep2
res = cezdb_Connect(db(_dbid),ep1,ep2)
return res
#deffunc dbclose int _dbid
cezdb_DisConnect db(_dbid)
return 0
#deffunc dbstat int _dbid
return -cezdb_GetMode(db(_dbid))
#deffunc dbsend int _dbid,str ep1
res = cezdb_SendSQL(db(_dbid),ep1)
if res {
buf = "" : bload "mod_db2_err.log", buf
a1 = str(gettime(0))
a2 = "00"+str(gettime(1)) : a2 = strmid(a2,-1,2)
a3 = "00"+str(gettime(3)) : a3 = strmid(a3,-1,2)
a4 = "00"+str(gettime(4)) : a4 = strmid(a4,-1,2)
a5 = "00"+str(gettime(5)) : a5 = strmid(a5,-1,2)
a6 = "00"+str(gettime(6)) : a6 = strmid(a6,-1,2)
buf += a1+"-"+a2+"-"+a3+" "+a4+":"+a5+":"+a6+" ["+str(_dbid)+"] "+ep1+"\n"
bsave "mod_db2_err.log", buf, strlen(buf)
}
return res
#deffunc dbgets int _dbid,var p1,int size
poke p1,0,0
i = cezdb_GetResult(db(_dbid),p1,size)
if i < 0:return i
return 0
#deffunc dbspchr int _dbid,int p1
cezdb_SetSeparator db(_dbid),p1
return 0
; (´ω`)が追記
#deffunc dbfetch int hdl
handle = hdl : result = ""
repeat
sdim row, 32768
dbgets handle, row, 32768
fl = stat
result += row + "\n"
if fl!=0 {
break
}
loop
return result
#global
#endif
//複数同時接続データベースモジュール
//使い方
// hspdbとほぼ同じように使うことができます。
//hspdbと異なる点
// dbini命令が関数となり、
// その戻り値を他の命令の第1引数に指定しなければならない。
// これにより、複数のデータベースへ同時に接続できる。
// dbgets命令に引数の変更がある。
// 第3引数にバッファのサイズを指定しなければならない。
// (´ω`)追記
// dbfetch はフェッチ用コマンドです。
// refstrに直前に実行したSQLの結果が戻ります。
| |
|
2015/9/11(Fri) 17:25:56|NO.71591
データベースへの複数同時接続可能モジュールって調べてみたら
自由に使ってくださいとはありましたが転載は許可してないような気がします。
(そもそもこれを転載というのかどうか)
改造はいいとしてもここに載せてよかったのでしょうか?
|
|
2015/9/11(Fri) 21:07:32|NO.71594
tds12さんの投稿のURLを書いておくのが一番確実ではないでしょうか
ふとC言語のランタイムでファイルサイズを取得してみました
exist2で使い方はexistと同じです。
特に使い道はありません。
#module
#uselib "crtdll.dll"
#func _fstat "_fstat" sptr,var
#cfunc _open "_open" str,int
#cfunc _fdopen "_fdopen" sptr,str
#func _close "_close" sptr
#define O_RDONLY $00000000
#deffunc exist2 str p1, local tmp, local fp, local fd
dim tmp,8
fd=_open(p1,O_RDONLY)
if fd==-1: return -1
fp=_fdopen(fd,"rb")//入力ストリーム(しなくても動くみたいだけどこうするらしい)
if fp==0{
_close fd
return -1
}
_fstat fd,tmp//ファイル情報
if stat!=0{
_close fd
return -1
}
_close fd
return tmp.4
#global
|
|
2015/9/11(Fri) 22:12:43|NO.71600
UUIDの生成です。
http://quasiquote.org/hspwiki/UUID%E7%94%9F%E6%88%90
#ifndef __UUID__
#define __UUID__
#uselib "Rpcrt4.dll"
#func global UuidCreate "UuidCreate" sptr
#func global UuidToString "UuidToStringA" sptr, sptr
#func global RpcStringFree "RpcStringFreeA" sptr
#module uuid
#defcfunc uuid_new
sdim uuid, 4+2+2+1*8
sdim string, 39
result = 0
UuidCreate varptr(uuid)
UuidToString varptr(uuid), varptr(result)
dupptr orig, result, 39, 2
repeat 39
poke string, cnt, peek(orig, cnt)
loop
RpcStringFree varptr(result)
return string
#global
#endif
// サンプル
mes uuid_new()
|
|
2015/9/12(Sat) 01:33:09|NO.71604
defineよりconstのほうがよかったかなと思ったので再度
#uselib "winmm.dll"
#cfunc waveInGetNumDevs "waveInGetNumDevs"
#func waveInGetDevCaps "waveInGetDevCapsA" int,var,int
#define SHORTINTSIZE 2
#define INTSIZE 4
#define POINTERSIZE 4
#define MAXPNAMELEN 32
//WAVEINCAPS構造体
#const wMid 0
#const wPid SHORTINTSIZE
#const vDriverVersion (SHORTINTSIZE*2)
#const szPname (SHORTINTSIZE*2+INTSIZE)
#const dwFormats (SHORTINTSIZE*2+INTSIZE+MAXPNAMELEN)
#const wChannels (SHORTINTSIZE*2+(INTSIZE*2)+MAXPNAMELEN)
#const wReserved1 (SHORTINTSIZE*3+(INTSIZE*2)+MAXPNAMELEN)
#const WAVEINCAPSSIZE (SHORTINTSIZE*4+(INTSIZE*2)+MAXPNAMELEN)
sdim debaisujouhou,WAVEINCAPSSIZE
debaisukazu=waveInGetNumDevs()
sdim debaisunamae,MAXPNAMELEN
mes "入力デバイスは"+debaisukazu+"こあります\n"
repeat debaisukazu
waveInGetDevCaps cnt,debaisujouhou,WAVEINCAPSSIZE
memcpy debaisunamae,debaisujouhou,MAXPNAMELEN,,szPname
mes debaisunamae
loop
|
|
2015/9/12(Sat) 10:27:26|NO.71611
元スレのURLを記述しておけば済む話でしたね。
申し訳ありませんでした。(´・ω・`)
|
|
2015/9/13(Sun) 02:56:13|NO.71632
長々と著作権についてを迷惑をかけてしまうほど書いてしまいましたがあれらはあくまでもわたしがなんとか理解しようとした結果なので間違いがあると思うのでもし仮に参考にされる際はうのみにはせず自分で著作権について調べて参考にしてください。
bsaveの改良版のようなもの
bsaveで書きこみに失敗した場合問答無用でエラーになるためつくりました(onerrorで対処できるけど)
#module
//NYSL 0.9982のライセンスの下で公開します
//(注意: NYSLはライセンスの名称であり、NYSLのウェブサイトとこのソフトは全くの無関係でありわたしが勝手に自分のソフトをNYSLでライセンスしているだけです)
//bsave2 p1,p2,p3,p4,p5
//p1="filename" : 保存先のファイル名
//p2=変数 : 保存する変数名
//p3=0~(-1) : セーブするサイズ(Byte単位)
//p4=0~(-1) : ファイルのオフセット
//p5=0~(-1) : ファイルサイズの設定(元のサイズより大きくした際に大きくした分の初期化はしません)
//保存できれば実際には何バイト保存できたかを、保存できなければ-1をstatに返します
//exist2 p1
//ファイルサイズを取得(existと挙動は同じなので使う意味はあまりありません)
//p1="filename" : ファイルサイズを取得したいファイルのファイル名
//ファイルが存在した場合はファイルサイズを、存在しなかったりエラーの場合は-1をstatに返します
//getvarsize(p1)
//文字列型、整数型、もしくは実数型の確保サイズを取得(要素一つ分)
//p1=変数 : 確保されているサイズを知りたい変数
//確保サイズを返します(要素一つ分です) プラグインで拡張された型ならば0が返ります
#uselib "kernel32.dll"
#cfunc CreateFile "CreateFileA" str,int,int,int,int,int,sptr
#func CloseHandle "CloseHandle" sptr
#func SetEndOfFile "SetEndOfFile" sptr
#func SetFilePointer "SetFilePointer" sptr,int,sptr,int
#func WriteFile "WriteFile" sptr,var,int,var,sptr
#define GENERIC_READ $80000000
#define GENERIC_WRITE $40000000
#define CREATE_ALWAYS $00000002
#define OPEN_EXISTING $00000003
#define FILE_ATTRIBUTE_NORMAL $00000080//属性なし - 必ず単独で
#define INVALID_HANDLE_VALUE -1
#define MAX_PATH $00000104
#define FILE_END $00000002
#define FILE_BEGIN 0
#deffunc shuyiyfyubsave2 str filepath1, var buffrsaving, int savebytes, int fileoffset, int fileend, local filehandle, local fileoffsetv, local savedsize, local savebytesv
if savebytes<-1 | fileoffset<-1 | fileend<-1 : return -1
filehandle=CreateFile(filepath1,GENERIC_WRITE,0,0,OPEN_EXISTING,0,0)
fileoffsetv=fileoffset
savebytesv=savebytes
if filehandle==INVALID_HANDLE_VALUE{
if fileoffset==-1{
filehandle=CreateFile(filepath1,GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0)
if filehandle==INVALID_HANDLE_VALUE : return -1
}else{
return -1
}
}
if fileoffsetv==-1 : fileoffsetv=0
if savebytesv==-1 : savebytesv=getvarsize(buffrsaving)
SetFilePointer filehandle,0,0,FILE_END
if stat<fileoffsetv{
CloseHandle filehandle//オフセットがファイルの大きさより大きければ
return -1
}
SetFilePointer filehandle,fileoffsetv,0,FILE_BEGIN
WriteFile filehandle,buffrsaving,savebytesv,savedsize,0
if stat==0{
CloseHandle filehandle//書きこみ失敗
return -1
}
if fileend>=0{
SetFilePointer filehandle,fileend,0,FILE_BEGIN
SetEndOfFile filehandle
if stat==0{
CloseHandle filehandle//サイズ変更失敗
return -1
}
}
CloseHandle filehandle
return savedsize
#deffunc exist2 str filepath2, local filehandle, local filesize
filehandle=CreateFile(filepath2,GENERIC_READ,0,0,OPEN_EXISTING,0,0)
if filehandle==INVALID_HANDLE_VALUE : return -1
SetFilePointer filehandle,0,0,FILE_END
filesize=stat
CloseHandle filehandle
return filesize
#defcfunc getvarsize var varget, local varsizinf, local varsizeptr
if vartype(varget)==vartype("str"){
varsizeptr=varptr(varget)
dupptr varsizinf,varsizeptr-16,4
return varsizinf
}
if vartype(varget)==vartype("int") : return 4
if vartype(varget)==vartype("double") : return 8
return 0
#global
#define bsave2(%1, %2, %3=-1, %4=-1, %5=-1) shuyiyfyubsave2 %1,%2,%3,%4,%5
/*サンプル
a="aaabAaaaa1"
bsave2 dir_desktop+"\\a.txt",a,0
mes stat
exist2 dir_desktop+"\\a.txt"
mes stat
mes a
b=0.0
mes getvarsize(b)
*/
ダウンロード: http://nopswebpages.webcrow.jp/apps/fileload.txt
| |
|
2015/9/13(Sun) 17:52:14|NO.71645
HSP3の掲示板なので不適当かもしれませんが
HSP2でHSP3のようにwinobjのようなものを使えるようにするモジュール
なぜかエディットボックスは作成してもエラーがでてしまうので作成できません
HSP 2.6で作成
#module
#define USER32DL apiptrs.0
#define GetWindowLongptr apiptrs.1
#define SetWindowLongptr apiptrs.1
#define CreateWindowExptr apiptrs.1
#define MoveWindowptr apiptrs.1
#deffunc GetWindowLong int,int//APIのGetWindowLongをHSP2で使えるようにした
dim apiptrs,2
mref tmp0,0 : mref tmp1,1
dim tmp,2
ll_libload USER32DL, "user32.dll"
ll_getproc GetWindowLongptr "GetWindowLongA",USER32DL
tmp.0=tmp0 : tmp.1=tmp1
ll_callfunc tmp,2,GetWindowLongptr//呼び出し
dim tmp2
ll_ret tmp2
ll_libfree USER32DL//解放
mref tmp0,64
tmp0=tmp2
return
#deffunc SetWindowLong int,int,int//APIのSetWindowLongをHSP2で使えるようにした
dim apiptrs,2
mref tmp0,0 : mref tmp1,1 : mref tmp2,2
dim tmp,3
ll_libload USER32DL, "user32.dll"
ll_getproc SetWindowLongptr "SetWindowLongA",USER32DL
tmp.0=tmp0 : tmp.1=tmp1 : tmp.2=tmp2
ll_callfunc tmp,3,SetWindowLongptr//呼び出し
dim tmp3
ll_ret tmp3
ll_libfree USER32DL//解放
mref tmp0,64
tmp0=tmp3
return
#deffunc gethwnd//親ウィンドウのウィンドウハンドルの取得
mref tmp1,67
mref tmp0,64
tmp0=tmp1.13
return
#deffunc getobjhwnd int//オブジェクトのウィンドウハンドル取得
mref gohtmp2,0
mref gohtmp1,67
mref gohtmp0,64
if gohtmp2<0 | gohtmp2>63{
gohtmp0=0
}else{
dim gohtmp3
gohtmp3=41+gohtmp2
gohtmp0=gohtmp1.gohtmp3
}
return
#deffunc gethinstance//インスタンスハンドルの取得
mref tmp1,67
mref tmp0,64
tmp0=tmp1.14
return
#deffunc winobj str,str,int,int,int,int//winobjをHSP2に移植したもの(なぜかエディットボックスではすぐエラーが出てしまう)
dim apiptrs,2
dim tmp,12
gethwnd//ハンドルの取得
tmp.8=stat
gethinstance//インスタンスの取得
tmp.10=stat
mref tmp0,67 : tmp.4=tmp0.27 : tmp.5= tmp0.28//カレントポジションの取得
mref tmp0,2 : mref tmp1,3 : mref tmp2,4 : mref tmp3,5//数字の引き数
mref str1,32 : mref str2,33//文字列の引き数
//引き数の文字列のポインタ
ll_getptr str1 : ll_ret str1ptr
ll_getptr str2 : ll_ret str2ptr
ll_libload USER32DL, "user32.dll"
ll_getproc CreateWindowExptr "CreateWindowExA",USER32DL
tmp.0=tmp0 : tmp.1=str1ptr : tmp.2=str2ptr : tmp.3=tmp1 : tmp.6=tmp2 : tmp.7=tmp3
pos tmp.4,tmp.5+tmp3
ll_callfunc tmp,12,CreateWindowExptr//呼び出し
dim tmp3
ll_ret tmp3
ll_libfree USER32DL//解放
mref tmp0,64
tmp0=tmp3
tmp.0=0
*checkhandle//ハンドルの追加処理
getobjhwnd tmp.0
if stat==0{
dim tmp2
tmp2=41+tmp.0
mref tmp0,67
tmp0.tmp2=tmp3
}else{
tmp.0++
if tmp.0<=63 : goto *checkhandle
}
return
#deffunc MoveWindow int,int,int,int,int,int//APIのMoveWindowをHSP2で使えるようにした
dim tmp,6
dim apiptrs,2
mref tmp0,0 : mref tmp1,1 : mref tmp2,2 : mref tmp3,3 : mref tmp4,4 : mref tmp5,5
tmp.0=tmp0 : tmp.1=tmp1 : tmp.2=tmp2 : tmp.3=tmp3 : tmp.4=tmp4 : tmp.5=tmp5
ll_libload USER32DL, "user32.dll"
ll_getproc MoveWindowptr "MoveWindow",USER32DL
ll_callfunc tmp,6,MoveWindowptr
dim tmp3
ll_ret tmp3
ll_libfree USER32DL//解放
mref tmp0,64
tmp0=tmp3
return
#global
#define GWL_STYLE (-16)
//ウィンドウスタイル
#define WS_CHILDWINDOW $40000000
#define WS_VISIBLE $10000000
#define WS_VSCROLL $00200000//縦スクロールバー
#define WS_HSCROLL $00100000//横スクロールバー
#define ES_AUTOHSCROLL $00000080//横に自動でスクロール
#define ES_AUTOVSCROLL $00000040//縦にに自動でスクロール
#define ES_READONLY $00000800//書き換え禁止
#define ES_MULTILINE $00000004//mesbox化
#define ES_NUMBER $00002000//数字のみを入力できるようにする
#define WS_MINIMIZEBOX $00020000//最小化ボタン
#define WS_MAXIMIZEBOX $00010000//最大化ボタン
#define WS_THICKFRAME $00040000//サイズ可変
//拡張ウィンドウスタイル
#define WS_EX_CLIENTEDGE $00000200//mesboxと同じ縁
*shutai
dim winsizenow,2
dim dummyvar
dim objhandle
sdim buf
screen 2,2500,500,1+4,,,250,500
gethwnd
hwnd=stat
GetWindowLong hwnd,GWL_STYLE
SetWindowLong hwnd,GWL_STYLE,stat | WS_THICKFRAME//サイズ可変にする
pos 20,20
winobj "button","反応しないボタン", WS_EX_CLIENTEDGE , WS_CHILDWINDOW | WS_VISIBLE, winx-20, 40
winobj "button","反応しないボタン2", WS_EX_CLIENTEDGE , WS_CHILDWINDOW | WS_VISIBLE, winx-20, 40
objsize winx-20,winy-300
mesbox buf,,,5,0
winsizenow.0=winx : winsizenow.1=winy
title "x="+winsizenow.0+" y="+winsizenow.1
pos 0,
repeat
getobjhwnd cnt
if stat==0{
mes "オブジェクトは"+cnt+"こです"
break
}
mes "ID="+cnt+" ハンドル="+stat
loop
*ookisamiharu
if winsizenow.0!=winx | winsizenow.1!=winy{
winsizenow.0=winx
winsizenow.1=winy
title "x="+winsizenow.0+" y="+winsizenow.1
getobjhwnd 0
MoveWindow stat,20,20,winx-20,40,1
getobjhwnd 1
MoveWindow stat,20,60,winx-20,40,1
getobjhwnd 2
MoveWindow stat,20,100,winx-20,winy-300,1
}
wait 1
goto *ookisamiharu
| |
|
2015/9/14(Mon) 15:39:59|NO.71663
ウィンドウにマドをつくります
クラシックスタイル風になります
http://nopswebpages.webcrow.jp/apps/madoake.txt
#module
//NYSL 0.9982のライセンスの下で公開します
//(注意: NYSLはライセンスの名称であり、NYSLのウェブサイトとこのソフトは全くの無関係でありわたしが勝手に自分のソフトをNYSLでライセンスしているだけです)
//四角い窓ををウィンドウにつくる
//クラシックモードのようになります
//madoakeru p1,p2,p3,p4
//p1=0~(0) :窓を開ける右上X座標
//p2=0~(0) :窓を開ける右上Y座標
//p3=0~(0) :窓を開ける左下X座標
//p4=0~(0) :窓を開ける左下Y座標
#uselib "user32.dll"
#func SetWindowRgn "SetWindowRgn" sptr,sptr,int
#uselib "gdi32.dll"
#func CreateRectRgn "CreateRectRgn" int,int,int,int
#func DeleteObject "DeleteObject" sptr
#func CombineRgn "CombineRgn" sptr,sptr,sptr,int
#define RGN_AND $00000001
#define RGN_COPY $00000005
#define RGN_OR $00000002
#define RGN_XOR $00000003
#define RGN_DIFF $00000004
#define CLIENTY (ginfo_sizey-ginfo_winy-(ginfo_sizex-ginfo_winx)/2)
#define CLIENTX ((ginfo_sizex-ginfo_winx)/2)
#deffunc madoakeru int windowpositionx1,int windowpositiony1,int windowpositionx2, int windowpositiony2, local regions
dim regions,3
CreateRectRgn 0,0,ginfo_sizex,ginfo_sizey//ウィンドウ全体
regions.0=stat
CreateRectRgn CLIENTX+windowpositionx1,CLIENTY+windowpositiony1,CLIENTX+windowpositionx2,CLIENTY+windowpositiony2//穴の部分
regions.1=stat
CreateRectRgn 0,0,0,0//CombineRgnのためにあらかじめ
regions.2=stat
CombineRgn regions.2,regions.0,regions.1,RGN_DIFF//穴の部分をぽろんととる
SetWindowRgn hwnd,regions.2,1//ウィンドウリージョンを変える
repeat 3
DeleteObject regions.cnt
loop
return
#global
/*サンプル
//ウィンドウメッセージ(通知)
#define WM_CTLCOLORSTATIC $00000138
#define WM_SIZE $00000005//大きさ変更中
#define WM_COMMAND $00000111
#define WM_GETMINMAXINFO $00000024//ウィンドウのサイズ変更をする際のサイズの限界を設定
screen 2,350,380
madoakeru//8でクラシックモードのようにできる
title "昔の家"
screen 0,300,310,screen_fixedsize
madoakeru 100,100,180,180
title "窓つき一戸建て"
screen 1,400,390
madoakeru 0,0,ginfo_winx,ginfo_winy//透明なウィンドウ
title "ガラス張りの家"
oncmd gosub *resize1, WM_SIZE
stop
*resize1
madoakeru 0,0,ginfo_winx,ginfo_winy
return
*/
| |
|
2015/9/14(Mon) 20:50:14|NO.71678
プラグインで拡張した型にもたぶん対応できている変数のサイズを取得する命令
#module
#defcfunc getvarsize var varget, local varsizinf, local varsizeptr, local hspctxstrr, local pvaladr, local pvala
if vartype(varget)==vartype("str"){
varsizeptr=varptr(varget)
dupptr varsizinf,varsizeptr-16,4
return varsizinf
}
mref hspctxstrr,68
dupptr pvaladr,hspctxstrr.207,4
dupptr pvala,pvaladr,48,vartype("str")
return lpeek(pvala,24)
#global
|
|
2015/9/14(Mon) 21:50:59|NO.71681
switch 文の swbreak を書かなくてもいいバージョンを作りました。
ソースはこちら: https://goo.gl/xOtJv2
次の定義も必要です
#define global ctype _cat3(%1,%2,%3)%1%2%3
#define global ctype _cat_scope(%1,%2)_cat3(%1,@,%2)
#define global assert_unreachable assert 0
#define global assert_sentinel assert_unreachable
ドキュメントはこちら: https://goo.gl/9ua6qO
(これを hsphelp フォルダにコピーすると、F1キーでヘルプがみれるようになる)
使用例(?)はこちら: https://goo.gl/gXxnkf
|
|
2015/9/14(Mon) 23:28:22|NO.71693
>uebaiさん
よくswbreakは付け忘れるのでべんりだと思います
わたしもマクロを勉強したいです
|
|
2015/9/14(Mon) 23:36:46|NO.71694
suujimojihenkan 変数名
で数字の配列を文字列に変換するモジュールです。
変換できればstatに1が返ります。
文字列の変数を渡した場合はstatに0が返り何もおきません。
変数の変換後、直接代入するとシステムエラーになります。(mojiretsu=""、mojiretsu=0等)それ以外は特に制限はないはずです。
dupptr mojiretsu,varptr(suuji),5,vartype("str")のようにすればいいだけなのであまり使い道はありません。
#undef dim
#undef dimtype
#undef sdim
#module
#defcfunc getvarsize var varget, local varsizinf, local varsizeptr, local hspctxstrr, local pvaladr, local pvala
if vartype(varget)==vartype("str"){
varsizeptr=varptr(varget)
dupptr varsizinf,varsizeptr-16,4
return varsizinf
}
mref hspctxstrr,68
dupptr pvaladr,hspctxstrr.207,4
dupptr pvala,pvaladr,48,vartype("str")
return lpeek(pvala,24)
#global
#module
#deffunc suujimojihenkan var p1, local yousoookisa, local varsizeptr, local hspctxstrr, local pvaladr, local pvala, local varsizinf, local hensuutype, local j//, local yousosuu
if vartype(p1)==vartype("str") : return 0
hensuutype=vartype(p1)
/*yousosuu=length(p1)
if length2(p1)>0{
yousosuu*=length2(p1)
if length3(p1)>0{
yousosuu*=length3(p1)
if length4(p1)>0 : yousosuu*=length4(p1)
}
}*/
mref hspctxstrr,68
dupptr pvaladr,hspctxstrr.207,4
dupptr pvala,pvaladr,48,vartype("str")
yousoookisa=lpeek(pvala,24)
wpoke pvala,0,vartype("str")
lpoke pvala,24,4
dupptr varsizinf,lpeek(pvala,28)-16,4
varsizinf=yousoookisa
//空いていないかさがす
if i>0{
j=i
repeat
j--
if pvaladrbak.j<=0 : break
if j<=0 : j=-1 : break
loop
}else{
j=-1
}
//終了時に使う
if j==-1{
if i==0{
pvaladrbak=pvaladr
yousoookisabak=yousoookisa
hensuutypebak=hensuutype
i++
}else{
pvaladrbak.i=pvaladr
yousoookisabak.i=yousoookisa
hensuutypebak.i=hensuutype
i++
}
}else{
pvaladrbak.j=pvaladr
yousoookisabak.j=yousoookisa
hensuutypebak.j=hensuutype
}
return 1
#deffunc hensuumodosu onexit//変数の種類はもとに戻さないとエラーになる
if i<=0 : end//変換を一回もしていない時
j=i
*kurikaeshi//ループ命令は使えない
j--
if pvaladrbak.j!=0{
dupptr pvala,pvaladrbak.j,48,vartype("str")
dupptr varsizinf,lpeek(pvala,28)-16,4
varsizinf=64
lpoke pvala,24,yousoookisabak.j
wpoke pvala,0,hensuutypebak.j
}
if j>0 : goto *kurikaeshi
end
#deffunc dim var q1, int q2, int q3, int q4, int q5, local hspctxstrr, local pvaladr, local pvalan, local varsizinfn, local jn
if i<=0 : dim@hsp q1,q2,q3,q4,q5 : return
mref hspctxstrr,68
dupptr pvaladr,hspctxstrr.207,4
jn=i
repeat
jn--
if pvaladrbak.jn==pvaladr{
dupptr pvalan,pvaladr,48,vartype("str")
dupptr varsizinfn,lpeek(pvalan,28)-16,4
varsizinfn=64
lpoke pvalan,24,yousoookisabak.jn
wpoke pvalan,0,hensuutypebak.jn
pvaladrbak.jn=0
break
}
if jn<=0 : break
loop
dim@hsp q1,q2,q3,q4,q5
return
#deffunc dimtype var r1, int r2, int r3, int r4, int r5, int r6, local hspctxstrr, local pvaladr, local pvalan, local varsizinfn, local jn
if i<=0 : dimtype@hsp r1,r2,r3,r4,r5,r6 : return
mref hspctxstrr,68
dupptr pvaladr,hspctxstrr.207,4
jn=i
repeat
jn--
if pvaladrbak.jn==pvaladr{
dupptr pvalan,pvaladr,48,vartype("str")
dupptr varsizinfn,lpeek(pvalan,28)-16,4
varsizinfn=64
lpoke pvalan,24,yousoookisabak.jn
wpoke pvalan,0,hensuutypebak.jn
pvaladrbak.jn=0
break
}
if jn<=0 : break
loop
dimtype@hsp r1,r2,r3,r4,r5,r6
return
#deffunc sdim var s1, int s2, int s3, int s4, int s5, int s6, local hspctxstrr, local pvaladr, local pvalan, local varsizinfn, local jn
if i<=0 : sdim@hsp s1,s2,s3,s4,s5,s6 : return
mref hspctxstrr,68
dupptr pvaladr,hspctxstrr.207,4
jn=i
repeat
jn--
if pvaladrbak.jn==pvaladr{
dupptr pvalan,pvaladr,48,vartype("str")
dupptr varsizinfn,lpeek(pvalan,28)-16,4
varsizinfn=64
lpoke pvalan,24,yousoookisabak.jn
wpoke pvalan,0,hensuutypebak.jn
pvaladrbak.jn=0
break
}
if jn<=0 : break
loop
sdim@hsp s1,s2,s3,s4,s5,s6
return
#global
//サンプル
ddim c,3,2
dupptr a,varptr(c),3*2*8
buf="あいう"
memcpy a,buf,6
mes "数字 : "+a
mes "種類"+vartype(a)
mes "大きさ"+getvarsize(a)
suujimojihenkan a
//a="あい" //直接代入はできない
print "文字列: "+a
print "種類"+vartype(a)
print "大きさ"+getvarsize(a)
print strmid(a,0,2)//文字列操作はできるよう
buf="い" : memcpy a,buf,2//代入の際はmemcpyで
print a
dim b,1,2,2
suujimojihenkan b//複数変換も可能
poke b,0,"ちくわ"
print "複数変換も可能: b="+b
dupptr d,varptr(b),7,vartype("str")
print "duptrでクローン作成: "+d
dup d,b
print "dupでクローン作成: "+d
dim b
print "dimで初期化して普通の変数に: "+b
suujimojihenkan b
poke b,0,"A"
print "再度変換: b="+b
//dimtype b,vartype("double")
ddim b,1
print "ddimで初期化して普通の変数に: "+b
suujimojihenkan b
poke b,0,"A"
print "再度変換: b="+b
sdim b,1
b="a"
print "sdimで初期化して普通の変数に: "+b
dim e
suujimojihenkan e
mes e
| |
|
2015/9/15(Tue) 23:41:31|NO.71719
DLLの動的呼び出しのモジュールを書き直しました
わたしがこのスレッドで公開したスクリプトは別にライセンスの明記がない限りNYSL 0.9982のライセンスの下で公開します
(注意: NYSLはライセンスの名称であり、NYSLのウェブサイトとこのソフトは全くの無関係でありわたしが勝手に自分のソフトをNYSLでライセンスしているだけです)
#module
//dllfunc p1,p2,p3,p4,p5
//p1=文字列 :使用するDLLの名前
//p2=文字列 :関数の名前
//p3=配列 :パラメーター入りの1次元配列
//p4=0~(-1) :パラメーターの数(省略時または-1の指定時は配列の要素数で処理)
//p5=(0) :関数の呼び出しに失敗した際のstatへの返し値
#uselib "kernel32.dll"
#func LoadLibrary "LoadLibraryA" str
#func GetProcAddress "GetProcAddress" int,str
#func FreeLibrary "FreeLibrary" int
#deffunc wvdhbadubhvhubfvhuhxb str dllname , str funcname , array arguments, int numarv, int errnum, local dlladdr, local funcaddr, local result
LoadLibrary dllname
dlladdr=stat
if dlladdr==0 : return errnum
GetProcAddress dlladdr,funcname//関数のアドレスをとる
funcaddr=stat
if funcaddr==0{
FreeLibrary dlladdr
return errnum
}
if numarv<0{
result=callfunc(arguments,funcaddr,length(arguments))
}else{
result=callfunc(arguments,funcaddr,numarv)
}
FreeLibrary dlladdr
return result
#global
#define dllfunc(%1, %2, %3, %4=-1, %5=0) wvdhbadubhvhubfvhuhxb %1,%2,%3,%4,%5
//サンプル
hiki.0=hwnd
hiki.1=0
hiki.2=0
hiki.3=300
hiki.4=300
hiki.5=1
dllfunc "user32.dll","MoveWindow",hiki
if stat=1:mes "成功"
| |
|
2015/9/15(Tue) 23:41:51|NO.71720
DLLの動的呼び出しのモジュールの高機能版のHSP2版
http://nopswebpages.webcrow.jp/apps/dlldou2.txt
#module
//HSP2.6で動作確認
//NYSL 0.9982のライセンスの下で公開します
//(注意: NYSLはライセンスの名称であり、NYSLのウェブサイトとこのソフトは全くの無関係でありわたしが勝手に自分のソフトをNYSLでライセンスしているだけです)
//DLL読み込み
//dllload p1,p2
//p1=文字列 :DLL名
//p2=0~(0) :希望のDLL番号(すでに使われていた場合は自動的に番号が割り当てられます)
//p2を0または省略された場合は自動的に空いている番号が割り当てられます。
//正常に割り当てられればstatにDLL番号が返り、エラーの場合はstatに-1が返ります。
//同じDLLを複数回読みこんだ場合同じDLLに番号が複数割り当てられることになります。
//このモジュールがよみこんでいるDLL解放
//dllunload p1
//p1=0~(0) :解放するDLLのDLL番号
//解放できた場合はstatに0以外が返り、使われていない番号を指定して解放できなかった場合はstatに0が返ります。
//このモジュールがよみこんでいるから関数呼び出し
//funcfunc p1,p2,p3,p4,p5
//p1=文字列 :関数の名前
//p2=配列 :パラメーター入りの1次元配列
//p3=0~(-1) :パラメーターの数(省略時または-1の指定時は配列の要素数で処理)
//p4=0~(0) :DLL番号
//p5=(0) :関数の呼び出しに失敗した際のstatへの返し値
//使われていないDLL番号を指定した場合p5で指定したエラー番号がstatに返されます。
//このモジュールがよみこんでいるDLL全開放
//dllunloadall
//一つもよみこんでいなければstatに0が返ります。よみこんでいて解放した場合はstatに1が返ります。
//DLLのアドレスを保持していた配列はdimで解放して初期化します。
//#uselib "kernel32.dll"
//#func LoadLibrary "LoadLibraryA" str
//#func GetProcAddress "GetProcAddress" sptr,str
/#func FreeLibrary "FreeLibrary" sptr
//#define POINTERSIZE 4
#deffunc dllload str, int
mref dllname,32 : mref dllnuml,1
if dllnuml<0 : return -1
/*if i>0{
if dllnuml>=i : return -1
}*/
dllnumn=dllnuml
if i>1{
if dllnumn>0{
if dllnumn<i{
if dlladdrbak.dllnumn==0{
dlladdrbak.dllnumn
ll_libload dlladdrbak.dllnumn, dllname
if dlladdrbak.dllnumn==0 : return -1
mref tmp0,64 : tmp0=dllnumn
return
}else{
dllnumn=0
}
}else{
//memexpand dlladdrbak,(dllnumn+1)*POINTERSIZE
ll_libload dlladdrbak.dllnumn, dllname
if dlladdrbak.dllnumn==0 : return -1
i=dllnumn+1
mref tmp0,64 : tmp0=dllnumn
return
}
}
}
if dllnumn==0{
if i==0{
ll_libload dlladdrbak, dllname
if dlladdrbak==0 : return -1
i++
mref tmp0,64 : tmp0=i-1
return
}else{
j=i
while
j--
if dlladdrbak.j==0{
ll_libload dlladdrbak.j, dllname
if dlladdrbak.j==0 : return -1
mref tmp0,64 : tmp0=j
return
}
if j<=0{
ll_libload dlladdrbak.i, dllname
if dlladdrbak.i==0 : return -1
i++
mref tmp0,64 : tmp0=i-1
return
}
wend
}
}
mref tmp0,64 : tmp0=-1
return
#deffunc dllunload int
mref dllnumm,0
if dllnumm<0 | dllnumm>=i{
mref tmp0,64 : tmp0=0
return
}
if dlladdrbak.dllnumm<=0{
mref tmp0,64 : tmp0=0
return
}
ll_libfree dlladdrbak.dllnumm
dlladdrbak.dllnumm=0
mref tmp0,64 : tmp0=1
return
#deffunc avd76grgyvakuhyafdh str, val, int, int, int
mref funcname,32 : mref arguments,49 : mref numarv,2 : mref dllnum,3 : mref errnum,4
if dllnum<0 | dllnum>=i{
mref tmp0,64 : tmp0=errnum
return
}
/*if numarv<0{
mref tmp0,64 : tmp0=errnum
return
}*/
dlladdr=dlladdrbak.dllnum
if dlladdr<=0{
mref tmp0,64 : tmp0=errnum
return
}
ll_getproc funcaddr,funcname,dlladdr //関数のアドレスをとる
if funcaddr==0{
mref tmp0,64 : tmp0=errnum
return
}
if numarv<0{
mref tmp1,1025
ll_callfunc arguments,tmp1.2,funcaddr
dim result
ll_ret result
//result=callfunc(arguments,funcaddr,length(arguments))
}else{
ll_callfunc arguments,numarv,funcaddr
dim result
ll_ret result
//result=callfunc(arguments,funcaddr,numarv)
}
mref tmp0,64 : tmp0=result
return
#deffunc dllunloadall
if i<=0{
mref tmp0,64 : tmp0=0
return
}
j=i
*sakujorupu
j--//:dialog ""+dlladdrbak.j
dllunload j
if j>0 : goto *sakujorupu
i=0
dim dlladdrbak
mref tmp0,64 : tmp0=1
return
#deffunc dllunloadallend onexit
dllunloadall
end
#global
#define funcfunc(%1, %2, %3=-1, %4=0, %5=0) avd76grgyvakuhyafdh %1,%2,%3,%4,%5
//サンプル
#define GPTR $40
#define MB_ICONINFORMATION $40
#define MB_OK 0
dim hiki,20
mref bmscr,67
hiki.0=bmscr.13
hiki.1=0
hiki.2=0
hiki.3=300
hiki.4=300
hiki.5=1
dllload "user32.dll"//DLL番号0
dllload "user32.dll"//DLL番号1
dllload "user32.dll"//DLL番号2
dllload "user32.dll",7//DLL番号7
funcfunc "MoveWindowaaaaa",hiki,,7//わざとまちがえ
funcfunc "MoveWindow",hiki,6,7,0
if stat=1:mes "ウィンドウ移動成功"
dllload "kernel32.dll"
kernel32num=stat
mes "kernel32,dllのDLL番号は"+kernel32num
dllunload 1
//dllunloadall
dim hiki,5
hiki.0=GPTR
hiki.1=4
funcfunc "GlobalAlloc",hiki,2,kernel32num
pointer=stat
if pointer>=0{
mes "メモリ確保成功 アドレス="+pointer
hiki.0=pointer
funcfunc "GlobalFree",hiki,1,kernel32num
}else{
mes "メモリ確保失敗"
}
dim pointer,2
chikuwa="ちくわ"
miso="みそ"
ll_getptr chikuwa : ll_ret pointer.0
ll_getptr miso : ll_ret pointer.1
hiki.0=bmscr.13
hiki.1=pointer.0
hiki.2=pointer.1
hiki.3=MB_ICONINFORMATION|MB_OK
funcfunc "MessageBoxA",hiki,4,0
stop
| |
|
2015/9/15(Tue) 23:42:25|NO.71721
DLLの動的呼び出しのモジュールの高機能版
http://nopswebpages.webcrow.jp/apps/dlldou.txt
#module
//HSP3.4で動作確認
//NYSL 0.9982のライセンスの下で公開します
//(注意: NYSLはライセンスの名称であり、NYSLのウェブサイトとこのソフトは全くの無関係でありわたしが勝手に自分のソフトをNYSLでライセンスしているだけです)
//DLL読み込み
//dllload p1,p2
//p1=文字列 :DLL名
//p2=0~(0) :希望のDLL番号(すでに使われていた場合は自動的に番号が割り当てられます)
//p2を0または省略された場合は自動的に空いている番号が割り当てられます。
//正常に割り当てられればstatにDLL番号が返り、エラーの場合はstatに-1が返ります。
//同じDLLを複数回読みこんだ場合同じDLLに番号が複数割り当てられることになります。
//このモジュールがよみこんでいるDLL解放
//dllunload p1
//p1=0~(0) :解放するDLLのDLL番号
//解放できた場合はstatに0以外が返り、使われていない番号を指定した等で解放できなかった場合はstatに0が返ります。
//このモジュールがよみこんでいるから関数呼び出し
//funcfunc p1,p2,p3,p4,p5
//p1=文字列 :関数の名前
//p2=配列 :パラメーター入りの1次元配列
//p3=0~(-1) :パラメーターの数(省略時または-1の指定時は配列の要素数で処理)
//p4=0~(0) :DLL番号
//p5=(0) :関数の呼び出しに失敗した際のstatへの返し値
//使われていないDLL番号を指定した場合p5で指定したエラー番号がstatに返されます。
//このモジュールがよみこんでいるDLL全開放
//dllunloadall
//一つもよみこんでいなければstatに0が返ります。よみこんでいて解放した場合はstatに1が返ります。
//DLLのアドレスを保持していた配列はdimで解放して初期化します。
#uselib "kernel32.dll"
#func LoadLibrary "LoadLibraryA" str
#func GetProcAddress "GetProcAddress" sptr,str
#func FreeLibrary "FreeLibrary" sptr
#define POINTERSIZE 4
#deffunc dllload str dllname, int dllnuml, local j, local dllnumn
if dllnuml<0 : return -1
/*if i>0{
if dllnuml>=i : return -1
}*/
dllnumn=dllnuml
if i>1{
if dllnumn>0{
if dllnumn<i{
if dlladdrbak.dllnumn==0{
LoadLibrary dllname
if stat==0 : return -1
dlladdrbak.dllnumn=stat
return dllnumn
}else{
dllnumn=0
}
}else{
//memexpand dlladdrbak,(dllnumn+1)*POINTERSIZE
LoadLibrary dllname
if stat==0 : return -1
dlladdrbak.dllnumn=stat
i=dllnumn+1
return dllnumn
}
}
}
if dllnumn==0{
if i==0{
LoadLibrary dllname
if stat==0 : return -1
dlladdrbak=stat
i++
return i-1
}else{
j=i
while
j--
if dlladdrbak.j==0{
LoadLibrary dllname
if stat==0 : return -1
dlladdrbak.j=stat
return j
}
if j<=0{
LoadLibrary dllname
if stat==0 : return -1
dlladdrbak.i=stat
i++
return i-1
}
wend
}
}
return -1
#deffunc dllunload int dllnumm
if dllnumm<0 | dllnumm>=i: return 0
if dlladdrbak.dllnumm<=0 : return 0
FreeLibrary dlladdrbak.dllnumm
if stat!=0 : dlladdrbak.dllnumm=0
return stat
#deffunc avd76grgyvakuhyafdh str funcname , array arguments, int numarv, int dllnum, int errnum, local funcaddr, local result, local dlladdr
if dllnum<0 | dllnum>=i: return errnum
dlladdr=dlladdrbak.dllnum
if dlladdr<=0 : return errnum
GetProcAddress dlladdr,funcname//関数のアドレスをとる
funcaddr=stat
if funcaddr==0{
//FreeLibrary dlladdr
return errnum
}
if numarv<0{
result=callfunc(arguments,funcaddr,length(arguments))
}else{
result=callfunc(arguments,funcaddr,numarv)
}
return result
#deffunc dllunloadall
if i<=0 : return 0
j=i
*sakujorupu
j--//:dialog ""+dlladdrbak.j
dllunload j
if j>0 : goto *sakujorupu
i=0
dim dlladdrbak
return 1
#deffunc dllunloadallend onexit
dllunloadall
end
#global
#define funcfunc(%1, %2, %3=-1, %4=0, %5=0) avd76grgyvakuhyafdh %1,%2,%3,%4,%5
//サンプル
#define GPTR $40
#define MB_ICONINFORMATION $40
#define MB_OK 0
hiki.0=hwnd
hiki.1=0
hiki.2=0
hiki.3=300
hiki.4=300
hiki.5=1
dllload "user32.dll"//DLL番号0
dllload "user32.dll"//DLL番号1
dllload "user32.dll"//DLL番号2
dllload "user32.dll",7//DLL番号7
funcfunc "MoveWindowaaaaa",hiki,,7//わざとまちがえ
funcfunc "MoveWindow",hiki,,7
if stat=1:mes "ウィンドウ移動成功"
dllload "kernel32.dll"
kernel32num=stat
mes "kernel32,dllのDLL番号は"+kernel32num
dllunload 1
//dllunloadall
dim hiki,5
hiki.0=GPTR
hiki.1=4
funcfunc "GlobalAlloc",hiki,2,kernel32num
pointer=stat
if pointer>=0{
mes "メモリ確保成功 アドレス="+pointer
hiki.0=pointer
funcfunc "GlobalFree",hiki,1,kernel32num
}else{
mes "メモリ確保失敗"
}
dim pointer,2
chikuwa="ちくわ"
miso="みそ"
pointer.0=varptr(chikuwa)
pointer.1=varptr(miso)
hiki.0=hwnd
hiki.1=pointer.0
hiki.2=pointer.1
hiki.3=MB_ICONINFORMATION|MB_OK
funcfunc "MessageBoxA",hiki,4,0
| |
|
2015/9/16(Wed) 14:15:55|NO.71729
プリンタの一覧を取得する
#module
#uselib "winspool.drv"
#func EnumPrinterDrivers "EnumPrinterDriversA" sptr,sptr,int,sptr,int,sptr,sptr
#func GetDefaultPrinter "GetDefaultPrinterA" sptr,sptr
#define INTSIZE 4
#define POINTERSIZE 4
#define POINTERTYPE vartype("int")
#define enumplistNAGASA enumprntmp.8
#define pInfo2 enumprntmp.7
#define pInfo enumprntmp.6
#define lpDriverInfoptr enumprntmp.5
#define dwReturnedptr enumprntmp.4
#define dwNeededptr enumprntmp.3
#define PRINTERNAMELEN enumprntmp.2
#define dwReturned enumprntmp.1
#define dwNeeded enumprntmp.0
#define KITEILENGTH kiteitmp.0
#define KITEILENGTHPTR kiteitmp.1
#define KITEIPTR kiteitmp.2
#deffunc enumprn var plist/*, int buferneeded*/, local enumprntmp, local lpDriverInfo, local printername, local pInfotmp, local pInfotmp2
dim enumprntmp,9
sdim plist
dwNeededptr=varptr(dwNeeded)
dwReturnedptr=dwNeededptr+INTSIZE
//バッファー確保
EnumPrinterDrivers 0,0,1,0,0,dwNeededptr,dwReturnedptr
sdim lpDriverInfo,dwNeeded
lpDriverInfoptr=varptr(lpDriverInfo)
EnumPrinterDrivers 0,0,1,lpDriverInfoptr,dwNeeded,dwNeededptr,dwReturnedptr
enumplistNAGASA=0
repeat dwReturned
dupptr pInfotmp,POINTERSIZE*cnt + lpDriverInfoptr,POINTERSIZE,POINTERTYPE
pInfo=pInfotmp
repeat
dupptr pInfotmp2,pInfo+cnt,1,vartype("str")
pInfo2=peek(pInfotmp2,0)
if pInfo2==0{
PRINTERNAMELEN=cnt
break
}
loop
enumplistNAGASA+=PRINTERNAMELEN
if cnt>0 : enumplistNAGASA+=2
//if buferneeded==0{
memexpand plist,enumplistNAGASA+1
if cnt>0 : poke plist,enumplistNAGASA-PRINTERNAMELEN-2,"\n"
dupptr printername,pInfo,PRINTERNAMELEN+1,vartype("str")
memcpy plist,printername,PRINTERNAMELEN,enumplistNAGASA-PRINTERNAMELEN
//}
loop
//if buferneeded==0{
poke plist,enumplistNAGASA,0
//}
sdim lpDriverInfo
//if buferneeded==0 | buferneeded==1{
return dwReturned
//}else{
// return enumplistNAGASA+1
//}
#deffunc getdefprn var kitei/*, int kiteibufferneeded*/, local kiteitmp
dim kiteitmp,3
sdim kitei
KITEILENGTHPTR=varptr(KITEILENGTH)
GetDefaultPrinter 0,KITEILENGTHPTR
//if kiteibufferneeded<0{
// return KITEILENGTH
//}
//if kiteibufferneeded==0{
memexpand kitei,KITEILENGTH*2
//}
KITEIPTR=varptr(kitei)
GetDefaultPrinter KITEIPTR,KITEILENGTHPTR
return stat
#global
enumprn plist
mes "プリンターは"+stat+"こです\nプリンタ\n"+plist
getdefprn kitei
mes "\n規定のプリンターは"+kitei
stop
| |
|
2015/9/16(Wed) 15:13:02|NO.71730
ところでわたしの著作権についての書きこみは残しておくべきでしょうか。それとも邪魔にならないよう削除しておくべきでしょうか。
どちらのほうがいいのかよければだれか教えてください。
|
|
2015/9/16(Wed) 17:11:09|NO.71735
Windows 10対応OS取得
#module
//OSのNTバージョンを取得 10対応
#defcfunc GetCurrentOSVer
#uselib "NTDLL.dll"
#func global RtlGetVersion "RtlGetVersion" sptr
dim GetCurrentOSVer_INF, 37
GetCurrentOSVer_INF = $94
RtlGetVersion varptr(GetCurrentOSVer_INF)
return GetCurrentOSVer_INF(1) + "." + GetCurrentOSVer_INF(2)
#global
CPUの製品名、周波数取得
//CPU名フル取得
#module
#defcfunc GetCPUName
#include "advapi32.as"
GetCPUNAME_Ret_size=128
SDIM GetCPUNAME_Ret,GetCPUNAME_Ret_size
RegOpenKeyEx $80000002,("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0"),0,$00000001,varptr(GetCPUNAME_hkey)
RegQueryValueEx GetCPUNAME_hKey,"ProcessorNameString",0,0,varptr(GetCPUNAME_ret),varptr(GetCPUNAME_Ret_size)
RegCloseKey GetCPUNAME_hKey
return GetCPUNAME_Ret
#global
どちらもstrで値がreturnします。
|
|
2015/9/16(Wed) 17:39:15|NO.71736
>>Noapさん
残しておくべきだと思います。
やはりこういう議論は今後にも繋がる事と、
Noapさんだけが消してしまうと他の人のレスがわけわからなくなってしまいます。
かと言って全員消すとなると大変なので、残しておくべきかと。
関係ありませんがこのスレ何処まで伸びるんだろう・・・・
自分もそろそろ何か投稿したいな・・・
|
|
2015/9/16(Wed) 17:50:03|NO.71738
残しておくことにします。確かにどこまで続くのかわかりません。わたしは200まで行くかもしれないと思います。わたしのモジュールはいまいちなにの役に立つのか分からないものが多いのでわたしも何か役に立ちそうなのをつくりたいです。
|
|
2015/9/16(Wed) 17:54:19|NO.71739
ところで「スレ」や「レス」は何のことですか。いつもよくわからなくて文脈でなんとなくで文を理解しているのですが、辞書にものっていないためわかりません。
|
|
2015/9/17(Thu) 06:53:28|NO.71756
わざわざ教えてくれてすみません
|
|
2015/9/17(Thu) 23:38:48|NO.71774
つくりかけのモジュール
#module
//hspprintとstatへの返し値や引数及び結果の挙動は同じはず
//enumprn
//statにプリンターがいくつあるか入ります
//getdefprn
//statに成功すれば0が失敗すれば1が入ります
//propprn
//
//statに成功すれば0が失敗すれば1が入ります
#uselib "winspool.drv"
//#func EnumPrinterDrivers "EnumPrinterDriversA" sptr,sptr,int,sptr,int,sptr,sptr
#func EnumPrinters "EnumPrintersA" int,sptr,int,sptr,int,sptr,sptr
#func GetDefaultPrinter "GetDefaultPrinterA" sptr,sptr
#func OpenPrinter "OpenPrinterA" sptr,sptr,sptr
#func ClosePrinter "ClosePrinter" sptr
#func GetPrinter "GetPrinterA" sptr,int,sptr,int,sptr
#uselib "gdi32.dll"
#cfunc GetDeviceCaps "GetDeviceCaps" sptr,int
#cfunc CreateDC "CreateDCA" str,str,int,int
#func DeleteDC "DeleteDC" sptr
#define INTSIZE 4
#define POINTERSIZE 4
#define POINTERTYPE vartype("int")
#define PRINTER_ENUM_CONNECTIONS $00000004
#define PRINTER_ENUM_LOCAL $00000002
#define PRINTER_ENUM_SHARED $00000020
#define HORZRES $00000008//ピクセルヨコ
#define VERTRES $0000000A//ピクセルタテ
#define HORZSIZE $00000004//大きさ横
#define VERTSIZE $00000006//大きさ縦
#define PHYSICALWIDTH $0000006E//大きさ横デバイス単位
#define PHYSICALHEIGHT $0000006F//大きさ縦デバイス単位
#define PHYSICALOFFSETX $00000070//すきま横デバイス単位
#define PHYSICALOFFSETY $00000071//すきま横デバイス単位
//PRINTER_INFO_1構造体
#const PRINTER_INFO_1SIZE (INTSIZE+POINTERSIZE*3)
#const PINF1flags 0
#const PINF1pDescription INTSIZE
#const PINF1pName (INTSIZE+POINTERSIZE)
#const PINF1pComment (INTSIZE+POINTERSIZE*2)
#define ENUMPRNenumplistNAGASA enumprntmp.8
#define ENUMPRNpInfo2 enumprntmp.7
#define ENUMPRNpInfo enumprntmp.6
#define ENUMPRNlpDriverInfoptr enumprntmp.5
#define ENUMPRNpcbReturnedptr enumprntmp.4
#define ENUMPRNpcbNeededptr enumprntmp.3
#define PRINTERNAMELEN enumprntmp.2
#define ENUMPRNpcbReturned enumprntmp.1
#define ENUMPRNpcbNeeded enumprntmp.0
#define KITEILENGTH kiteitmp.0
#define KITEILENGTHPTR kiteitmp.1
#define KITEIPTR kiteitmp.2
#define PROPPRNDC propprntmp.7
#define PROPPRNDEVMODEPTR propprntmp.6
#define PROPPRNPRINTERINFO2PTR propprntmp.5
#define PROPPRNPRINTERINFO2SIZE propprntmp.4
#define PROPPRNPRINTERINFO2SIZEPTR propprntmp.3
#define PROPPRNNAMEPTR propprntmp.2
#define PROPPRNHWNDPTR propprntmp.1
#define PROPPRNHWND propprntmp.0
#deffunc enumprn var plist, local enumprntmp, local ENUMPRNlpDriverInfo, local printername, local ENUMPRNpInfotmp, local ENUMPRNpInfotmp2
dim enumprntmp,9
sdim plist
ENUMPRNpcbNeededptr=varptr(ENUMPRNpcbNeeded)
ENUMPRNpcbReturnedptr=varptr(ENUMPRNpcbReturned)//ENUMPRNpcbNeededptr+INTSIZE
//バッファー確保
//EnumPrinterDrivers 0,0,1,0,0,ENUMPRNpcbNeededptr,ENUMPRNpcbReturnedptr
if enumprintersflag==0 : enumprintersflag=PRINTER_ENUM_CONNECTIONS + PRINTER_ENUM_LOCAL
EnumPrinters enumprintersflag,0,1,0,0,ENUMPRNpcbNeededptr,ENUMPRNpcbReturnedptr
if ENUMPRNpcbNeeded<=0 : return 0
sdim ENUMPRNlpDriverInfo,ENUMPRNpcbNeeded
ENUMPRNlpDriverInfoptr=varptr(ENUMPRNlpDriverInfo)
//EnumPrinterDrivers 0,0,1,ENUMPRNlpDriverInfoptr,ENUMPRNpcbNeeded,ENUMPRNpcbNeededptr,ENUMPRNpcbReturnedptr
EnumPrinters enumprintersflag,0,1,ENUMPRNlpDriverInfoptr,ENUMPRNpcbNeeded,ENUMPRNpcbNeededptr,ENUMPRNpcbReturnedptr
if ENUMPRNpcbNeeded<=0 : return 0
/*sdim ENUMPRNlpDriverInfobak,ENUMPRNpcbNeeded
memcpy ENUMPRNlpDriverInfobak,ENUMPRNlpDriverInfo,ENUMPRNpcbNeeded*/
//ENUMPRNpcbReturnedbak=ENUMPRNpcbReturned
ENUMPRNenumplistNAGASA=0
repeat ENUMPRNpcbReturned
//dupptr ENUMPRNpInfotmp,POINTERSIZE*cnt + ENUMPRNlpDriverInfoptr,POINTERSIZE,POINTERTYPE
dupptr ENUMPRNpInfotmp,PRINTER_INFO_1SIZE*cnt + PINF1pName + ENUMPRNlpDriverInfoptr,POINTERSIZE,POINTERTYPE
ENUMPRNpInfo=ENUMPRNpInfotmp
repeat
dupptr ENUMPRNpInfotmp2,ENUMPRNpInfo+cnt,1,vartype("str")
ENUMPRNpInfo2=peek(ENUMPRNpInfotmp2,0)
if ENUMPRNpInfo2==0{
PRINTERNAMELEN=cnt
break
}
loop
ENUMPRNenumplistNAGASA+=PRINTERNAMELEN
if cnt>0 : ENUMPRNenumplistNAGASA+=2
//if buferneeded==0{
memexpand plist,ENUMPRNenumplistNAGASA+1
if cnt>0 : poke plist,ENUMPRNenumplistNAGASA-PRINTERNAMELEN-2,"\n"
dupptr printername,ENUMPRNpInfo,PRINTERNAMELEN+1,vartype("str")
memcpy plist,printername,PRINTERNAMELEN,ENUMPRNenumplistNAGASA-PRINTERNAMELEN
//}
loop
//if buferneeded==0{
poke plist,ENUMPRNenumplistNAGASA,0
//}
//sdim plistbak,ENUMPRNenumplistNAGASA+1//検索用
//memcpy plistbak,plist,ENUMPRNenumplistNAGASA
sdim ENUMPRNlpDriverInfo
//if buferneeded==0 | buferneeded==1{
return ENUMPRNpcbReturned
//}else{
// return ENUMPRNenumplistNAGASA+1
//}
#deffunc getdefprn var kitei, local kiteitmp
dim kiteitmp,3
sdim kitei
KITEILENGTHPTR=varptr(KITEILENGTH)
GetDefaultPrinter 0,KITEILENGTHPTR
//if kiteibufferneeded<0{
// return KITEILENGTH
//}
//if kiteibufferneeded==0{
memexpand kitei,KITEILENGTH*2
//}
KITEIPTR=varptr(kitei)
GetDefaultPrinter KITEIPTR,KITEILENGTHPTR
if stat==0{
return 1
}else{
return 0
}
#deffunc propprn var propprn1, var propprn2, int propprnid, int propprntype, local propprntmp, local propprnname, local propprnplist//, local propprnprinterinfo2
dim propprntmp,8
PROPPRNHWNDPTR=varptr(PROPPRNHWND)
PROPPRNPRINTERINFO2SIZEPTR=varptr(PROPPRNPRINTERINFO2SIZE)
//if ENUMPRNpcbReturnedbak<=0 : return 0
if propprnid<0 : return 1
//memcpy PROPPRNNAMEPTR,ENUMPRNlpDriverInfobak,POINTERSIZE,,POINTERSIZE*propprnid
sdim propprnplist
enumprn propprnplist//一覧を取得する
if propprnid>=stat : return 1
sdim propprnname,stat
notesel propprnplist
noteget propprnname,propprnid
PROPPRNNAMEPTR=varptr(propprnname)
OpenPrinter PROPPRNNAMEPTR,PROPPRNHWNDPTR,0
if PROPPRNHWND<=0 : return 1
//mes "ハンドル="+PROPPRNHWND
/*GetPrinter PROPPRNHWND,2,0,0,PROPPRNPRINTERINFO2SIZEPTR
sdim propprnprinterinfo2,PROPPRNPRINTERINFO2SIZE
PROPPRNPRINTERINFO2PTR=varptr(propprnprinterinfo2)
GetPrinter PROPPRNHWND,2,PROPPRNPRINTERINFO2PTR,PROPPRNPRINTERINFO2SIZE,PROPPRNPRINTERINFO2SIZEPTR
if stat==0{
ClosePrinter PROPPRNHWND
return 1
}
memcpy PROPPRNDEVMODEPTR,PROPPRNPRINTERINFO2,POINTERSIZE,,7*POINTERSIZE
dupptr gb,PROPPRNDEVMODEPTR,1,vartype("str")
mes gb*/
PROPPRNDC=CreateDC( propprnname,propprnname,0,0)
propprn1=0
propprn2=0
if propprntype==0{//解像度
propprn1=GetDeviceCaps(PROPPRNDC,HORZRES)
propprn2=GetDeviceCaps(PROPPRNDC,VERTRES)
}
if propprntype==1{//デバイス単位の物理サイズ
propprn1=GetDeviceCaps(PROPPRNDC,PHYSICALWIDTH)
propprn2=GetDeviceCaps(PROPPRNDC,PHYSICALHEIGHT)
}
if propprntype==2{//印刷可能領域とのあいだ
propprn1=GetDeviceCaps(PROPPRNDC,PHYSICALOFFSETX)
propprn2=GetDeviceCaps(PROPPRNDC,PHYSICALOFFSETY)
}
if propprntype==3{//物理サイズ
propprn1=GetDeviceCaps(PROPPRNDC,HORZSIZE)
propprn2=GetDeviceCaps(PROPPRNDC,VERTSIZE)
}
DeleteDC PROPPRNDC
ClosePrinter PROPPRNHWND
return 0
#global
enumprn plist
mes "プリンターは"+stat+"こです\nプリンタ\n"+plist
getdefprn kitei
mes "\n規定のプリンターは"+kitei
propprn jouhou.0 , jouhou.1 , 3 , 3
mes "印刷の大きさ 横="+jouhou.0+"ミリ 縦="+jouhou.1+"ミリ"
propprn jouhou.0 , jouhou.1 , 3 , 0
mes "印刷のピクセル 横="+jouhou.0+"こ 縦="+jouhou.1+"こ"
propprn jouhou.0 , jouhou.1 , 3 , 2
mes "印刷されるところの余白 横="+jouhou.0+" 縦="+jouhou.1
propprn jouhou.0 , jouhou.1 , 3 , 1
mes "印刷の大きさcreate 横="+jouhou.0+" 縦="+jouhou.1
stop
/*sdim plist
sdim kitei
getdefprn kitei,-1
mes "既定のプリンターの名前の長さ: "+(stat-1)+"バイト"
getdefprn kitei
mes "既定のプリンターは"+kitei+"です"
enumprn plist,2
mes "一覧取得に必要なバッファーサイズ: "+stat+"バイト"
enumprn plist
plistlen=strlen(plist)
mes "プリンタは"+stat+"こです\nプリンタ一覧の長さ"+plistlen+"\nプリンタ\n"+plist*/
| |
|
2015/9/18(Fri) 23:06:44|NO.71780
モジュールのつくりかけのパーツ
#deffunc _dcqgy3eriu3dce28dcyqg9xbu int execprnid, int execprnx, int execprny, int execprnsx, int execprnsy, int execprnbx, int execprnby, int execprnbsx, int execprnbsy, str execprnfilename, local execprnplist, local execprntmp, local execprnname, local execprndoctypedocname, local execprndocinfo, local execprnbmpinfo, local execprnpimage
dim execprntmp,EXECPRNARGNUM
EXECPRNHWNDPTR=varptr(EXECPRNHWND)
EXECPRNPRINTERINFO2SIZEPTR=varptr(EXECPRNPRINTERINFO2SIZE)
execprndoctypedocname=execprnfilename
EXECPRNDOCTYPEDOCNAMEPTR=varptr(execprndoctypedocname)
//execprndoctypefilename=execprnfilename
EXECPRNDOCTYPEFILENAMEPTR=0//varptr(execprndoctypefilename)//仕様をあわせる
if execprnid<0 : return 0
//DOCINFO構造体の作成
sdim execprndocinfo,DOCINFOSIZE
memcpy execprndocinfo,EXECPRNDOCTYPEDOCNAMEPTR,POINTERSIZE,DOCINFlpszDocName
memcpy execprndocinfo,EXECPRNDOCTYPEFILENAMEPTR,POINTERSIZE,DOCINFlpszOutput
lpoke execprndocinfo,DOCINFcbSize,DOCINFOSIZE
EXECPRNDOCINFOPTR=varptr(execprndocinfo)
sdim execprnplist
enumprn execprnplist//一覧を取得する
if execprnid>=stat : return 0
//行の取得
EXECPRNCOUNTERI=0//後ろ
EXECPRNCOUNTERJ=0//前
EXECPRNCOUNTERK=0//行数
repeat
EXECPRNCOUNTERL=peek(execprnplist,EXECPRNCOUNTERI)
if EXECPRNCOUNTERL==0 : break
EXECPRNCOUNTERI++
if EXECPRNCOUNTERL==CR{
EXECPRNCOUNTERL=peek(execprnplist,EXECPRNCOUNTERI)
if EXECPRNCOUNTERL==0 : break
EXECPRNCOUNTERI++
if EXECPRNCOUNTERL==LF{
if EXECPRNCOUNTERK<execprnid{
EXECPRNCOUNTERJ=EXECPRNCOUNTERI
EXECPRNCOUNTERK++
EXECPRNCOUNTERI++
continue
}
EXECPRNCOUNTERI-=2
break
}
}
loop
if EXECPRNCOUNTERK!=execprnid : return 0
sdim execprnname,EXECPRNCOUNTERI-EXECPRNCOUNTERJ+1
memcpy execprnname,execprnplist,EXECPRNCOUNTERI-EXECPRNCOUNTERJ,,EXECPRNCOUNTERJ
EXECPRNNAMEPTR=varptr(execprnname)
OpenPrinter EXECPRNNAMEPTR,EXECPRNHWNDPTR,0
if EXECPRNHWND==0 : return 0
EXECPRNDC=CreateDC( 0,EXECPRNNAMEPTR,0,0)
GetDC hwnd
EXECPRNhdc1=stat
//DIBセクション
dim execprnbmpinfo,40
execprnbmpinfo.0=40
execprnbmpinfo.1=ginfo_sx
execprnbmpinfo.2=-ginfo_sy
execprnbmpinfo.3=1|32<<16
execprnbmpinfo.5=ginfo_sx*ginfo_sy*4
EXECPRNBMPINFOPTR=varptr(execprnbmpinfo)
dim execprnpimage,ginfo_sx*ginfo_sy*4
EXECPRNPIMAGEPTR=varptr(execprnpimage)
CreateDIBSection EXECPRNhdc1,EXECPRNBMPINFOPTR,DIB_RGB_COLORS,EXECPRNPIMAGEPTR,0,0//DIBセクション
EXECPRNhBitMap=stat
//メモリデバイスコンテクスト
CreateCompatibleDC EXECPRNhdc1
EXECPRNhMemoryDC=stat
SelectObject EXECPRNhMemoryDC,EXECPRNhBitMap
EXECPRNhOObject=stat
ReleaseDC hwnd,EXECPRNhdc1
//印刷開始
StartDoc EXECPRNDC,EXECPRNDOCINFOPTR//XPSのファイル保存ダイアログはここで出る
StartPage EXECPRNDC
GetDC hwnd
EXECPRNhdc2=stat
BitBlt SDEXECPRNDC,execprnx,execprny,execprnbsx,execprnbsy,hdc,execprnbx,execprnby,SRCCOPY
EndPage EXECPRNDC//実際の印刷が始まる
EndDoc EXECPRNDC
//印刷終了
//後始末
DeleteDC EXECPRNDC
ClosePrinter EXECPRNHWND
ReleaseDC hwnd,EXE
SelectObject EXECPRNhMemoryDC,EXECPRNhOObject : dialog ""+stat+" "+EXECPRNhOObject
DeleteDC EXECPRNhMemoryDC
DeleteObject EXECPRNhBitMap
sdim execprndocinfo
sdim execprnplist
sdim execprnname
dim execprntmp
return 0
| |
|
2015/9/18(Fri) 23:42:54|NO.71782
>Noap さん
精力的ですね。こうやって遺産を積み上げていくの、いいなって思います。
ところでですが、引数名が長く、引数の数もかなり多いようですね。
(作りかけとのことで、デバック用の引数も入っているのだろうと思いますが。)
余計なお世話でしたらスルーしてもらって結構ですが「こんな風にしたら少し見やすくなるかな?」
という書き方の提案です。
#deffunc func int prm1, int prm2, double prm3, var prm4, array prm5, local lv1, local lv2 ...
#define x prm1
#define y prm2
#define dist prm3
#define label prm4
#define result prm5
#define code lv1
#define ptr lv2 //"lv" means "localVariable"
/*
処理
*/
#undef x
#undef y
#undef dist
#undef label
#undef result
#undef code
#undef ptr
return
(先程から度々書き換えてすみません。)
|
|
2015/9/19(Sat) 01:25:23|NO.71787
確かにそのほうがみやすいと思います。助言をくれてすみません。
眠くなると変な間違いが多くなるようで同じところを何回もまちがえていました。
プリンタが持つのに重たくて動作確認がむずかしかったです。
最後はXPSで確認しました。
結局モジュールのづさはわかる範囲でまったくおなじにしました。
説明
http://nopswebpages.webcrow.jp/apps/hspprint
HSPPRINT互換モジュール
http://nopswebpages.webcrow.jp/apps/hspprint/hspprint.txt
サンプル
#include "hspprint.as"
dim namban
dim kazu
sdim pname
ddim kakudairitsu,1
buffer 1
/*screen 1,1000,1000
boxf 250,250,750,750
line 0,0,1000,1000
line 1000,0,0,1000*/
gsel 0
cls
gosub *hyouji
input namban
button gosub "情報", *hiraku
button gosub "プロパティ", *iroiro
button gosub "テスト印刷", *insatsu
stop
*hiraku
gosub *ichiran
if namban<0 | namban>=kazu : namban=0 : objprm 0,0 : return
notesel plist
noteget pname,namban
noteunsel
dialog pname
gosub *ichiran
if namban<0 | namban>=kazu : namban=0 : objprm 0,0 : return
propprn jouhou.0 , jouhou.1 , namban , 3
dialog "印刷の大きさ 横="+jouhou.0+"ミリ 縦="+jouhou.1+"ミリ"
gosub *ichiran
if namban<0 | namban>=kazu : namban=0 : objprm 0,0 : return
propprn jouhou.0 , jouhou.1 , namban , 0
dialog "印刷のピクセル 横="+jouhou.0+"こ 縦="+jouhou.1+"こ"
gosub *ichiran
if namban<0 | namban>=kazu : namban=0 : objprm 0,0 : return
propprn jouhou.0 , jouhou.1 , namban , 2
dialog "印刷されるところの余白 横="+jouhou.0+" 縦="+jouhou.1
gosub *ichiran
if namban<0 | namban>=kazu : namban=0 : objprm 0,0 : return
propprn jouhou.0 , jouhou.1 , namban , 1
dialog "印刷の大きさ 横="+jouhou.0+" 縦="+jouhou.1
gosub *hyouji
return
*hyouji
gosub *ichiran
color 255,255,255
boxf
pos 0,0
color 0,0,0
mes "プリンターは"+kazu+"こです\nプリンタ"
notesel plist
repeat notemax
noteget pname,cnt
mes ""+cnt+" "+pname
loop
noteunsel
getdefprn kitei
mes "\n規定のプリンターは"+kitei
return
*ichiran
prnflags PRINTER_ENUM_CONNECTIONS+PRINTER_ENUM_LOCAL
enumprn plist
kazu=stat
return
*iroiro
gosub *ichiran
if namban<0 | namban>=kazu : namban=0 : objprm 0,0 : return
prndialog namban
gosub *hyouji
return
*insatsu
dialog "*",16,"画像ファイル"
if stat{
exist refstr
if strsize==-1 : return
gsel 1
picload refstr,0
gsel 0
}else{
return
}
gosub *ichiran
if namban<0 | namban>=kazu : namban=0{
objprm 0,0
return
}
gsel 1
propprn jouhou.0,jouhou.1,namban,0
kakudairitsu=double(jouhou.0)/ginfo_winx
execprn namban,0,0,jouhou.0,kakudairitsu*ginfo_winy,0,0,ginfo_winx,ginfo_winy
gsel 0
gosub *hyouji
return
| |
|
2015/9/19(Sat) 12:18:10|NO.71791
XPSのほかにも実際のプリンタでも印刷を確認しました
|
|
2015/9/19(Sat) 13:46:38|NO.71793
スレッドの一覧の上の広告のよこの等号はいつまであるのかなと思います
|
|
2015/9/20(Sun) 22:16:25|NO.71806
HSP2.6で動作確認
memexpandがないととても不便でした
//HSP2でmemexpand
//HSP2では文字列型変数は最少で4バイトにできるが4バイトずつでしか大きさをきめられない(整数の配列をそのまま使っている様子)
//-----|-----
#module
//変数の情報取得
#deffunc getvarinfo val,int
mref info,1
mref pval,1024
mref kekka,64
if info==0{
kekka=4
repeat 4,2
if pval.cnt>0{
kekka=kekka*pval.cnt
}else{
break
}
loop
}
if info==1 : kekka=pval.0
return
#global
#define memexpand(%1,%2) \
getvarinfo %1,1 :\
if stat==2{\
getvarinfo %1,0 :\
if stat<%2{\
sdim _awelformemexpandingtempmempry,stat :\
memcpy _awelformemexpandingtempmempry,%1,stat :\
sdim %1,%2 :\
memcpy %1,_awelformemexpandingtempmempry,stat :\
sdim _awelformemexpandingtempmempry,4\
}\
}
//-----|-----
a=1
b=1
sdim buf,4
buf="012"
if a==1 : if b==1{ memexpand buf,8} : else : mes "bb"//HSP3と同じように取り扱ってもだいじょうぶ
if a==1 & b==1 : buf+="3456"
mes buf
stop
ダウンロード http://nopswebpages.webcrow.jp/apps/memexpnd.txt
|
|
2015/9/21(Mon) 10:39:25|NO.71809
HSP3のmemexpandで確認するとstatは書き換わっていなかったのでstatをもとに戻すようにしました
URLは同じです
//HSP2でmemexpand
//HSP2では文字列型変数は最少で4バイトにできるが4バイトずつでしか大きさをきめられない(整数の配列をそのまま使っている様子)
//-----|-----
#module
//変数の情報取得
#deffunc getvarinfo val,int
mref info,1
mref pval,1024
mref kekka,64
if info==0{
kekka=4
repeat 4,2
if pval.cnt>0{
kekka=kekka*pval.cnt
}else{
break
}
loop
}
if info==1 : kekka=pval.0
return
#global
#define memexpand(%1,%2) \
_awelformemey=stat:\
getvarinfo %1,1:\
if stat==2{\
getvarinfo %1,0:\
if stat<%2{\
sdim _pndtempmempry,stat:\
memcpy _pndtempmempry,%1,stat:\
sdim %1,%2:\
memcpy %1,_pndtempmempry,stat:\
sdim _pndtempmempry,4\
}\
}\
mref _awelformemex,64:\
_awelformemex=_awelformemey
//-----|-----
a=1
b=1
sdim buf,4
buf="012"
mref kekka,64
kekka=9999
mes "前 返し値stat="+stat
if a==1 : if b==1{ memexpand buf,8} : else : mes "bb"//HSP3と同じように取り扱ってもだいじょうぶ
mes "後 返し値stat="+stat
if a==1 & b==1 : buf+="3456"
mes buf
stop
|
|
2015/9/21(Mon) 21:20:48|NO.71834
HSP2でmemexpandはHSP3とHSP2の両方に対応したソフトを書きたいときに役にたつと思います。
またHSP2.6で確認とありますが正しくはHSP2.61で動作確認でした。
わたしのこのスレッドでの投稿の中でURLが書かれているスクリプトは最新版はそのURLを参照してください。
|
|
2015/9/21(Mon) 21:27:58|NO.71835
伸びる伸びるほかにも固定スレで
「ちょっとした小物公開スレ」
「どうでもいい or ちょっとした質問スレ」
とかあればいいな/
|
|
2015/9/21(Mon) 23:10:41|NO.71837
>>bさん
それは自分も思いました。
とりあえず、このスレッドも長くなってきたので200超えたらPart2を建てようかなと思っています。
|
|
2015/9/23(Wed) 05:53:59|NO.71862
確かに他にも種類があるほうがわかりやすそうです。
|
|
2015/9/23(Wed) 13:40:31|NO.71869
シーゴUIをつかう
アイコンでおしゃれな感じにしたいときにいいです
ユニコードで表示します
#uselib "gdi32.dll"
#func TextOutW "TextOutW" sptr,int,int,wptr,int
font "Segoe UI Symbol",20
sdim buf
buf="あi"
wpoke buf,3,$96F2
wpoke buf,5,$99F1
poke buf,7,"み"
wpoke buf,9,$A0F1
wpoke buf,11,$A0F2
TextOutW hdc,20,50,buf,9
redraw 1
|
|
2015/9/25(Fri) 15:37:35|NO.71939
今見るとあまりにもてきとうでしたのでmesと同じように使えるようにしました
#module
#uselib "user32.dll"
#func DrawText "DrawTextW" sptr,wptr,int,var,int
#define DT_CALCRECT $00000400
#deffunc _unimesketup str buf, local rect, local statbak, local statbak2, local bmscr
statbak2=stat
mref bmscr,67
dim rect,4
rect=ginfo_cx,ginfo_cy,0,0
DrawText hdc,buf,-1,rect,DT_CALCRECT
DrawText hdc,buf,-1,rect
redraw wpeek(bmscr.19,2)
pos rect.0,rect.3
mref statbak,64
statbak=statbak2
return
#global
#define unimes(%1) _unimesketupval=""+%1 : _unimesketup _unimesketupval : dim _unimesketupval,1
cls
sdim buf
redraw 1//redrawの変更に対応
font "Segoe UI Symbol",20
buf="あ"//フォントに文字が含まれていない場合の代替表示
poke buf,2,'I'
wpoke buf,3,$96F2
wpoke buf,5,$99F1
poke buf,7,"み"
wpoke buf,9,$A0F1
wpoke buf,11,$A0F2
mref i,64:i=9999
unimes "みそ\n"+buf
mes "aaaa"
unimes 123
mes stat
//redraw 1
|
|
2015/9/25(Fri) 17:30:48|NO.71947
HSPPRINT互換モジュールはプリンターを使うだけなのに実行ファイルとDLLを一緒に配布しないといけないのはいやなときに使うといいと思います。
そのような需要がはたしてあるのかどうかは疑問ですが。わたし以外にはない気がします。
|
|
2015/9/27(Sun) 10:43:15|NO.71983
Stick命令って、「何故かZ,X,Cとかのキーには対応してない。謎!」ということで、
小物として作ってみました。最大で任意の32キーをStickとして認識できる(はず)です。
一応念のため、 このソースのライセンスはPublic Domain(どのように使ったり改造したりしてもOK)です。
#module
#deffunc myStickSetup array keyList
if(length(keylist)>32){
dialog "エラー:myStickSetupのkeyList配列が長すぎます。(最大32まで)",1,"エラー"
end
}
dim mKeyList,length(keyList)
memcpy mKeyList,keyList,length(keyList)*4
return
#define global myStick(%1,%2=0,%3=1)_myStick %1,%2,%3
#deffunc _myStick var p1,int notTrig,int WindowActiveCheck,local key
if(WindowActiveCheck){
if(ginfo_act=-1){
return
}
}
p1=0
for i,0,length(mKeyList)
getkey key,mKeyList(i)
p1+=key<<i
next
key=p1
p1&=notTrig||(before^-1)
before=key
return
#global
//ここから動作チェック
a=37,38,39,40,'Z','X','A','S','Y','N','M','F'//Getkey準拠のキーコードの配列
myStickSetup a//キー配列を登録します。
repeat
redraw 0
color 255,255,255
boxf
color 0,0,0
pos 0,0
myStick key,15,0//使い方はstickと全く同じにしました。
mes key
redraw 1
await 16
loop
実行のヒント:
1. 全部のキーを非トリガータイプにするには、第二引数を-1にすると楽。
2. myStickSetupを頻繁に変えることは想定しては居ませんよ。起動時に実行する程度で(トリガータイプがカオスになるよ
3. 同時検出とはいえ、物理的な制約は超えられない。
4. サンプルにもあるように、英字と数字のキー入力を定義するなら、シングルクォートで括ると楽。(英字は大文字で!)
以上です。適当に使ってみてください。
| |
|
2015/9/27(Sun) 15:20:46|NO.71990
> Stick命令って、「何故かZ,X,Cとかのキーには対応してない。謎!」ということで、
ゲーム目的での使用を想定して、nキーロールオーバーの問題が起きにくくするために同時押し対策が浸透しているであろうキーを中心に選定されただけだと思います。
一見不便なようでいてハードの知識を意識させない親切設計なのです。
しかしASDWとかゲームによく使うんだからこういうstickとgetkeyの間のような命令はあると便利そう。
|
|
2015/10/1(Thu) 04:30:26|NO.72073
|
|
2015/10/4(Sun) 23:40:37|NO.72114
先日作ったのが思いのほか便利だったのでモジュールにしてみた。
キー入力のタイミングでいろいろ悩まなくてすみます。
ついでにgetkeyでしか取れないキーも追加できるようにしてみました。
#module
;stickキーでいろんなタイミングを取得
; key0:前ループのキーの状態
; key1:今のキーの状態
; key2:押下(トリガータイプとして取得)
; key3:押上
; key4:継続押下
; key5:継続して押していない
#deffunc stickex var key0, var key1, var key2, var key3, var key4, var key5, int addkey
;前ループのキーの状態
key0 = key1
;今のキーの状態
stick key1, 0xFFFFFFFF
;今の状態にキーを追加
key1 |= (addkey & 0xFFFFF800)
;押下(トリガータイプとして取得)
key2 = key0 ^ 0xFFFFFFFF & key1
;押上
key3 = key0 & (key1 ^ 0xFFFFFFFF)
;継続押下
key4 = key0 & key1
;継続して押していない
key5 = key0 | key1 ^ 0xFFFFFFFF
return
#global
*main
redraw 1 : await 120 : redraw 0 : color 255, 255, 255 : boxf : color : pos 0,0
; キー取得
getkey gkey_mouse_center, 4
addkey = gkey_mouse_center<<11 ;ホイールクリックを2048に追加
stickex key0, key1, key2, key3, key4, key5, addkey
; 結果
mes "key0 : " + key0 ;前ループのキーの状態
mes "key1 : " + key1 ;今のキーの状態
mes "key2 : " + key2 ;押下(トリガータイプとして取得)
mes "key3 : " + key3 ;押上
mes "key4 : " + key4 ;継続押下
mes "key5 : " + key5 ;継続して押していない
; 終了
if key2 & 128 : end
goto *main
| |
|
2015/10/9(Fri) 15:19:01|NO.72186
|
|
2015/10/15(Thu) 13:07:42|NO.72315
gradfという命令の存在を知ったので、
グラデーション付文字列表示命令を作ってみました。
なんかposで指定した座標は適用されるのに、
フォントやフォントサイズが適用されないですが。
#module
/*
gmes string,muki,c1,c2
string 表示文字列
muki 縦か横か
c1 色1
c2 色2
muki c1 c2はgradfの第四パラ以降と同じ
*/
#deffunc gmes str string,int muki,int c1,int c2
nowid=ginfo(3):nowx=ginfo(22):nowy=ginfo(23)
screen 32
gr=ginfo_r:gg=ginfo_g:gb=ginfo_b
mes string
mx=ginfo_mesx:my=ginfo_mesy
width mx*2,my
pos mx,0
color 0,0,0
boxf
color 255,255,255
mes string
color 0,0,0
color 255,255,255
gradf 0,0,mx,my,muki,c1,c2
gmode 7,mx,my
gsel nowid
gmode 7,mx,my
pos nowx,nowy
gcopy 32,0,0,mx,my
color gr,gg,gb
return
#global
//ここからサンプル
gmes "test",1,$ff0000,$000000
//ここまで
|
|
2015/10/15(Thu) 13:10:00|NO.72316
mesで表示した後、基点座標が下に移動するのに対応してませんでした。
#module
/*
gmes string,muki,c1,c2
string 表示文字列
muki 縦か横か
c1 色1
c2 色2
muki c1 c2はgradfの第四パラ以降と同じ
*/
#deffunc gmes str string,int muki,int c1,int c2
nowid=ginfo(3):nowx=ginfo(22):nowy=ginfo(23)
buffer 32
gr=ginfo_r:gg=ginfo_g:gb=ginfo_b
mes string
mx=ginfo_mesx:my=ginfo_mesy
width mx*2,my
pos mx,0
color 0,0,0
boxf
color 255,255,255
mes string
color 0,0,0
color 255,255,255
gradf 0,0,mx,my,muki,c1,c2
gmode 7,mx,my
gsel nowid
gmode 7,mx,my
pos nowx,nowy
gcopy 32,0,0,mx,my
color gr,gg,gb
pos nowx,nowy+my
return
#global
//ここからサンプル
font "",22
pos 10,10
gmes "test",1,$ff0000,$000000
gmes "test",1,$ff0000,$000000
gmes "test",1,$ff0000,$000000
//ここまで
|
|
2015/10/15(Thu) 13:13:15|NO.72317
連投すいません。
さっき投稿したのは、改造、再配布してもいいとします。
他サイトへの転載も大丈夫です。
|
|
2015/10/15(Thu) 23:22:04|NO.72333
現在font命令で設定されている情報を取得する
別のモジュールで使おうと思って書きました
ライセンスは NYSL 0.9982 でパブリックドメインと同じです(自己責任で好きなようにしてください)
//curfontinfo p1
//p1=0~2(0) : 取得モード
//p1=0:文字列としてフォント名を返します(FONT命令の第1パラメータに渡されている文字列)
//p1=1:font命令の第3パラメータに渡されている数値を返します
//p2=2:現在のフォントサイズを返します(FONT命令の第2パラメータに渡されている数値)
#module
#define FW_REGULAR 400
#define FW_BOLD 700
#define ANTIALIASED_QUALITY 4
#defcfunc curfontinfo int p1, local fontstyle, local fontname, local bmscr, local logfont
mref bmscr,67
dupptr logfont,varptr(bmscr)+196,60//LOGFONT構造体
if p1==1{
sdim fontname,32
memcpy fontname,logfont,32,,28//フォント名のコピー
return fontname
}
if p1==2 : return 0-logfont.0//LOGFONT構造体のパラメータとfont命令のパラメータとは正負が逆になっているので
dim fontstyle,1
if logfont.4==FW_BOLD : fontstyle+=font_bold//太文字かどうか
//ビット演算でもできそうだが余計ややこしくなったのでこのまま
if peek(logfont.5,0) : fontstyle+=font_italic//イタリック体かどうか
if peek(logfont.5,1) : fontstyle+=font_underline//下線
if peek(logfont.5,2) : fontstyle+=font_strikeout//打消し線
if peek(logfont.6,2)==ANTIALIASED_QUALITY : fontstyle+=font_antialias//アンチエイリアスをかけるかどうか
return fontstyle
#global
//使用例
font "MS UI Gothic", 30, 4 + 16+1
mes "font命令へのパラメータ:"+curfontinfo(0)
mes "選択されているフォント名:"+curfontinfo(1)
mes "指定されているフォントサイズ:"+curfontinfo(2)
| |
|
2015/10/18(Sun) 14:50:33|NO.72362
Base64のモジュールにデバッグ用の数字が残っていました
241行目「tmp.1=peek( b64table,tmp.0+5)」
この行は「tmp.1=peek( b64table,tmp.0)」の間違いです
ホームページに置いてあるモジュールは修正しました
Base64のモジュールを機械語を使うようにしました
機械語部分はBCC5.5でコンパイルしました
機械語部分にはコンパイラ付属のライブラリやヘッダファイルなどは使用していません
ライセンスは NYSL 0.9982 でパブリックドメインと同じです(自己責任で好きなようにしてください)
反省としては構造体を使ったほうがもっとシンプルに書けたと思います(単純にHSPから書き換えただけなので構造体を使っていない)
基本的に機械的にHSPのソースを単純に書き換えただけですが計算式を少し変えています
巨大なデータを扱う際にそれなりに機械語を使わないバージョンよりは速いと思います
機械語を使わないバージョンと使い方は同じです
http://nopswebpages.webcrow.jp/apps/b64decmc.lzh
HSPWikiのモジュール一覧に自分の書いたモジュールのことは勝手に書き込んでいいものでしょうか
|
|
2015/10/18(Sun) 20:13:23|NO.72368
> Noapさん
積極的に書き込むと良いと思います。
同時にHSPWikiに書き込むことによって、どこかのHSPユーザの助けになることができます。
また、今HSPWikiに必要なのは活気だと思うので、積極的に書き込んでほしいです。
|
|
2015/10/19(Mon) 16:55:34|NO.72377
Noapさんのモジュールはパブリックドメインとのことなので、
さっそくグラデーション付文字列描画モジュールに組み込んでみました。
主に変更されたのは、
・font命令でフォントなどが指定できるようになった。
の一点だけ
//curfontinfo p1
//p1=0~2(0) : 取得モード
//p1=0:文字列としてフォント名を返します(FONT命令の第1パラメータに渡されている文字列)
//p1=1:font命令の第3パラメータに渡されている数値を返します
//p2=2:現在のフォントサイズを返します(FONT命令の第2パラメータに渡されている数値)
#module
#define FW_REGULAR 400
#define FW_BOLD 700
#define ANTIALIASED_QUALITY 4
#defcfunc curfontinfo int p1, local fontstyle, local fontname, local bmscr, local logfont
mref bmscr,67
dupptr logfont,varptr(bmscr)+196,60//LOGFONT構造体
if p1==1{
sdim fontname,32
memcpy fontname,logfont,32,,28//フォント名のコピー
return fontname
}
if p1==2 : return 0-logfont.0//LOGFONT構造体のパラメータとfont命令のパラメータとは正負が逆になっているので
dim fontstyle,1
if logfont.4==FW_BOLD : fontstyle+=font_bold//太文字かどうか
//ビット演算でもできそうだが余計ややこしくなったのでこのまま
if peek(logfont.5,0) : fontstyle+=font_italic//イタリック体かどうか
if peek(logfont.5,1) : fontstyle+=font_underline//下線
if peek(logfont.5,2) : fontstyle+=font_strikeout//打消し線
if peek(logfont.6,2)==ANTIALIASED_QUALITY : fontstyle+=font_antialias//アンチエイリアスをかけるかどうか
return fontstyle
#global
#module
/*
gmes string,muki,c1,c2
string 表示文字列
muki 縦か横か
c1 色1
c2 色2
muki c1 c2はgradfの第四パラ以降と同じ
*/
#deffunc gmes str string,int muki,int c1,int c2
nowid=ginfo(3):nowx=ginfo(22):nowy=ginfo(23)
font1=curfontinfo(0)
font2=curfontinfo(2)
font3=curfontinfo(1)
buffer 32
font font3,font2,font1
gr=ginfo_r:gg=ginfo_g:gb=ginfo_b
mes string
mx=ginfo_mesx:my=ginfo_mesy
width mx*2,my
pos mx,0
color 0,0,0
boxf
color 255,255,255
mes string
color 0,0,0
color 255,255,255
gradf 0,0,mx,my,muki,c1,c2
gmode 7,mx,my
gsel nowid
gmode 7,mx,my
pos nowx,nowy
gcopy 32,0,0,mx,my
color gr,gg,gb
pos nowx,nowy+my
return
#global
//ここからサンプル
font "",100
pos 10,10
gmes "test",1,$00ff00,$0000ff
gmes "test",1,$0000ff,$ff00ff
gmes "test",1,$ff00ff,$ffffff
//ここまで
ここで、このスレッドを見ている人にお願いがあります。
このモジュールは、
・gcopyのときに透過色コピーしてない。
・エスケープシーケンスが使えない。
という2点が問題となっています。
誰かこの2点を解決できませんか?
| |
|
2015/10/23(Fri) 23:27:35|NO.72457
おそらくエスケープシーケンスが使えないとは改行ができないということだとginfo_mesyは一行分なのでそれが原因です(bufferをscreenに置きかえてwidthの数値を変えるとわかります)
ほかにも直したい点があるので気が向けば書いてみます
このスレッドに投稿したスクリプトですがソースのみなのでNYSL 0.9982のD項に反する気もしますがパブリックドメインとして考えてください
このスレッドに投稿したスクリプトの中で特に何もライセンスを決めていないのはパブリックドメインとして扱ってください
URLを書いてある場合は基本的にURL先が最新です
TrueTypeFontファイルからフォント名を取得する
いちおうフォント名以外(著作権表記等)も取得できます
それなりに実用的だと思います(自画自賛)
http://nopswebpages.webcrow.jp/apps/fontname.txt
|
|
2015/10/23(Fri) 23:49:36|NO.72458
それが、¥tとかも使えないんですよ。なぜだろう。
ginfo_mesyって1行分しか認識しないんですか。
そんな原因があるとは。調べが足りませんでした。
それがわかれば改行コードには対応出来そうです。
¥nと¥rってなんか動作分けた方がいいですか?
確か厳密に違いが決められてたような…
と言ってもhspでは違いがなかった気もしますが。
|
|
2015/10/24(Sat) 07:50:40|NO.72459
とりあえず、
改行コードに対応させてみました。
相変わらず透過しないし、\t使えないけど。
調べてみたところ、\"や\\は使えるみたいです。
どうして\tは使えないんだろう。
//curfontinfo p1
//p1=0~2(0) : 取得モード
//p1=0:文字列としてフォント名を返します(FONT命令の第1パラメータに渡されている文字列)
//p1=1:font命令の第3パラメータに渡されている数値を返します
//p2=2:現在のフォントサイズを返します(FONT命令の第2パラメータに渡されている数値)
#module
#define FW_REGULAR 400
#define FW_BOLD 700
#define ANTIALIASED_QUALITY 4
#defcfunc curfontinfo int p1, local fontstyle, local fontname, local bmscr, local logfont
mref bmscr,67
dupptr logfont,varptr(bmscr)+196,60//LOGFONT構造体
if p1==1{
sdim fontname,32
memcpy fontname,logfont,32,,28//フォント名のコピー
return fontname
}
if p1==2 : return 0-logfont.0//LOGFONT構造体のパラメータとfont命令のパラメータとは正負が逆になっているので
dim fontstyle,1
if logfont.4==FW_BOLD : fontstyle+=font_bold//太文字かどうか
//ビット演算でもできそうだが余計ややこしくなったのでこのまま
if peek(logfont.5,0) : fontstyle+=font_italic//イタリック体かどうか
if peek(logfont.5,1) : fontstyle+=font_underline//下線
if peek(logfont.5,2) : fontstyle+=font_strikeout//打消し線
if peek(logfont.6,2)==ANTIALIASED_QUALITY : fontstyle+=font_antialias//アンチエイリアスをかけるかどうか
return fontstyle
#global
#module
/*
gmes string,muki,c1,c2
string 表示文字列
muki 縦か横か
c1 色1
c2 色2
muki c1 c2はgradfの第四パラ以降と同じ
*/
#deffunc local gmes2 str string,int muki,int c1,int c2
nowid=ginfo(3):nowx=ginfo(22):nowy=ginfo(23)
font1=curfontinfo(0)
font2=curfontinfo(2)
font3=curfontinfo(1)
buffer 32
font font3,font2,font1
gr=ginfo_r:gg=ginfo_g:gb=ginfo_b
mes string
mx=ginfo_mesx:my=ginfo_mesy
width mx*2,my
pos mx,0
color 0,0,0
boxf
color 255,255,255
mes string
color 0,0,0
color 255,255,255
gradf 0,0,mx,my,muki,c1,c2
gmode 7,mx,my
gsel nowid
gmode 7,mx,my
pos nowx,nowy
gcopy 32,0,0,mx,my
color gr,gg,gb
pos nowx,nowy+my
return
#deffunc gmes str string,int muki,int c1,int c2
s=string
strrep s,"\n\r","\r"
strrep s,"\r","\n"
split s,"\n",ss
foreach ss
gmes2@m1 ss(cnt),muki,c1,c2
await 1
loop
return
#global
//ここからサンプル
font "",100
pos 10,10
gmes "test\ntest",1,$00ff00,$0000ff
//ここまで
| |
|
2015/10/24(Sat) 22:44:31|NO.72483
> どうして\tは使えないんだろう。
gmes2命令を以下のものに書き換えれば、tab文字も反映されます。
buffer命令で引数省略時は 640x480の描画エリアが設定されますが、
タブ文字を入れると、幅640pxを大きく超えてしまう場合があります。
mes命令で描画するだけなら、はみだしても問題ありません。
しかし、gcopy命令で画像コピーをしている処理があり、
これが原因で領域外の画像コピーをしようとし、システムエラーで落ちているようです。
#deffunc local gmes2 str string,int muki,int c1,int c2
nowid=ginfo(3):nowx=ginfo(22):nowy=ginfo(23)
font1=curfontinfo(0)
font2=curfontinfo(2)
font3=curfontinfo(1)
buffer 32
font font3,font2,font1
gr=ginfo_r:gg=ginfo_g:gb=ginfo_b
mes string
mx=ginfo_mesx:my=ginfo_mesy
buffer 32, mx*2, my
font font3,font2,font1
pos mx,0
color 0,0,0
boxf
color 255,255,255
mes string
color 0,0,0
color 255,255,255
gradf 0,0,mx,my,muki,c1,c2
gmode 7,mx,my
gsel nowid
gmode 7,mx,my
pos nowx,nowy
gcopy 32,0,0,mx,my
color gr,gg,gb
pos nowx,nowy+my
return
|
|
2015/10/26(Mon) 08:41:13|NO.72515
返事が遅くなってしまい、すいません。
\tが使えることを確認しました。なるほどウィンドウ外をコピーしようとしたのですね。
なんで透過できてるんだろうか。
|
|
2015/10/30(Fri) 23:09:10|NO.72639
忘れていました。
あの後すぐ手をつけたのですがそのまま忘れていました。結果としてinoviaさんのスクリプトと同じようになっています。なのでいまさら投稿するのはあまり意味はないかもしれませんが投稿します。一応メリットとしてはウィンドウIDを消費しないメリットがあります。
#module
#uselib "msimg32.dll"
#func GradientFill "GradientFill" sptr,var,int,sptr,int,int
#uselib "gdi32.dll"
//#func GradientFill "GdiGradientFill" sptr,var,int,sptr,int,int
//Windows2000以降ならこちらでも可(機能は同じ わざわざmsimg32を呼び出さなくて済むというだけ)
#func BitBlt "BitBlt" sptr,int,int,int,int,sptr,int,int,int
#func DeleteObject "DeleteObject" sptr
#func DeleteDC "DeleteDC" sptr
#cfunc CreateFontIndirect "CreateFontIndirectA" sptr
#cfunc CreateCompatibleBitmap "CreateCompatibleBitmap" sptr,int,int
#cfunc CreateCompatibleDC "CreateCompatibleDC" sptr
#cfunc SelectObject "SelectObject" sptr,sptr
#uselib "user32.dll"
#func DrawText "DrawTextW" sptr,wptr,int,sptr,int
#define DT_CALCRECT $00000400
#define SRCAND $008800C6
///#define SRCERASE $00440328
#define SRCPAINT $00EE0086
//#define SRCCOPY $00CC0020
//COLORREF型から各色の数値を取り出す(0=赤 1=緑 2=青)(wpeekでいい)
#define ctype COLORREF2RGB(%1,%2) ((%1>>(%2*8)) & $0000FF )
#deffunc _gmeskae2 str p1, int p2, int color1, int color2, local bmscr, local statbak, local rect, local hdca, local trivertex, local fontobj, local bitobj, local bitobjbak, local fontobjbak
//localはつけ外ししてください
dim rect,4
dim trivertex,8
statbak=stat
mref bmscr,67
//rect(0)=0 : rect(1)=0
DrawText hdc,p1,-1,varptr(rect),DT_CALCRECT
hdca=CreateCompatibleDC(hdc)
if hdca==0 : return statbak
bitobj=CreateCompatibleBitmap(hdc,rect(2),rect(3)*2)
if bitobj==0 : DeleteDC hdca : return statbak
bitobjbak=SelectObject(hdca,bitobj)
fontobj=CreateFontIndirect(varptr(bmscr(49)))
if fontobj!=0 : fontobjbak=SelectObject(hdca,fontobj)
//TRIVERTEX構造体
//trivertex(0)=rect(0) : trivertex(1)=rect(1)
//16ビットで色を指定するため(なぜ16ビットなのかは知らない)
lpoke trivertex(2),,((COLORREF2RGB(color1,0)<<8) & $0000FF00 ) | ((COLORREF2RGB(color1,1)<<24) & $FF000000 )
lpoke trivertex(3),,COLORREF2RGB(color1,2)<<8 & $0000FF00
trivertex(4)=rect(2) : trivertex(5)=rect(3)
lpoke trivertex(6),,((COLORREF2RGB(color2,0)<<8) & $0000FF00 ) | ((COLORREF2RGB(color2,1)<<24)& $FF000000 )
lpoke trivertex(7),,COLORREF2RGB(color2,2)<<8 &$0000FF00
rect(1)=rect(3) : rect(3)+=rect(3)
DrawText hdca,p1,-1,varptr(rect)
rect(0)=0 : rect(1)=1//GRADIENT_RECT構造体
GradientFill hdca,trivertex,2,varptr(rect),1,p2
rect(1)=0 : rect(3)/=2
BitBlt hdca,0,0,rect(2),rect(3),hdca,0,rect(3),SRCPAINT
//BitBlt hdca,0,0,rect(2),rect(3),hdc,ginfo_cx,ginfo_cy,SRCAND
//BitBlt hdc,ginfo_cx,ginfo_cy,rect(2),rect(3),hdca,0,0,SRCCOPY
BitBlt hdc,ginfo_cx,ginfo_cy,rect(2),rect(3),hdca,0,0,SRCAND
bitobjbak=SelectObject(hdca,bitobjbak)
if fontobj!=0 : fontobjbak=SelectObject(hdca,fontobjbak) : DeleteObject fontobj
DeleteObject bitobj
DeleteDC hdca
pos ginfo_cx,ginfo_cy+rect(3)
redraw peek(bmscr(19),2)
return statbak
#global
#define gmes(%1="",%2=0,%3=0,%4=0) _gmeskae2 ""+%1,%2,%3,%4
//使用例
#define GRADIENT_FILL_RECT_H 0
#define GRADIENT_FILL_RECT_V 1
//RGBの数値をCOLORREF型の数値に変換
#define ctype RGB2COLORREF(%1,%2,%3) (((%3<<16) & $FF0000) | ((%2<<8) & $00FF00) | %1)
font "",30
color 0,0,255
line 10,100,310,280
color 0,255,0
line 400,100,100,240
color 255
line 260,100,260,320+20
color
pos 100,150
gmes "ああああああああああ",GRADIENT_FILL_RECT_H,RGB2COLORREF(255,100,255),RGB2COLORREF(0,255,0)
font "",40
gmes "みそしるおいしい",GRADIENT_FILL_RECT_V,RGB2COLORREF(255,100,0),RGB2COLORREF(255,255,255)
font "Segoe UI Symbol",20
sdim buf,24
buf="あ"//代替表示
poke buf,2,'I'
wpoke buf,3,$96F2
wpoke buf,5,$99F1
poke buf,7,"み"
wpoke buf,9,$FBF0
wpoke buf,11,$EDF0
wpoke buf,13,$F4F0
wpoke buf,15,$F0F0
wpoke buf,17,$9AF1
wpoke buf,19,$8AF1
wpoke buf,21,$E9F1
gmes buf,GRADIENT_FILL_RECT_H,RGB2COLORREF(0,100,255),RGB2COLORREF(0,255,255)
font "",40
gmes 1000000000,GRADIENT_FILL_RECT_H,RGB2COLORREF(255,100,255),RGB2COLORREF(255,255,255)
mes "豆腐とわかめ"
| |
|
2015/10/30(Fri) 23:51:05|NO.72641
もちろんタブもどのエスケープシーケンスも大丈夫です
|
|
2015/11/1(Sun) 09:24:10|NO.72671
ビット演算で足し算と引き算をしてみました
昨日別のスレッドに回答しているときに思いついて書いてみました
何かの役に立つかは分かりません
負の数字がどうしてビット反転しているのかわかった気がします
num1=23//0b10111
num2=4//0b100
//足し算
gosub *plus
mes ""+num1+"+"+num2+"="+ans
num1=46
num2=7
//引き算
num2=(num2^$FFFFFFFF) | $00000001//反転させて符号を変える
gosub *plus
num2=(num2^$FFFFFFFF) | $00000001
mes ""+num1+"-"+num2+"="+ans
stop
*plus
ans=0
tmp=$00000001
crr=0
//i=$FFFFFFFF
while tmp
if (num1 ^ num2) & tmp{
if crr{
ans^=tmp
//crr=(tmp<<1) & $FFFFFFFE
}else{
ans|=tmp
}
}else{
if (num1 & num2) & tmp{
crr=1//(tmp<<1) & $FFFFFFFE
}else{
crr=0
}
}
if crr: ans|=((tmp<<1) & $FFFFFFFE)//繰り上げ
tmp=(tmp<<1) & $FFFFFFFE
//i=(i>>1)& $7FFFFFFF
wend
return
|
|
2015/11/1(Sun) 13:11:29|NO.72673
HSPWikiにわたしのモジュールの項目を編集、追加し、「HSPTV!掲示板に公開されたモジュール」の項目がしばらく更新されていなかったので勝手に更新しましたがよろしかったですか。
またライセンスごとに別途項目を作成しライセンスごとに分ければモジュールを使いやすくなるかもしれないと思いますがどうなのですか。勝手に作成していいのでしょうか。ただわたしとkanamaruさんがパブリックドメインとして投稿している以外には、他の方のモジュールには明記されていない?のであまり意味がないかもしれません。
管理者でも何でもないわたしが勝手にそのような項目を作成していいのかは不安です。
|
|
2015/11/1(Sun) 20:05:48|NO.72682
hsp3clで時間制限つき入力待ち
ゲームをつくるときに使えるかもしれないです
#runtime "hsp3cl"
#uselib "crtdll.dll"
#func printf "printf" str
#cfunc getch "_getch"
#cfunc kbhit "_kbhit"
jikan=5000
mes "文字(キー)コードの取得 取得できないキーもあります"
printf "5秒以内に何かキーを押してください(スペースで終了):"
while jikan>0
if kbhit(){
//getchでキーバッファの消去も行う
keycode=getch()
printf "\n"
if keycode==' ':_break
if ((keycode>=$81) & (keycode<=$9F)) | ((keycode>=$E0) & (keycode<=$EF)){
printf "日本語入力はやめてください"//日本語入力をするとすぐに強制終了する
end
}else{
//一部キーは2バイトで返されるので2回目が実際のキーコード
if (keycode==$E0) | (keycode==0) :keycode=getch()
printf "コードは"+keycode+"です:"
}
}
jikan-=10
await 10
wend
mes ""
end
おまけ
#runtime "hsp3cl"
#uselib "crtdll.dll"
#cfunc kbhit "_kbhit"
#func getch "_getch"
#func printf "printf" str
printf "何かキーを押すと「無限ループ」と表示します:"
repeat
if kbhit(){
getch//これを消すとキーバッファーがそのままなのでいったんキーを押すと延々と無限ループが表示されます
printf "\n無限ループ:"
}
await 10
loop
|
|
2015/11/1(Sun) 22:09:50|NO.72688
ちなみに上のスクリプトでは日本語入力をした場合強制終了にするようにしましたが、エラーにするだけでいいのであればもういちどgetchを呼ぶといいです(確認のキーとキーバッファーのクリアをかねている)
#runtime "hsp3cl"
#uselib "crtdll.dll"
#func printf "printf" str
#cfunc getch "_getch"
#cfunc kbhit "_kbhit"
#func getchar "getchar"
jikan=5000
mes "文字(キー)コードの取得 取得できないキーもあります"
printf "5秒以内に何かキーを押してください(スペースで終了):"
while jikan>0
flag=0
if kbhit(){
//getchでキーバッファの消去も行う
keycode=getch()
printf "\n"
if keycode==' ':_break
while ((keycode>=$81) & (keycode<=$9F)) | ((keycode>=$E0) & (keycode<=$EF))
printf "\r日本語入力はやめてください 続けるには何かキーを押してください:"
keycode=getch()
flag=1
wend
if flag!=1{
//一部キーは2バイトで返されるので2回目が実際のキーコード
if (keycode==$E0) | (keycode==0) :keycode=getch()
printf "コードは"+keycode+"です:"
}
}
jikan-=10
await 10
wend
mes ""
end
|
|
2015/11/1(Sun) 23:08:36|NO.72694
改行しないmes
#module
#uselib "crtdll.dll"
#func printf "printf" str
#deffunc _mes2crtdll str p1, local buf, local statbak
statbak=stat
buf=p1
strrep buf,"%","%%"
printf buf
return statbak
#global
#define mes2(%1="") _mes2crtdll ""+%1
#runtime "hsp3cl"
mes2 "a%a"
mes2
mes2 12
|
|
2015/11/2(Mon) 00:22:32|NO.72696
「hsp3clで時間制限付きキー入力待ち」について
矢印キーを取得できていなかったり、いろいろとおかしかったので直しました。
#runtime "hsp3cl"
#uselib "crtdll.dll"
#func printf "printf" str
#cfunc getch "_getch"
#cfunc kbhit "_kbhit"
#uselib "winmm.dll"
#cfunc timeGetTime "timeGetTime"
jikan=timeGetTime()+5000
printf "文字(キー)コードの取得 取得できないキーもあります"
printf "\n5秒以内に何かキーを押してください(スペースで終了):"
while jikan>0
flag=0
if kbhit(){
//getchでキーバッファの消去も行う
keycode=getch()
if keycode==' ': _break
if (keycode==$E0) | (keycode==0): keycode=getch()
while ((keycode>=$81) & (keycode<=$9F)) | ((keycode>=$E0) & (keycode<=$EF))
if flag{
printf "\r半角英数で入力してください:"
keycode=getch()
}else{
printf "\n"
flag=1
}
wend
printf "\nただいま押されたコードは"+keycode+"です:"
}
if timeGetTime()>=jikan: _break
wend
printf "\n終了\n"
|
|
2015/11/2(Mon) 06:32:05|NO.72700
パズルゲームなどに使えると思います
|
|
2015/11/2(Mon) 11:06:14|NO.72701
あと少しで200か・・・・・
|
|
2015/11/2(Mon) 22:14:06|NO.72711
上のスクリプトはCで考えたのをHSPで書いたのですが、日本語入力をされた時にキーバッファにデータが残っていてそのままでは挙動がおかしくなるのでgetchでバッファーの先頭をクリアしようと思ったわけですが、
キーバッファーにデータが残っているならばkbitで1が返ってくると思ったのですが0が返ってきました。不思議です。
とりあえずクリアはできているのでいいですが。
メモとして Cのコード
#include <stdio.h>
#include <conio.h>
int main(void){
int keycode;
char flag;
printf("何かキーを押してください(スペースで終了):");
for (;;){
flag=1;
if(kbhit()){
keycode=(unsigned char)getch();
if ((keycode==0xE0) | (keycode==0)) keycode=getch();
while (((keycode>=0x81) & (keycode<=0x9F)) | ((keycode>=0xE0) & (keycode<=0xEF))){
if (flag){
flag=0;
printf("\n");
}
printf("\r全角文字はお止めください:");/*(kbhit=%d):",kbhit());*/
keycode=getch();
}
if (flag){
if (keycode==' ') break;
printf("\nコードは%dです:",keycode);
}else{
printf("\n:");
}
}
}
puts("\nおしまい");
return 0;
}
|
|
2015/11/8(Sun) 07:57:56|NO.72839
キーバッファーはこの解釈であっているのかは自信はないです。
ビット演算についてかなりの勘違いをしていました。すみません。
mes ($80000000>>31) & $00000001
$80000000は2進法で10000000,00000000,00000000,00000000
HSPの右シフトは算術シフトなので(左シフトは論理シフトと算術シフトの違いはないらしい)先頭の符号のビットと同じ数値(マイナスだと1)が左側のあいた部分に入る。つまり負の値を扱う場合は結果が異なるはずです。
しかし今まで算術シフトでは、右シフトの場合一番右のビットの数値が左側のあいた部分に入り、左シフトの場合一番左の数値が右側の空いた部分に入ると思っていました。
mes ($80000001>>31) & $00000001//こういうように勘違いしていた
今までビットマスクで取り出していたり、そうでない場合も正の数と0しか扱っていなかったので気が付かなかったようです。
今までこのスレッドに投稿したスクリプトには余計なビットマスクがあったりしますが、動作に問題はないと思います。
もしも見ていたらでいいのでわたしの書いたgmes( http://hsp.tv/play/pforum.php?mode=all&num=70762#72639)はkanamaruさんが考えていた通りなのか教えてくれませんか。
|
|
2015/11/9(Mon) 06:04:12|NO.72880
//RGBの数値をCOLORREF型の数値に変換
#define ctype RGB2COLORREF(%1,%2,%3) (((%3<<16) & $FF0000) | ((%2<<8) & $00FF00) | %1)
//COLORREF型から各色の数値を取り出す(0=赤 1=緑 2=青)(wpeekでいい)
#define ctype COLORREF2RGB(%1,%2) ((%1>>(%2*8)) & $0000FF )
|
|
2015/11/9(Mon) 07:52:10|NO.72882
noapさん、返事が遅くなってしまい、すいませんでした。
海の向こうに行っていたので。(wifiくそ遅かったし、パソコンないし)
こちらで実行してみました。こちらの想定通りの動作でした。
いったいどんな仕組みなのやら僕にはわかりませんが。
一つだけわかるのは、str,int,doubleに対応してるってことぐらいです。
|
|
2015/11/10(Tue) 00:07:35|NO.72905
返答ありがとうございます。寝ていてふと気がついたのですが上記のスクリプトではいろいろと問題点があった(タブが使えないなど)ので直しました。いろいろと引数をなぜか忘れていました。ただいろいろと試しましたがmesと微妙にタブの挙動が異なります。
#module
#uselib "msimg32.dll"
#func GradientFill "GradientFill" sptr,var,int,sptr,int,int
#uselib "gdi32.dll"
//#func GradientFill "GdiGradientFill" sptr,var,int,sptr,int,int
//Windows2000以降ならこちらでも可(機能は同じ わざわざmsimg32を呼び出さなくて済むというだけ)
#func BitBlt "BitBlt" sptr,int,int,int,int,sptr,int,int,int
#func DeleteObject "DeleteObject" sptr
#func DeleteDC "DeleteDC" sptr
#cfunc CreateFontIndirect "CreateFontIndirectA" sptr
#cfunc CreateCompatibleBitmap "CreateCompatibleBitmap" sptr,int,int
#cfunc CreateCompatibleDC "CreateCompatibleDC" sptr
#cfunc SelectObject "SelectObject" sptr,sptr
#cfunc GetStockObject "GetStockObject" int
#uselib "user32.dll"
#func DrawTextEx "DrawTextExW" sptr,wptr,int,sptr,int,sptr
#func FillRect "FillRect" sptr,sptr,sptr
#define DT_CALCRECT $00000400
#define DT_NOPREFIX $00000800
#define DT_EXPANDTABS $00000040
#define DT_NOCLIP $00000100
#define DT_TABSTOP $00000080
#define SRCAND $008800C6
///#define SRCERASE $00440328
#define SRCPAINT $00EE0086
//#define SRCCOPY $00CC0020
#define WHITE_BRUSH $00000000
//COLORREF型から各色の数値を取り出す(0=赤 1=緑 2=青)(wpeekでいい)
#define ctype COLORREF2RGB(%1,%2) ((%1>>(%2*8)) & $0000FF )
#deffunc _gmeskae2 str p1, int p2, int color1, int color2, local bmscr, local statbak, local rect, local drawtextexprms, local hdca, local trivertex, local fontobj, local bitobj, local bitobjbak, local fontobjbak
//localはつけ外ししてください
dim rect,4
dim trivertex,8
statbak=stat
mref bmscr,67
dim drawtextexprms,5
drawtextexprms=20,8,0,0,0
//文字を表示するのに必要な面積
DrawTextEx hdc,p1,-1,varptr(rect),DT_CALCRECT | DT_NOPREFIX | DT_EXPANDTABS | DT_NOCLIP | DT_TABSTOP,varptr(drawtextexprms)
hdca=CreateCompatibleDC(hdc)
if hdca==0 : return statbak
bitobj=CreateCompatibleBitmap(hdc,rect(2),rect(3)*2)
if bitobj==0 : DeleteDC hdca : return statbak
bitobjbak=SelectObject(hdca,bitobj)
fontobj=CreateFontIndirect(varptr(bmscr(49)))
if fontobj!=0 : fontobjbak=SelectObject(hdca,fontobj)
//TRIVERTEX構造体
//trivertex(0)=rect(0) : trivertex(1)=rect(1)
//16ビットで色を指定するため(なぜ16ビットなのかは知らない)
lpoke trivertex(2),,((COLORREF2RGB(color1,0)<<8) & $0000FF00 ) | ((COLORREF2RGB(color1,1)<<24) & $FF000000 )
lpoke trivertex(3),,COLORREF2RGB(color1,2)<<8 & $0000FF00
trivertex(4)=rect(2) : trivertex(5)=rect(3)
lpoke trivertex(6),,((COLORREF2RGB(color2,0)<<8) & $0000FF00 ) | ((COLORREF2RGB(color2,1)<<24)& $FF000000 )
lpoke trivertex(7),,COLORREF2RGB(color2,2)<<8 &$0000FF00
//元となる文字
rect(1)=rect(3) : rect(3)+=rect(3)
FillRect hdca,varptr(rect),GetStockObject(WHITE_BRUSH)
DrawTextEx hdca,p1,-1,varptr(rect),DT_NOPREFIX | DT_EXPANDTABS | DT_NOCLIP | DT_TABSTOP,varptr(drawtextexprms)
//グラデーション
rect(0)=0 : rect(1)=1//GRADIENT_RECT構造体
GradientFill hdca,trivertex,2,varptr(rect),1,p2
//グラデーション文字の作成
rect(1)=0 : rect(3)/=2
BitBlt hdca,0,0,rect(2),rect(3),hdca,0,rect(3),SRCPAINT
//HSPのウィンドウにコピー
BitBlt hdc,ginfo_cx,ginfo_cy,rect(2),rect(3),hdca,0,0,SRCAND
bitobjbak=SelectObject(hdca,bitobjbak)
if fontobj!=0 : fontobjbak=SelectObject(hdca,fontobjbak) : DeleteObject fontobj
DeleteObject bitobj
DeleteDC hdca
pos ginfo_cx,ginfo_cy+rect(3)
redraw peek(bmscr(19),2)
return statbak
#global
#define gmes(%1="",%2=0,%3=0,%4=0) _gmeskae2 ""+%1,%2,%3,%4
screen 0,1024,724
font "",30
pos 100,150
mes "あ\tあ&あ\nあああ&ああtd\tあlplp"
mes "qiaklsd\tjevllllllll"
mes "\taa"
mes "a\ta"
mes "aaaaa\ta\nああ\tdd\nあああ\tあ"
pos 500,150
gmes "あ\tあ&あ\nあああ&ああtd\tあlplp",0,$FF0000,$0000FF
gmes "qiaklsd\tjevllllllll",0,$FF0000,$FF00FF
gmes "\taa",0,$0000FF,$00FFFF
gmes "a\ta",0,$FF0000,$0000FF
gmes "aaaaa\ta\nああ\tdd\nあああ\tあ",0,$00FF00,$0000FF
| |
|
2015/11/10(Tue) 08:25:29|NO.72911
気づかなかったけど、\n使った時の動作が不便です。
あまりないかもしれませんが、
\nを三個とか使っちゃうと最後の行とかほとんどグラデーション
しなくなる。(四個だともう最後の行はグラデーションしてないようにしか見えない)
僕の作ったやつはだから一行ごとに分離して描画しています。
|
|
2015/11/10(Tue) 23:54:38|NO.72938
HSV値・色輝度の取得関数です。
/***************************************************************
■ col_GetHsv( RGB値, Hue最大値[192] ) = $HHHHSSVV
$RRGGBB のように16進数6桁で指定されたRGB値を、HSV値に変換して返します。
RGB値を省略(-1)した場合、現在の色のHSV値を返します。
Hueの最大値には 12〜65536 を指定できます。既定値はHSP準拠の 192 です。
戻り値は無理矢理1つにまとめてるので、分解して取り出す必要があります。
例] HSV = col_GetHsv()
H = (HSV>>16) & $ffff : S = (HSV>>8) & $ff : V = HSV & $ff
※RGBとHSVの変換は計算上どうしても誤差が出ます
■ col_GetBright( RGB値 ) = 色輝度 [0〜255]
$RRGGBB のように16進数6桁で指定されたRGB値の、色輝度を返します。
RGB値を省略(-1)した場合、現在の色の色輝度を返します。
人間の目で感じる色の明るさのようなもので、RGBの平均値とは少し異なります。
算出式自体はすごく簡素です。
***************************************************************/
#ifndef _col_GetHsv
#module
;--HSV値取得($RRGGBB, HueMax[192]) = $HHHHSSVV
#define global cType col_GetHsv(%1=-1,%2=192) _col_GetHsv(%1,%2)
#defcfunc _col_GetHsv int p0, int p1, local a, local f
Dim a,7 :dDim f :a.1=255 :a.6=Limit(p1,12,$10000)
If(p0<0){a.3=gInfo.16,gInfo.17,gInfo.18}else{a.3=p0>>16&$ff,p0>>8&$ff,p0&$ff}
Repeat 3,3 :If(a.cnt<a.1){a.1=a.cnt} :If(a.cnt>a.2){a.2=a.cnt} :Loop
If(a.1==a.2){Return a.2} :a.0=(255*(a.2-a.1)+a.2/2)/a.2,a.2-a.1
If(a.3==a.2){f=1.0*(a.4-a.5)/a.1}else{If(a.4==a.2){f=1.0*(a.5-a.3)/a.1+2.0}else{f=1.0*(a.3-a.4)/a.1+4.0}}
If(f<0.0){f+=6.0}
Return (Int((f*a.6+3.0)/6.0)<<16)|(a.0<<8)|a.2
;--色輝度取得($RRGGBB) = 0〜255
#define global cType col_GetBright(%1=-1) _col_GetBright(%1)
#defcfunc _col_GetBright int p0, local a
If(p0<0){a=gInfo.16,gInfo.17,gInfo.18}else{a=p0>>16&$ff,p0>>8&$ff,p0&$ff}
Return (a.0*77+a.1*150+a.2*29)>>8
#global
#endif
/**** 動作テスト用 ********************************************
*start
Randomize :Screen 0,150,210,2
SysColor 15 :BoxF :Font msGothic,12
ObjSize 60,24 :Pos 90,0 :Button gosub "てすと",*test
gSel 0,1 :Redraw 0
Stop
*test
SysColor 15 :BoxF :Color :BoxF 4,4,83,83
i.0=Rnd(192),Rnd(256),Rnd(256) :HsvColor i.0,i.1,i.2
i.3=col_GetHsv(),col_GetBright() :BoxF 5,5,82,82
s =StrF("RGB : %3d,%3d,%3d\n\n",gInfo.16,gInfo.17,gInfo.18)
s+=StrF("HSV : %3d,%3d,%3d\n",i.3>>16,i.3>>8&$ff,i.3&$ff)
s+=StrF(" <%3d,%3d,%3d>\n\n",i.0,i.1,i.2)
s+=StrF("Bright: %3d <%3d>",i.4,(gInfo.16+gInfo.17+gInfo.18)/3)
HsvColor ,,(i.4<80)*192+32
BoxF 94,44,133,83 :HsvColor ,,i.4 :BoxF 95,45,132,82
SysColor 18 :Pos 4,110 :Mes s :Redraw 1 :Redraw 0
Return
/***************************************************************/
| |
|
2015/11/12(Thu) 05:40:20|NO.72952
kanamaruさんありがとうございます
行ごとにグラデーションを分けるのはわたし的にはとても違和感があったのでこのような仕様にしました
コメントが多くて分かりにくかったと思うのでわかりやすい程度に減らしてみました
普通のmesとずれるのはバッファーと元の画面を大きさを同じにすれば解決できるとは思いますが大した問題ではないのとそれではむだがおおきすぎると思うのでこのままにします
#module
#uselib "msimg32.dll"
#func GradientFill "GradientFill" sptr,var,int,sptr,int,int
#uselib "gdi32.dll"
//#func GradientFill "GdiGradientFill" sptr,var,int,sptr,int,int
//Windows2000以降ならこちらでも可(機能は同じ わざわざmsimg32を呼び出さなくて済むというだけ)
#func BitBlt "BitBlt" sptr,int,int,int,int,sptr,int,int,int
#func DeleteObject "DeleteObject" sptr
#func DeleteDC "DeleteDC" sptr
#cfunc CreateFontIndirect "CreateFontIndirectA" sptr
#cfunc CreateCompatibleBitmap "CreateCompatibleBitmap" sptr,int,int
#cfunc CreateCompatibleDC "CreateCompatibleDC" sptr
#cfunc SelectObject "SelectObject" sptr,sptr
#cfunc GetStockObject "GetStockObject" int
#uselib "user32.dll"
#func DrawTextEx "DrawTextExW" sptr,wptr,int,sptr,int,sptr
#func FillRect "FillRect" sptr,sptr,sptr
#define DT_CALCRECT $00000400
#define DT_NOPREFIX $00000800
#define DT_EXPANDTABS $00000040
#define DT_NOCLIP $00000100
#define DT_TABSTOP $00000080
#define SRCAND $008800C6
///#define SRCERASE $00440328
#define SRCPAINT $00EE0086
//#define SRCCOPY $00CC0020
#define WHITE_BRUSH $00000000
//COLORREF型から各色の数値を取り出す(0=赤 1=緑 2=青)(wpeekでいい)
#define ctype COLORREF2RGB(%1,%2) ((%1>>(%2*8)) & $0000FF )
#deffunc _gmeskae2 str p1, int p2, int color1, int color2, local bmscr, local statbak, local rect, local drawtextexprms, local hdca, local trivertex, local fontobj, local bitobj, local bitobjbak, local fontobjbak
//localはつけ外ししてください
dim rect,4
dim trivertex,8
statbak=stat
mref bmscr,67
dim drawtextexprms,5
drawtextexprms=20,8,0,0,0
//文字を表示するのに必要な面積
DrawTextEx hdc,p1,-1,varptr(rect),DT_CALCRECT | DT_NOPREFIX | DT_EXPANDTABS | DT_NOCLIP | DT_TABSTOP,varptr(drawtextexprms)
hdca=CreateCompatibleDC(hdc)
if hdca==0 : return statbak
bitobj=CreateCompatibleBitmap(hdc,rect(2),rect(3)*2)
if bitobj==0 : DeleteDC hdca : return statbak
bitobjbak=SelectObject(hdca,bitobj)
fontobj=CreateFontIndirect(varptr(bmscr(49)))
if fontobj!=0 : fontobjbak=SelectObject(hdca,fontobj)
//TRIVERTEX構造体
//trivertex(0)=rect(0) : trivertex(1)=rect(1)
//16ビットで色を指定するため(なぜ16ビットなのかは知らない)
lpoke trivertex(2),,((COLORREF2RGB(color1,0)<<8) & $0000FF00 ) | ((COLORREF2RGB(color1,1)<<24) & $FF000000 )
lpoke trivertex(3),,COLORREF2RGB(color1,2)<<8 & $0000FF00
trivertex(4)=rect(2) : trivertex(5)=rect(3)
lpoke trivertex(6),,((COLORREF2RGB(color2,0)<<8) & $0000FF00 ) | ((COLORREF2RGB(color2,1)<<24)& $FF000000 )
lpoke trivertex(7),,COLORREF2RGB(color2,2)<<8 &$0000FF00
rect(1)=rect(3) : rect(3)+=rect(3)
FillRect hdca,varptr(rect),GetStockObject(WHITE_BRUSH)
DrawTextEx hdca,p1,-1,varptr(rect),DT_NOPREFIX | DT_EXPANDTABS | DT_NOCLIP | DT_TABSTOP,varptr(drawtextexprms)
rect(0)=0 : rect(1)=1//GRADIENT_RECT構造体
GradientFill hdca,trivertex,2,varptr(rect),1,p2
rect(1)=0 : rect(3)/=2
BitBlt hdca,0,0,rect(2),rect(3),hdca,0,rect(3),SRCPAINT
BitBlt hdc,ginfo_cx,ginfo_cy,rect(2),rect(3),hdca,0,0,SRCAND
bitobjbak=SelectObject(hdca,bitobjbak)
if fontobj!=0 : fontobjbak=SelectObject(hdca,fontobjbak) : DeleteObject fontobj
DeleteObject bitobj
DeleteDC hdca
pos ginfo_cx,ginfo_cy+rect(3)
redraw peek(bmscr(19),2)
return statbak
#global
#define gmes(%1="",%2=0,%3=0,%4=0) _gmeskae2 ""+%1,%2,%3,%4
#define GRADIENT_FILL_RECT_H 0
#define GRADIENT_FILL_RECT_V 1
//RGBの数値をCOLORREF型の数値に変換
#define ctype RGB2COLORREF(%1,%2,%3) (((%3<<16) & $FF0000) | ((%2<<8) & $00FF00) | %1)
screen 0,1024,724
font "",30
pos 100,450
mes "あ\tあ&あ\nあああ&ああtd\tあlplp"
mes "qiaklsd\tjevllllllll"
mes "\taa"
mes "a\ta"
mes "aaaaa\ta\nああ\tdd\nあああ\tあ"
pos 500,150
gmes "あ\tあ&あ\nあああ&ああtd\tあlplp",0,$FF0000,$0000FF
gmes "qiaklsd\tjevllllllll",0,$FF0000,$FF00FF
gmes "\taa",0,$0000FF,$00FFFF
gmes "a\ta",0,$FF0000,$0000FF
gmes "aaaaa\ta\nああ\tdd\nあああ\tあ",0,$00FF00,$0000FF
font "",30
color 0,0,255
line 10,100,310,280
color 0,255,0
line 400,100,100,240
color 255
line 260,100,260,320+20
color
pos 100,150
gmes "ああああああああああ",GRADIENT_FILL_RECT_H,RGB2COLORREF(255,100,255),RGB2COLORREF(0,255,0)
font "",40
gmes "みそしるおいしい",GRADIENT_FILL_RECT_V,RGB2COLORREF(255,100,0),RGB2COLORREF(255,255,255)
font "Segoe UI Symbol",20
sdim buf,24
buf="あ"//代替表示
poke buf,2,'I'
wpoke buf,3,$96F2
wpoke buf,5,$99F1
poke buf,7,"み"
wpoke buf,9,$FBF0
wpoke buf,11,$EDF0
wpoke buf,13,$F4F0
wpoke buf,15,$F0F0
wpoke buf,17,$9AF1
wpoke buf,19,$8AF1
wpoke buf,21,$E9F1
gmes buf,GRADIENT_FILL_RECT_H,RGB2COLORREF(0,100,255),RGB2COLORREF(0,255,255)
font "",40
gmes 1000000000,GRADIENT_FILL_RECT_H,RGB2COLORREF(255,100,255),RGB2COLORREF(255,255,255)
mes "豆腐とわかめ"
gmes "a\naaa",GRADIENT_FILL_RECT_H,RGB2COLORREF(255,100,255),RGB2COLORREF(255,255,200)//行ごとにわけるとわたしにとっては変な結果にになる
| |
|
2015/11/12(Thu) 13:30:37|NO.72955
言わずにはいられない、200ゲット。
次スレ立てようかとも思ったのですが、
もう出尽くしてるっぽいので取り敢えずは1ヶ月様子見をします。
次はモジュールに限らす様々なちょっとしたソースコードを投稿できるようなスレにする予定です。
|
|
2015/11/12(Thu) 17:12:47|NO.72958
200を取られてしまいました
何かモジュールをつくったら次のスレッドをつくってよろしいですか。
そもそも著作権が発生するようなスクリプトであるかは分かりませんが、次のスレッドではモジュールを扱いやすくなると思うのでライセンスが明記されていない場合はパブリックドメインにすることはどうでしょうか。よくないのであればそれでかまいません。
|
|
2015/11/12(Thu) 18:02:00|NO.72959
>>Noapさん
自分も「特別書いていない場合はパブリックドメイン扱いにします」という風にしようかとも思っていました。
スレを立てるタイミングですが、実はまだ投稿していないモジュールを発見したので、今日中に建てようかと思います。
|
|
2015/11/13(Fri) 23:23:55|NO.72999
|
|
2015/11/13(Fri) 23:25:27|NO.73000
スレッドの名前に使われている言葉の意味
「ちょっとした」
「わざわざそれのためだけにスレッドを新たにつくるほどのスクリプトではないけどみんなに見てもらいたい」という意味らしいです
「スレ」
スレッドという意味らしいです
|
|