Last Update : 2008/01/xx
XREA.COMのs206サーバー内のサイトは、Yahoo!検索からペナルティを受け、検索結果で常に下位にランク付けされてしまうので、Yahoo!経由向けに用意したHSPミニ講座内のページです。このページは「http://lhsp.s206.xrea.com/hsp_string.html」の昔のものです。
英文字列の大文字&小文字の変換です。Windows APIのCharUpper関数とCharLower関数を利用します。HSP2のllmod.asモジュールに同名の命令がありましたが、この関数を呼び出していただけです。で、実際のところ小文字変換については、ファイルパスの文字列を取り出すgetpath関数(タイプ16)に同等の処理が用意されてます。
; 英文字列の大文字/小文字変換 (by Kpan) ; (注) エディタの[HSP]メニュー→[HSP拡張マクロを使用する]を要有効。 #include "user32.as" mes "大元の文字列\t: AbCdeFGhIjk\n" ; 大文字変換 (変換された文字列がそのまま同じ変数に返るので注意 data1 ="AbCdeFGhIjk" CharUpper varptr(data1) mes "CharUpper関数\t: "+data1 ; 小文字変換 data2 ="AbCdeFGhIjk" CharLower varptr(data2) mes "CharLower関数\t: "+data2 ; 小文字変換 [HSP標準対応の関数] data3 ="AbCdeFGhIjk" mes "HSP getpath関数\t: "+getpath(data3, 16)
文字列の前後にある指定文字(半角or全角、複数可)を取り除くサンプルコードです。
; 文字列前後の指定文字取り除き(by Kpan) ; (!要IE4以降) #uselib "shlwapi" #func StrTrim "StrTrimA" int, str ; 「"」(「\"」) data = "\"C:\\Program Files\\hsp30a\\readme.txt\"" mes "["+data+"] StrTrim varptr(data), "\"" mes "["+data+"] ("+stat+")\n ; 半角スペース、「あ」、「H」 data = "あああ HSPプログラムだよーん ああ" mes "["+data+"] StrTrim varptr(data), "あ H" mes "["+data+"] ("+stat+")\n ; 取り除き処理が行われなかった場合は、statに結果0が返る data = "@@@HSPプログラム講座だよーん@@" mes "["+data+"] StrTrim varptr(data), " " mes "["+data+"] ("+stat+")
mes命令で表示する文字列。一般的PCの設定では黒色の文字色ですが、灰色状態(使用不可なグレー表示)の文字列表示を、あえてWin32APIのDrawState関数で描画してみることにします。pos命令の位置ずらしとともにmes命令とcolor命令の2回呼び出せば実現できる代物ではありますが・・・。
; 使用不可風文字列表示サンプル (by Kpan) #include "user32.as" syscolor 15 boxf ; mes命令と同じようにfont命令系が利用できます sysfont 17 ; DrawState関数。 ; 第1パラはディバイスコンテキストを指定(hdc) ; 第4パラに表示文字列 ; 第6/7パラに表示XY座標位置 ; 第10パラが描画のスタイルと状態 DST_TEXT($1)+DSS_DISABLED($20) DrawState hdc, 0, 0, "Hello World!" , 0, 50, 50, 0, 0, $1 | $20 ; M$ Officeについてくるフォント font "HG創英角ポップ体", 30 DrawState hdc, 0, 0, "HSPプログラミング。" , -1, 150, 150, 0, 0, $1 | $20 ; 再描画 ; このサンプルでは必要ですが、他の命令の使用で再描画が行われる時が ; あるので適時判断を。 redraw
DrawState関数はパラメータ数がやたら多いですな・・・。テキトーにモジュール形式にしておけば手軽に呼び出せそうです。
; 使用不可文字列の表示モジュール (by Kpan) #include "user32.as" #module #deffunc mes_gray str p1, int p2, int p3 DrawState hdc, 0, 0, p1, 0, p2, p3, 0, 0, $21 return #global ; 以下、サンプル syscolor 15 : boxf ; 表示文字列、表示するXY座標 mes_gray "Let's HSP!", 100, 100 sysfont 17 mes_gray "HSP講座", 200, 100 redraw
HSPのexist命令でファイルのサイズは取得できますが、そのようなサイズ数値を元に一般的なサイズ向けの単位、バイト(Byte)、キロバイト(KB)、メガバイト(MB)、ギガバイト(GB)の文字列に変換するモジュールです。
使用しているStrFormatByteSize関数は、Windows 95/98/2k環境の場合に、Internet Explorer 4.0以降が必要。また、2GBが変換の限度となっています(それ以上のサイズは、Internet Explorer 5以降のStrFormatByteSize64関数)。
; サイズ数値の整形変換モジュール (by Kpan) ; !要IE4以降 #module #uselib "shlwapi" #func StrFormatByteSize "StrFormatByteSizeA" int, int, int #defcfunc ByteSize int p1 sdim pszBuf StrFormatByteSize p1, varptr (pszBuf), 64 return pszBuf #global ; 以下、サンプル size = 532 mes ByteSize(size) size = 1340 mes ByteSize(size) size = 2400016 mes ByteSize(size)
shlwapi.dll 関連の雑多スクリ。IE4.0以降が必要。
; shlwapi.dllの雑多スクリ (by Kpan) ; !要IE4以降 #uselib "shlwapi" #func PathMatchSpec "PathMatchSpecA" str, str #func PathRenameExtension "PathRenameExtensionA" int, str #func PathCompactPath "PathCompactPathA" int, int, int #func StrToIntEx "StrToIntExA" str, int, int sdim filepath, 256 filepath = "C:\\Program Files\\hsp31\\hsplet3.exe" ; ファイルパスに指定文字列が含まれているか確認 (ワイルドカードに「*」と「?」を指定可能) ; 含まれていれば0以外、含まれていなければ0が返る PathMatchSpec filepath, "*hsp*.exe" mes stat ; ファイルパス文字列の拡張子部分だけすげ替える PathRenameExtension varptr(filepath), ".bmp" ; 標準命令でやるとなると // filepath = getpath(filepath, 1) + ".bmp" mes filepath ; 長いファイルパス文字列を指定したピクセル幅内に収まるよう「...」整形 PathCompactPath hdc, varptr(filepath), 200 mes filepath ; 16進数文字列表記「0x*****」を数値に変換 ; 「$*****」の方はint関数でOK StrToIntEx "0x10", 1, varptr(data) mes data
数値文字列を3桁コンマ(カンマ、「,」)で区切るモジュール。HSPの標準命令でコンマをコツコツと挿入することで実現できますが、Windows API(Win32 API関数)に放り投げーる。
; 3桁コンマ区切りモジュール (by Kpan) #module #uselib "kernel32" #func GetNumberFormat "GetNumberFormatA" int, int, str, int, int, int #defcfunc ThousandSep str p1 dim NUMBERFMT, 6 lpDecimalSep = "." : lpThousandSep = "," NUMBERFMT = 0, 0, 3, varptr(lpDecimalSep), varptr(lpThousandSep), 1 sdim lpNumberStr GetNumberFormat , , p1, varptr(NUMBERFMT), varptr(lpNumberStr), 64 return lpNumberStr #global ; 以下、サンプル value = "1234567890" mes ThousandSep(value) : 数値の場合は文字列にして渡す value = 77777 mes ThousandSep(""+value+"") value = "-1234567890" mes ThousandSep (value)
単純にint関数が用意されてますが、2進数や8進数や16進数の文字列を数値に変換します。HSP2のllmod.asモジュールで用意されていたstrtoint命令と同じ機能です。
#uselib "msvcrt" #cfunc strtol "strtol" str, nullptr, int ; 2進数 mes strtol("101101", 2) ; 8進数 mes strtol("12", 8) ; 先頭が「0」付きなら第2パラは省略可 // mes strtol("012", ) ; 16進数 mes strtol("FF", 16) ; 先頭が「0x」付きなら第2パラは省略可 // mes strtol("0xFF", )
Copyright © Kpan. All rights reserved.