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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0814
スペース少し便利になるモジュール204解決


スペース

リンク

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("ホ",文字列,"ッ")," ス")," プ "),"プ")



GENKI

リンク

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



GENKI

リンク

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となる



Flat

リンク

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



toro

リンク

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



mjhd

リンク

2015/8/16(Sun) 06:15:26|NO.70787

昔書いたものです.
設定管理モジュール,プログラムの設定を管理したり,ファイルに書き出したり読み込んだりできます.
sqlele.hsp使ってます.

だいたいこんな感じの設定ファイルが扱えます.

# コメント SectionName { Config1: test4 Config2: test2 Config3: test3 }

ちょっと長いのでこちらに.
https://gist.github.com/mjhd-devlion/e87a3f2b589631c5788b



窓月らら

リンク

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



Noa

リンク

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



Noa

リンク

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

皆さんのモジュールが便利すぎる・・・
特に窓月ららさんの描画系や脳漿さんのレイヤードウィンドウは使い所が多そうですね。



mjhd

リンク

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))")



Noa

リンク

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
です。



Noa

リンク

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
に修正してください。同じような投稿を連続でしてすみません。



Noa

リンク

2015/8/17(Mon) 17:58:02|NO.70841

UTF-8関係のモジュールを3つ
役に立つかは分かりませんが


UTF-8の文字数を求めるモジュール
https://aa38020e42f53ca54e166915354734af1f102cbd.googledrive.com/host/0B9vewWZYDiXefmNjRWZCb1FrUmpab3o2dk5nTXRkRFdGTXFqTWZjNExVTm41OHUwWFdRUG8/apps/uni8len.txt

MultiByteToWideCharを用いてUTF-8をShiftJISに変換するモジュール
https://aa38020e42f53ca54e166915354734af1f102cbd.googledrive.com/host/0B9vewWZYDiXefmNjRWZCb1FrUmpab3o2dk5nTXRkRFdGTXFqTWZjNExVTm41OHUwWFdRUG8/apps/uni8enc.txt

UTF-8をShiftJISにMultiByteToWideCharを用いず変換するモジュール
https://aa38020e42f53ca54e166915354734af1f102cbd.googledrive.com/host/0B9vewWZYDiXefmNjRWZCb1FrUmpab3o2dk5nTXRkRFdGTXFqTWZjNExVTm41OHUwWFdRUG8/apps/uni8encji.txt


またソフトではありませんが「UTF-8をShiftJISにMultiByteToWideCharを用いず変換するモジュール」を作成する際に使用した変換表です。
全角文字のShift JIS - UTF-8間の変換表
https://aa38020e42f53ca54e166915354734af1f102cbd.googledrive.com/host/0B9vewWZYDiXefmNjRWZCb1FrUmpab3o2dk5nTXRkRFdGTXFqTWZjNExVTm41OHUwWFdRUG8/apps/utf8sjis.htm



GENKI

リンク

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

マニュアル記載のない標準添付モジュールってどのくらいあるんでしょうね。



GENKI

リンク

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))



Noa

リンク

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座標に変換するマクロです。

どこかで同じようなのをみたことがありますが使いたくなったときに見つからなかったので自分で書きました。
ボタンなどのオブジェクト上のマウスの座標を取得するときに役に立てば、とおもいます。



kanamaru

リンク

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です。
使い方はわからないようなら聞いてください。
タイプ値は定数を使ってください。
定数で定義されてないタイプ値を指定したら、
通常通りの設定方法で設定します。



kanamaru

リンク

2015/8/18(Tue) 13:53:12|NO.70882

すみません、訂正です。
すべてのif文の後ろに、:returnをつけてください。



Noa

リンク

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



Noa

リンク

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



GENKI

リンク

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だとごちゃごちゃして可読性もメンテナンス性も悪い・・・



Noa

リンク

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の略らしいですがこの略し方は自分にはいまいちふに落ちません。



kanamaru

リンク

2015/8/18(Tue) 21:57:55|NO.70902

設定方法変更機能付きposはお試しで作って見たものなのですが、
意外と評価が良くて驚きました。



kanamaru

リンク

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
これの用途としては、
例えば、シューティングゲームで、銃の照準を示すときの
座標指定に使えます。



kanamaru

リンク

2015/8/19(Wed) 08:39:00|NO.70904

すみません。
訂正です。
一つ前の投稿で、
二つ目のモジュールの命令の名前をcxposに変更してください。
xposを使っている人だと名前がかぶってしまうので。



kanamaru

リンク

2015/8/19(Wed) 12:32:55|NO.70910

何度も訂正すいません。
cxposの第2,3引数の型をdoubleにして、
yの-1*を取ってください。



Noa

リンク

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を入れても処理がうまくされない?のはどうしてでしょうか。



GENKI

リンク

2015/8/19(Wed) 21:25:39|NO.70932

