Last Update : 2009/04/xx
文字列に関連したHSP標準サポートの命令や関数です。
名称 | 説明 | |
mes命令 | 表 示 |
文字の描画 |
color命令 | 文字の描画色の指定 | |
font命令 | 文字の表示フォント・サイズの指定 | |
pos命令 | 文字の描画位置の指定 | |
getpath関数 | 変 換 |
英文字列の小文字変換 |
strf関数 | 書式変換 (桁揃え、16進数、小数点) | |
cnvstow命令 | ||
cnvwtos関数 | ||
getstr命令 | 操 作 |
特定区切りで文字列切り出し |
instr関数 | 指定文字列の検索 | |
getpath関数 | ファイルパス文字列の分解 | |
strmid関数 | 指定位置から指定文字数の切り出し | |
poke命令 | 文字列の書き出し | |
split命令 | [HSP 3.2] 特定区切りで文字列を切り出して各変数に代入 | |
strlen関数 | 文字列の長さをバイト単位で取得 | |
strtrim関数 | [HSP 3.2] 文字列の除去 |
英文字列の大文字&小文字の変換です。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
mes命令で表示する文字列。SetTextCharacterExtra関数を利用して、1文字ごとの表示間隔を調節します。注意点として、間隔を広げた分だけ後ろ部分が描画されずに途中で切れちゃうので、mes命令で適度にスペースを付け足してください。
// 文字の表示間隔変更 #include "gdi32.as" ; 10ピクセル SetTextCharacterExtra hdc, 10 mes "あいうえお " ; デフォルト SetTextCharacterExtra hdc, 0 mes "あいうえお"
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", )
HSPには文字列の長さを取得するstrlen関数が用意されてます。ただ、これはバイト単位です。つまり、普通の日本語(ひらがな、漢字、カタカナ)は2バイトということになります。ここでは文字数単位でカウントするサンプルです。
文字列をUnicode形式に変換する機能を持つMultiByteToWideChar関数を利用します。この関数には変換した際に必要となるサイズを提示してくれる機能もあるのでそれを利用します。(戻り値の文字数は、NULL文字分が含まれるので実際は-1してください)
// 文字数単位で文字数カウント (by Kpan) #include "kernel32.as" // 扱う文字量に合わせてsdim命令でバッファを確保してください buf = "あはは、HSPのKpanです" mes buf mes " バイト単位: "+strlen(buf) MultiByteToWideChar 0, 0, varptr(buf), -1, 0, 0 mes " 文字単位: "+stat
ついでに、文字数単位の1文字分切り出しのサンプルコード。HSP標準対応のcnvstow命令でUnicode文字化(全部2バイト)し、そこからwpeek関数で2バイト分切り出して、cnvwtos関数で通常のShift_JIS文字へと戻してます。
// 文字数単位で切り出し (by Kpan) buf = "あいうLet's HSPえおー" sdim uni cnvstow uni, buf repeat value = wpeek(uni, cnt * 2) if value = 0 : break mes cnvwtos(value) loop mes "done"
HSPではfont命令を使ってmes命令・print命令やオブジェクトでの表示フォントを指定できます。これとは逆に、SPのウィンドウに反映されてるフォント情報を取得してみることにします。
HSPのBMSCR構造体をチェックすると、フォントのデータが格納されたLOGFONT構造体という内部情報を取得できます。(font命令のパラメータとは異なる形式の数値が返るのでちょくとさんのページを参照)
// フォント情報の取得 (by Kpan) font "MS UI Gothic", 30, 4 + 16 objmode 2 sdim buf, 256 buf = "あいうえお HSP フォント" input buf, 600, 100 ; HSPのBMSCR構造体 mref BMSCR, 67 sysfont 17 ; font命令でいう第1パラメータ mes "高さ : "+BMSCR.49 ; font命令でいう第2パラメータ mes "太さ : "+BMSCR.53 mes "イタリック体 : "+peek(BMSCR.54, 0) mes "下線 : "+peek(BMSCR.54, 1) mes "打ち消し線 : "+peek(BMSCR.54, 2) mes "出力品質 : "+peek(BMSCR.55, 2) ; フォント名 sdim lfFaceName getstr lfFaceName, BMSCR, $E0 mes "フォント名 : "+lfFaceName
フォント名文字列の取得だけなら、Win32 APIのGetTextFace関数を呼ぶ方法もあります。
// フォント名のみ取得 #include "gdi32.as" font "MS UI Gothic" sdim lpFacename GetTextFace hdc, 64, varptr(lpFacename) mes lpFacename
Copyright © 2005-2012 Kpan. All rights reserved.