HSP3 あれこれ <文字列>

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] 文字列の除去

 

↑TOP↑

文字列の大文字/小文字変換

 英文字列の大文字&小文字の変換です。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)

↑TOP↑

文字列前後の指定文字の取り除き

 文字列の前後にある指定文字(半角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+")

↑TOP↑

使用不可グレー文字列の描画

 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

↑TOP↑

文字の表示間隔を変更

 mes命令で表示する文字列。SetTextCharacterExtra関数を利用して、1文字ごとの表示間隔を調節します。注意点として、間隔を広げた分だけ後ろ部分が描画されずに途中で切れちゃうので、mes命令で適度にスペースを付け足してください。

//	文字の表示間隔変更

#include "gdi32.as"

;	10ピクセル
	SetTextCharacterExtra hdc, 10
	mes "あいうえお  "

;	デフォルト
	SetTextCharacterExtra hdc, 0
	mes "あいうえお"

↑TOP↑

サイズ数値の整形

 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

↑TOP↑

数値の3桁コンマ区切り

 数値文字列を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)

↑TOP↑

文字列を数値に変換

 単純に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", )

↑TOP↑

文字列を長さを文字単位で取得

 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"

↑TOP↑

フォント情報の取得

 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

↑TOP↑

〜HSP3 あれこれ〜
ウィンドウ | オブジェクト | ファイル | フォルダ | キーボード | マウス | メニュー | システム | 文字列 | COM | その他

Copyright © 2005-2012 . All rights reserved.