メニュー関係は mod_menu.as が標準で入ってますが、命令少ないですよね。
メニューバーとか使ったものはつい作るのをためらっちゃうんですよね。



GENKI

リンク

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など多機能なテキストエディタでよく見かける機能です。
少しだけ、ほんの一部を修得するだけでもテキストエディタを使った作業の効率が跳ね上がります。



Noa

リンク

2015/8/19(Wed) 23:49:04|NO.70936

> 正規表現っていうやつで
正規表現を調べてみましたがおもしろそうですね。

> どうも2個めの命令はまともに動いてないっぽい。

全くの素人の意見ですが見る限りおかしいところはなさそうですし、動作も問題なさそうです。
もしできればでいいのでどういう記述でおかしい動作をするのか投稿してくれませんか。
忘れていなければですが素人なりにですが動作を検証します。



Noa

リンク

2015/8/20(Thu) 00:09:00|NO.70937

すみません。確かにGuiExScreenStyleCut 8の動作が少しおかしい気がします。
とりあえず直そうとおもいます。できるかはわかりませんが。



Noa

リンク

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を渡した場合と変わりありません。



Noa

リンク

2015/8/20(Thu) 01:37:09|NO.70939

なにかGENKIさんの意図していたものからは遠くかけ離れたものができた気がします。



Noa

リンク

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



GENKI

リンク

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さん修正ありがとうございます。



ウィンドウのスタイルの組み合わせってよくわからない時がある。そのうちきっちり調べてみたいな。



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は自分もゲームなどを作るとき大変お世話になっています。
この場を借りてお礼申し上げます。

※若干修正しました。



GENKI

リンク

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以外での使い道が難しそう。



Noa

リンク

2015/8/25(Tue) 11:31:16|NO.71056

数式の文字列を計算するモジュールで0除算のことを完全に忘れていました。
そのため0除算のエラー処理を追加しました。
URLは前と同じhttps://aa38020e42f53ca54e166915354734af1f102cbd.googledrive.com/host/0B9vewWZYDiXefmNjRWZCb1FrUmpab3o2dk5nTXRkRFdGTXFqTWZjNExVTm41OHUwWFdRUG8/apps/calculat.txtです。



スペース

リンク

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



Noa

リンク

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



Noa

リンク

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



Noa

リンク

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豆腐"



Noa

リンク

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



26℃

リンク

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



774

リンク

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してます。
その為、処理後のデータサイズは元のサイズとは異なります。



mjhd

リンク

2015/9/7(Mon) 11:40:29|NO.71428

何だかこのスレッドに上がったモジュールがこのまま過去ログへ行ってしまうのにもったいなさを感じます。
以前のHSP開発Wikiのようにまとめられる場所があればなぁ…



Noa

リンク

2015/9/7(Mon) 11:57:06|NO.71429

HSP開発Wikiですか。わたしが初めてHSPにさわった時(ようするにパソコンを使い始めた時)にはすでになくなっていた覚えがあります。
確かにHSPWikiではこういう内容は少ないのでそういう場所がほしいです。
だれかレンタルWikiでつくってくれないかなとは思います。自分でつくるのは管理が大変そうなのでいやです。



mjhd

リンク

2015/9/7(Mon) 12:13:21|NO.71430

> Noaさん
10年ほど続いて、だいたい2年前に消滅した気がします。
そうですね、せっかく書いたページがまた消えてしまうのは非常にもったいないので、きちんと管理できる人にお願いしたいです。



Noa

リンク

2015/9/7(Mon) 12:24:02|NO.71433

自分もそう思います。自分だと管理できないとおもいます。



Noa

リンク

2015/9/7(Mon) 12:31:17|NO.71434

なくなってから2年しか経っていないのかと思い、みてみたら確かに最終更新日が2013年11月でした。
記憶ではもっと前になくなっていた覚えがあるのですが。



y.tack

リンク

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:24:15|NO.71451

ついでですが、この掲示版もつい数カ月前から見れなくなりました。
http://fs-cgi-basic01.freespace.jp/~hsp/ver3/hsp3.cgi?print+201201/12010002.txt

どこかにバックアップ残ってないのでしょうか・・・
先輩方の書いたコードが消えてしまうのは悲しいので・・・



スペース

リンク

2015/9/7(Mon) 21:35:08|NO.71452

連投すみません。
そのサイトの名前がわからず調べたのですが、
「HSP3ラウンジ掲示板」であっているのでしょうか?



Noa

リンク

2015/9/7(Mon) 22:12:35|NO.71456

確かにそこは見られなくっています。移転先を掲示板で聞こうと思っていました。
名前についてですが掲示板は「HSP3ラウンジ」と「HSP2ラウンジ」があったので正しいです。
そのホームページがあったホームページスペースがサービス終了(データ削除)したため見られなりました。



Noa

リンク

2015/9/7(Mon) 22:15:32|NO.71457

わたしがHSPを始めたころはHSPのコミュニティがほかにもありましたが、今ではHSP公式掲示板とHSPWikiしかないのはどうしてですか。



