HSP3 あれこれ <文字列>

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桁コンマ区切り

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