スペース

リンク

2015/9/7(Mon) 22:15:56|NO.71458

なるほど、サービス終了してしまったんですね。
Googleのcacheから見れないか、とも思ったのですがほぼ全滅でした。



Noa

リンク

2015/9/7(Mon) 22:23:20|NO.71459

Yahoo!知恵袋のHSPカテゴリのことを忘れていました。
私はYahoo! JAPANの検索キャッシュから見ようとしましたがなくなってすぐは見られましたがすぐに見られなくなってしまいました。
またバックアップは残っていないと思います。だれか移転先を知りませんか。



Noa

リンク

2015/9/7(Mon) 22:57:43|NO.71462

ところでもしWikiシステムを借りるか置くかにしてこのスレッドの内容を保存する場合ライセンスはどうなりますか。
難しくてよくわかりませんが著作権や著作者人格権はどうなるのでしょうか。Yahoo!知恵袋の場合は著作権と著作者人格権は行使しないことになっていたと思いますが。



スペース

リンク

2015/9/7(Mon) 23:33:35|NO.71463

著作権に関する議論は今までに何度かされています。
一番古くオニタマさんの意見も書かれているスレッドは恐らくこれだと思います。
http://hsp.tv/play/pforum.php?mode=pastwch&num=46694



GENKI

リンク

2015/9/7(Mon) 23:37:24|NO.71464

ぷまさんのHSP HELP CENTERですか。
昔は貴重な資料として参考にさせてもらってました。レベル高すぎて参考にならないことが多かった気もしますが…。

アーカイブ漁れば部分的にサルベージできるかもしれませんね。
https://web.archive.org/web/20150504153651/http://dream.freespace.jp/puma/



スペース

リンク

2015/9/7(Mon) 23:42:10|NO.71465

>>GENKI
なるほど、インターネットアーカイブの存在を忘れていました。
それにしても検索できるサービスなんてあったんですね。



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!とかなくなると困ります。なくなると困るサイトはバックアップとっとかないとダメかー。



Noa

リンク

2015/9/8(Tue) 00:31:16|NO.71468

>素直にHSPwiki使えばいいと思います。

HSPWikiはHSP全般の情報のためのWikiなのでHSPWikiとは別にするのがいいと思います。

>著作権に関する議論は今までに何度かされています。

そうでしたか。それならモジュールをそのまま勝手に使えないことになるのでは。規約に著作権と著作者人格権のことを書けばいいのにと思います。



Noa

リンク

2015/9/8(Tue) 00:44:45|NO.71469

もしモジュールをそのまま勝手に使えないのであればアルゴリズムを参考にするくらいしかできないのでは。

>自分が書いたところだけでも自分のサイトに転載しようかとも思った

初めから書き直したらいいと思います。



Noa

リンク

2015/9/8(Tue) 00:47:30|NO.71470

だれかHSP HELP CENTERのぷまさんに連絡とれませんか。



Noa

リンク

2015/9/8(Tue) 00:58:03|NO.71471

そういえばHSPWikiにもプラグイン・モジュールのリストがありました。あまり機能していないようですが。



Noa

リンク

2015/9/8(Tue) 01:04:56|NO.71472

HSPWkiについて
http://quasiquote.org/hspwiki/HSPWiKi%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6

著作権についてを読みましたがHSPWikiに書きこんだ内容はどうなるのかよくわかりません。自分でかいてパブリックドメインにしているのを自分でHSPWikiに書き込んでもHSPWikiのものになりそれはパブリックドメインでなくなるのでしょうか。
難しくてよくわかりません。



kanamaru

リンク

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
インターネットアーカイブの主張を要約すると、
「パスワードも特権も無しに一般に公開されてるファイルを集めてるだけ、
でも著作権者を尊重するから言ってくれれば削除するよ。」
って感じなので、著作権を主張したり自分のものだと偽って公開しない限り、問題はなさそうですね。



mjhd

リンク

2015/9/8(Tue) 12:17:08|NO.71484

> 素直にHSPwiki使えばいいと思います。
確かに、十分な機能がありますね。
管理人さんにも連絡が付きそうですし、安定そうです。

> 著作権
著作権の話はモジュールの作者各自で考えるのが良いと思います。

このスレッドに書き込むと同時にWikiにも書いてもらえたら、より役立てられるんじゃないかなと思います。



Noa

リンク

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ラウンジの場合、既に元のページが見られなく成っているので、
公開しても大丈夫って事ですね。



Noa

リンク

2015/9/8(Tue) 14:19:07|NO.71488

ただ自分が著作権者であるということを証明するのはURLを書くか何かしておかないとむずかしいので実際は勝手に公開しても閉鎖させられるようなことは少ないと思いますが。



Noa

リンク

2015/9/8(Tue) 14:20:30|NO.71489

よくはわかりませんがもう見られなくなっているのでというのはだめなような。



Noa

リンク

2015/9/8(Tue) 14:33:41|NO.71490

Waybackのアーカイブを見ましたが利用規約のようなものは見つけられなかったのでそれぞれのかきこみの著作権や著作者人格権はそれぞれの書きこんだ人がその人がなにか宣言をしたりしていない限りは今でも行使できると思います。
書きこんだ本人であるということを証明するのは難しそうなので著作権侵害が親告罪である限りはないとは思いますが、非親告罪になった場合は著作権侵害で閉鎖させられそうな気もします。
非親告罪になった場合はフェアユース的なものができるでしょうから実際は逆にどうどうと公開できるようになると思いますが。
自分はほとんど法律を理解できていないとおもうので間違いが多分にあると思うので注意してください。



Noa

リンク

2015/9/8(Tue) 14:39:09|NO.71491

今思ったのですが掲示板にモジュールを書きこんだ際はURLなどを書くなどして自分が著作権者本人であるということわかりやすくしておく、どう使っていいのかを明記しておかないと
自分のプログラムでも使用できないということになる気がします。



Noa

リンク

2015/9/8(Tue) 14:42:09|NO.71492

まとめるとフェアユース的なのが日本でもできれば問題解決だと思います。



Noa

リンク

2015/9/8(Tue) 16:24:07|NO.71493

わたしにはちんぷんかんぷんなので、著作権のことは分かりません。



KA

リンク

2015/9/8(Tue) 20:03:47|NO.71498

Noa さん
思いつくたびにレスを返すより、考えをまとめて書く方が良いですよ。

著作権に付いては、日本では基本的に放棄出来なかったと思います。
ただ、その著作権を行使しない事が放棄と同じ事になります。

一般的に不特定多数の人が自由に書き込め閲覧できる環境は、明示して
いない限り「パクリ上等!」と解釈されます。利用して貰うために書き
込んでいるんだから当然ですよね。

書き込んだ人が特定出来ない・意思表示をしていない場合は、サイトの
一部と見なされますので著作権者は不明でもサイトの所有財産に該当し
ます。なので良く「○○のサイトから引用しました」と言うのを見た事
が有ると思いまが、著作権者が曖昧なので掲示元を明示する事で問題を
解決しています。

ちなみに今回の「ちょっと便利になる」程度では、著作権を主張出来な
い事が多いです。だって「偶然似たような物になった」と言われたら言
い返せません、かなり特徴的・独創的で多数の人に利益をもたらすよう
な物で認知度が高い場合にオリジナルと判断されます。

難しい事を書きましたが、意思表示をしたいのならスクリプトなどの先頭に

;2015/09/08 ;KA ;自由に使って下さい
とでも書いておきましょう、投稿したサイト自体に「無断使用禁止」などと
書かれているとややこしくなりますが、基本的に意思表示が優先されます。

最後にスレタイから外れた話題だとは言いませんが、主旨からすると淡々と
スクリプトを貼り付けて議論は別にした方が良い気もします。後から見た人
が「議論ばかりで肝心のやつを探せない!」なんてことも。



GENKI

リンク

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

他にも優秀なモジュールが投下されたらこのページに追加すると便利なんじゃないでしょうか。



補足
> 日本では基本的に放棄出来なかったと思います。

著作人格権の事。
その他の著作権については放棄や譲渡、売買が可能です。
これ以上の詳しいことは新しくスレッド立てる方がいいでしょう。



Noa

リンク

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



b

リンク

2015/9/8(Tue) 21:24:41|NO.71505

ついに100か..



mjhd

リンク

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に書きました。
やっつけ仕事なのでもしミスがあったら修正お願いします・・・



Noa

リンク

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にも公開していいのかと思っていました。
大変申し訳ございませんでした。



Noa

リンク

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さんのホームページ名か何かだと思ったのですが、
ライセンス名だったんですね。勘違いをしていました。



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の規約の解釈に間違いがあるかもしれません。間違っていれば教えてください。



Noa

リンク

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/)に行ってください。)



Noa

リンク

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項は、ソース・実行バイナリの双方に適用されます。
------ライセンス文終わり-----



KA

リンク

2015/9/9(Wed) 19:45:28|NO.71543

HSPWikiの規約と質問を見ると

ボランティア的な著作権者(著作権を主張する気もない)の代理とし
て所有権を保持する目的の様です。平たく言えば一次配布先はココだ
と明示するための所有権で、悪意を持った利用を制限するための所有
権と言えます。

オレが作ったんだから他に転載するのもオレの自由だろ?と言う理屈
はもっともですが、一次配布元として所有権を渡した以上は本人だろ
うが流用する時は一次配布元を明記する必要が有ると言う事です。

そういう意味では Noa さんの様に、明らかに一次配布元がある物を更
に一次配布元への転載はおかしな事になり、どちらかを消さなければ
なりません。

法律って正確に解釈しようとすると難しいね!

個人で使う分には難しく考える必要は有りませんが、公開を前提とした
場合は引用や参照したサイト・資料の条件を良く読むのは大切です。

------------------------------------------------

>>HSP-MLのサイトに接続できないので・・・もうHSPwikiを放置状態
接続出来なくても所有権は消えません、許可を得る代替手段として「転
載元を明記」と書かれていますよ?。著作権者にも所有者にも連絡出来
ないけど、これだけ書いておけば何でもOKと言う事です。

HSPWikiの管理人(代表?)は iwata さんになるのかな?



KA

リンク

2015/9/9(Wed) 20:00:47|NO.71545

書き忘れた!

今までの経験上、レスが多くなると段々主旨「少し便利に成るモジュール」
から外れてきます。(良いかどうかはスレ主の判断ですが・・・。)



Noap

リンク

2015/9/9(Wed) 20:38:02|NO.71549

KAさん、そうです。その通りです。そもそもNYSLで著作権を放棄しているので譲渡はできませんし、HSPWikiに書きこむ場合はそこが第一次配布場場所になるので自分のホームページで公開している場合はホームページを転載先とするかもしくはどちらかを消さなければならない。その通りです。
自分でかいていてよく分からなくなってきていたのでまとめてうれてありがとうございます。

そこで「HSPWiKi:管理の履歴」は2009年で止まっていますが放置されていないということであればたのんで編集履歴を消してくれませんか。消したとはいえ編集履歴からみられるのはなにかイヤです。



Noap

リンク

2015/9/9(Wed) 20:48:37|NO.71553

訂正

>注意: NYSLはライセンスの名称であり、NYSLのウェブサイトとこのウェブサイトは全くの無関係です

「注意: NYSLはライセンスの名称であり、NYSLのウェブサイトとわたしは全くの無関係です」のまちがいです。(このウェブサイトではなくわたし)

>まとめてうれて

「訂正してくれて」の間違い



KA

リンク

2015/9/9(Wed) 22:41:30|NO.71558

ええーと、自分の意見を率直に言うと煙たがられるので話に合わせ
つつポイントを書いたつもりでしたが諦めました。

1:スレタイと無関係(微関係かな?)のレスの多さ。
2:それにより元々の趣旨が失われる?
3:第三者がスレタイに興味津々で見てみたが・・・・。

熱弁を交わしても、所詮いつか過去ログ行きです。
後々の事を考えたら、議論は議論で新たなスレでして下さい。

以上、このスレでの私の書き込みは終わりにします。



774

リンク

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
ご利用・転載・改変・再配布・「俺が作った」等、自己責任においてご自由にどうぞ。
判定精度はそれなりだと思います。



Noap

リンク

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



Mituking[元mituki]

リンク

2015/9/10(Thu) 20:26:26|NO.71569

とうとうここも120個目に・・・



Noap

リンク

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の結果が戻ります。



kanamaru

リンク

2015/9/11(Fri) 17:25:56|NO.71591

データベースへの複数同時接続可能モジュールって調べてみたら
自由に使ってくださいとはありましたが転載は許可してないような気がします。
(そもそもこれを転載というのかどうか)
改造はいいとしてもここに載せてよかったのでしょうか?



スペース

リンク

2015/9/11(Fri) 19:01:30|NO.71592

本人の名前を出してる事、自分が作ったと偽っていない事、の二点を考えれば問題ない気がします。
tds12さんの「自由に使ってください」がどの程度の範囲かわからないのでなんともいえませんが。
一応本人のレス貼っておきます。
http://hsp.tv/play/pforum.php?mode=all&num=70597



Noap

リンク

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



mjhd

リンク

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()



Noap

リンク

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



mjhd

リンク

2015/9/12(Sat) 01:45:52|NO.71605

匿名ラベルです。
いちいちラベルに名前つけるのが面倒なときにスッキリとかけます。

http://quasiquote.org/hspwiki/%E5%8C%BF%E5%90%8D%E3%83%A9%E3%83%99%E3%83%AB


#define ` %tquote *%i : if 0 : *%o // サンプル button gosub "test", `{ dialog "TEST1" gosub `{ dialog "TEST2" return } return }



(´ω`)

リンク

2015/9/12(Sat) 10:27:26|NO.71611

元スレのURLを記述しておけば済む話でしたね。
申し訳ありませんでした。(´・ω・`)



Noap

リンク

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



Noap

リンク

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



Noap

リンク

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 */



Noap

リンク

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



uedai

リンク

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



Noap

リンク

2015/9/14(Mon) 23:28:22|NO.71693

>uebaiさん
よくswbreakは付け忘れるのでべんりだと思います
わたしもマクロを勉強したいです



Noap

リンク

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



Noap

リンク

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 "成功"



Noap

リンク

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



Noap

リンク

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



Noap

リンク

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



Noap

リンク

2015/9/16(Wed) 15:13:02|NO.71730

ところでわたしの著作権についての書きこみは残しておくべきでしょうか。それとも邪魔にならないよう削除しておくべきでしょうか。
どちらのほうがいいのかよければだれか教えてください。



b

リンク

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さんだけが消してしまうと他の人のレスがわけわからなくなってしまいます。
かと言って全員消すとなると大変なので、残しておくべきかと。

関係ありませんがこのスレ何処まで伸びるんだろう・・・・
自分もそろそろ何か投稿したいな・・・



Noap

リンク

2015/9/16(Wed) 17:50:03|NO.71738

残しておくことにします。確かにどこまで続くのかわかりません。わたしは200まで行くかもしれないと思います。わたしのモジュールはいまいちなにの役に立つのか分からないものが多いのでわたしも何か役に立ちそうなのをつくりたいです。



Noap

リンク

2015/9/16(Wed) 17:54:19|NO.71739

ところで「スレ」や「レス」は何のことですか。いつもよくわからなくて文脈でなんとなくで文を理解しているのですが、辞書にものっていないためわかりません。



スペース

リンク

2015/9/16(Wed) 18:00:01|NO.71740

>>Noapさん
http://goo.gl/2I6p2m
こちらに詳しく乗っています。



Noap

リンク

2015/9/17(Thu) 06:53:28|NO.71756

わざわざ教えてくれてすみません



Noap

リンク

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*/



Noap

リンク

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



motchy

リンク

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

(先程から度々書き換えてすみません。)



Noap

リンク

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



Noap

リンク

2015/9/19(Sat) 12:18:10|NO.71791

XPSのほかにも実際のプリンタでも印刷を確認しました



Noap

リンク

2015/9/19(Sat) 13:40:46|NO.71792

今さらですが簡易リスト形式をつかうモジュール
DLLを動的によみこむモジュール
に間違いがあったので訂正

ポインタが有効かのチェックのところで
if 変数==0とすべきところを
if 変数<=0としていました

if 変数!=0とすべきところを
if 変数>=0としていました
(ポインタは符号なし整数なのでHSP側では符号あり整数として扱うので有効なポインタが一番上のところが1になっていてマイナス値として扱われてメモリを確保できている場合でもエラーにする可能性があったとおもう)

修正版(URLは同じ)
http://nopswebpages.webcrow.jp/apps/liststrr.txt
http://nopswebpages.webcrow.jp/apps/dlldou.txt
http://nopswebpages.webcrow.jp/apps/dlldou2.txt



Noap

リンク

2015/9/19(Sat) 13:46:38|NO.71793

スレッドの一覧の上の広告のよこの等号はいつまであるのかなと思います



Noap

リンク

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



Noap

リンク

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



Noap

リンク

2015/9/21(Mon) 21:20:48|NO.71834

HSP2でmemexpandはHSP3とHSP2の両方に対応したソフトを書きたいときに役にたつと思います。
またHSP2.6で確認とありますが正しくはHSP2.61で動作確認でした。
わたしのこのスレッドでの投稿の中でURLが書かれているスクリプトは最新版はそのURLを参照してください。



b

リンク

2015/9/21(Mon) 21:27:58|NO.71835

伸びる伸びるほかにも固定スレで
「ちょっとした小物公開スレ」
「どうでもいい or ちょっとした質問スレ」
とかあればいいな/



スペース

リンク

2015/9/21(Mon) 23:10:41|NO.71837

>>bさん
それは自分も思いました。
とりあえず、このスレッドも長くなってきたので200超えたらPart2を建てようかなと思っています。



Noap

リンク

2015/9/23(Wed) 05:53:59|NO.71862

確かに他にも種類があるほうがわかりやすそうです。



Noap

リンク

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



Noap

リンク

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



Noap

リンク

2015/9/25(Fri) 17:30:48|NO.71947

HSPPRINT互換モジュールはプリンターを使うだけなのに実行ファイルとDLLを一緒に配布しないといけないのはいやなときに使うといいと思います。
そのような需要がはたしてあるのかどうかは疑問ですが。わたし以外にはない気がします。



Velgail

リンク

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. サンプルにもあるように、英字と数字のキー入力を定義するなら、シングルクォートで括ると楽。(英字は大文字で!)

以上です。適当に使ってみてください。



GENKI

リンク

2015/9/27(Sun) 15:20:46|NO.71990

> Stick命令って、「何故かZ,X,Cとかのキーには対応してない。謎!」ということで、

ゲーム目的での使用を想定して、nキーロールオーバーの問題が起きにくくするために同時押し対策が浸透しているであろうキーを中心に選定されただけだと思います。
一見不便なようでいてハードの知識を意識させない親切設計なのです。

しかしASDWとかゲームによく使うんだからこういうstickとgetkeyの間のような命令はあると便利そう。



Noap

リンク

2015/9/30(Wed) 22:28:17|NO.72066

HSP3の機能を少しHSP2に移植してみたモジュール
HSP3とHSP2の両方で動くスクリプトを書きたい際に役にたつかもしれません

http://nopswebpages.webcrow.jp/apps/hsp3cmp.txt



mjhd

リンク

2015/10/1(Thu) 04:30:26|NO.72073

ブロック構文っぽいものです。
プログラムが見やすくなるぐらいの効果はあるかなぁと思います。

http://quasiquote.org/hspwiki/%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E6%A7%8B%E6%96%87%E3%81%A3%E3%81%BD%E3%81%84%E3%82%82%E3%81%AE



GENKI

リンク

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



mjhd

リンク

2015/10/9(Fri) 15:19:01|NO.72186

簡単な正規表現エンジンです.
便利というより,HSPでも出来るんだという実験モジュールです.

http://quasiquote.org/hspwiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE



Noap

リンク

2015/10/9(Fri) 21:33:53|NO.72188

Base64にエンコードしたりデコードしたりするモジュール
Base64とは何なのかを理解したくつくりました
ウィキペディアの説明をみてそのまま実装しました
バイナリ用です(テキストデータも当然扱えます)
もしかすると間違いがあるかもしれません
CryptBinaryToStringを使えばいいのですが仕組みを理解したくてつくりました

ライセンスはNYSL 0.9982でパブリックドメインと同等です(どう使ってもいい、改造してもいい、自分が作ったも自由)

ダウンロード
http://nopswebpages.webcrow.jp/apps/b64dec.txt

参考したウェブページ
https://ja.wikipedia.org/wiki/Base64



Noap

リンク

2015/10/10(Sat) 16:31:11|NO.72193

RC4互換アルゴリズム(ARCFOURアルゴリズム)で暗号化を行うモジュール
バイナリとテキストの両方に対応しています
ライセンスはNYL0.9982 でパブリックドメインです(好きなようにしてください)
たぶん正常に暗号化できていると思います

ダウンロード
http://nopswebpages.webcrow.jp/apps/arcfour.txt

アルゴリズムの参考先(PDFです)
http://www2.nict.go.jp/nsri/plan/H26-symposium/files/3-1.pdf



kanamaru

リンク

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 //ここまで



kanamaru

リンク

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 //ここまで



kanamaru

リンク

2015/10/15(Thu) 13:13:15|NO.72317

連投すいません。
さっき投稿したのは、改造、再配布してもいいとします。
他サイトへの転載も大丈夫です。



Noap

リンク

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)



Noap

リンク

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のモジュール一覧に自分の書いたモジュールのことは勝手に書き込んでいいものでしょうか



mjhd

リンク

2015/10/18(Sun) 20:13:23|NO.72368

> Noapさん
積極的に書き込むと良いと思います。
同時にHSPWikiに書き込むことによって、どこかのHSPユーザの助けになることができます。
また、今HSPWikiに必要なのは活気だと思うので、積極的に書き込んでほしいです。



kanamaru

リンク

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点を解決できませんか?



Noap

リンク

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



kanamaru

リンク

2015/10/23(Fri) 23:49:36|NO.72458

それが、¥tとかも使えないんですよ。なぜだろう。
ginfo_mesyって1行分しか認識しないんですか。
そんな原因があるとは。調べが足りませんでした。
それがわかれば改行コードには対応出来そうです。
¥nと¥rってなんか動作分けた方がいいですか?
確か厳密に違いが決められてたような…
と言ってもhspでは違いがなかった気もしますが。



kanamaru

リンク

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 //ここまで



inovia

リンク

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



kanamaru

リンク

2015/10/26(Mon) 08:41:13|NO.72515

返事が遅くなってしまい、すいません。
\tが使えることを確認しました。なるほどウィンドウ外をコピーしようとしたのですね。
なんで透過できてるんだろうか。



Noap

リンク

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 "豆腐とわかめ"



Noap

リンク

2015/10/30(Fri) 23:36:04|NO.72640

正直なところをいうと全くもとのkanamaruさんのスクリプトを見ず出力結果だけを見て書いたので、kanamaruさんのしたかったこととは違うかもしれません。inoviaさんのも結果しか見ていません。
先ほど投稿したgmesのライセンスはパブリックドメイン(CC0 1.0 (権利証 https://creativecommons.org/publicdomain/zero/1.0/deed.ja))にします。

TTFファイルからフォント名を得るモジュールはこちらを参考にしました。どこにもTTFヘッダの情報がなくてとても探しました。
http://www.microsoft.com/typography/otspec/otff.htm
もともと動的にフォントを読みこみたいというスレッドの回答として書いたのですが、そのスレッドがどこかよく分からないです。
インストールしないでフォントを使いたいときに便利かと思います。
TTCはTTFの中身がたくさんあるだけなので少し書きかえれば対応できます。



Noap

リンク

2015/10/30(Fri) 23:51:05|NO.72641

もちろんタブもどのエスケープシーケンスも大丈夫です



Noap

リンク

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



Noap

リンク

2015/11/1(Sun) 13:11:29|NO.72673

HSPWikiにわたしのモジュールの項目を編集、追加し、「HSPTV!掲示板に公開されたモジュール」の項目がしばらく更新されていなかったので勝手に更新しましたがよろしかったですか。
またライセンスごとに別途項目を作成しライセンスごとに分ければモジュールを使いやすくなるかもしれないと思いますがどうなのですか。勝手に作成していいのでしょうか。ただわたしとkanamaruさんがパブリックドメインとして投稿している以外には、他の方のモジュールには明記されていない?のであまり意味がないかもしれません。
管理者でも何でもないわたしが勝手にそのような項目を作成していいのかは不安です。



Noap

リンク

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



Noap

リンク

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



Noap

リンク

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



Noap

リンク

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"



Noap

リンク

2015/11/2(Mon) 06:32:05|NO.72700

パズルゲームなどに使えると思います



アナログ

リンク

2015/11/2(Mon) 11:06:14|NO.72701

あと少しで200か・・・・・



Noap

リンク

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; }



Noap

リンク

2015/11/3(Tue) 06:19:32|NO.72717

「hsp3clで時間制限付きキー入力待ち」ですが
GetAsyncKeyStateというAPIがあるのを初めて知ったのでHSPCLで使えるgetkeyを書きました。ゲームを作る際にはこちらを使うといいと思います。

getkeycl:hspclでgetkey
http://nopswebpages.webcrow.jp/apps/getkycl.txt

HSP3に移植
http://nopswebpages.webcrow.jp/apps/getkycl3.txt



Noap

リンク

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さんが考えていた通りなのか教えてくれませんか。



Noap

リンク

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 )



kanamaru

リンク

2015/11/9(Mon) 07:52:10|NO.72882

noapさん、返事が遅くなってしまい、すいませんでした。
海の向こうに行っていたので。(wifiくそ遅かったし、パソコンないし)
こちらで実行してみました。こちらの想定通りの動作でした。
いったいどんな仕組みなのやら僕にはわかりませんが。
一つだけわかるのは、str,int,doubleに対応してるってことぐらいです。



Noap

リンク

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



kanamaru

リンク

2015/11/10(Tue) 08:25:29|NO.72911

気づかなかったけど、\n使った時の動作が不便です。
あまりないかもしれませんが、
\nを三個とか使っちゃうと最後の行とかほとんどグラデーション
しなくなる。(四個だともう最後の行はグラデーションしてないようにしか見えない)
僕の作ったやつはだから一行ごとに分離して描画しています。



774

リンク

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 /***************************************************************/



Noap

リンク

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ヶ月様子見をします。
次はモジュールに限らす様々なちょっとしたソースコードを投稿できるようなスレにする予定です。



Noap

リンク

2015/11/12(Thu) 17:12:47|NO.72958

200を取られてしまいました
何かモジュールをつくったら次のスレッドをつくってよろしいですか。
そもそも著作権が発生するようなスクリプトであるかは分かりませんが、次のスレッドではモジュールを扱いやすくなると思うのでライセンスが明記されていない場合はパブリックドメインにすることはどうでしょうか。よくないのであればそれでかまいません。



スペース

リンク

2015/11/12(Thu) 18:02:00|NO.72959

>>Noapさん
自分も「特別書いていない場合はパブリックドメイン扱いにします」という風にしようかとも思っていました。
スレを立てるタイミングですが、実はまだ投稿していないモジュールを発見したので、今日中に建てようかと思います。



Noap

リンク

2015/11/13(Fri) 23:23:55|NO.72999

このスレッドにリンクではなく直接投稿されているわたしのスクリプトは別途ライセンス表記がなければパブリックドメインとして扱ってください




このスレッドはたくさん投稿があって見にくいので別のスレッドに投稿することになりました



ちょっとしたソースコードを投稿するスレ
http://hsp.tv/play/pforum.php?mode=all&num=72960


議論や長くなりそうな質問などはこのスレッドに投稿してくださいとのことです
ちょっとしたソースコードを投稿するスレ【議論専用】
http://hsp.tv/play/pforum.php?mode=all&num=72980


HSPWikiの各スクリプトの一覧のページ
http://quasiquote.org/hspwiki/%e3%81%a1%e3%82%87%e3%81%a3%e3%81%a8%e3%81%97%e3%81%9f%e3%82%bd%e3%83%bc%e3%82%b9%e3%82%b3%e3%83%bc%e3%83%89%e3%82%92%e6%8a%95%e7%a8%bf%e3%81%99%e3%82%8b%e3%82%b9%e3%83%ac



Noap

リンク

2015/11/13(Fri) 23:25:27|NO.73000

スレッドの名前に使われている言葉の意味


「ちょっとした」
「わざわざそれのためだけにスレッドを新たにつくるほどのスクリプトではないけどみんなに見てもらいたい」という意味らしいです


「スレ」
スレッドという意味らしいです



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