テキスト操作2
前章でテキストファイルを安全に読み書きする方法の説明を行いました。
この章ではnotesel命令で指定したメモリノートパッドデータを1行単位に操作する命令の紹介を行います。
尚、この章に紹介する命令は全て、このメモリノートパッド系操作命令となるので、
サンプル同様に処理前には必ずnotesel命令で対象の変数を指定しておくようにしてください。
始めに紹介するのは、変数内にあるテキストデータの1行を取得する命令です。
noteget 代入先変数, 取得行
代入先変数取得した1行分のデータを代入する変数を指定する。
取得行先頭行を0として、取得するインデクスを指定する。
第1パラメータに取り出したデータをセットする変数の指定を行います。
指定された変数は現在の型に関わらず、文字列型変数となりますので覚えておきましょう。
第2パラメータには、変数のないテキストの1行目を0、2行目を1、3行目を2…
とした、取得したい「実際の行番−1」を指定してください。
もし、存在しない行番やマイナス値を指定してもエラーにはならず、空文字が返ります。
ヘルプには「指定する変数には、読み出すのに十分なバッファを確保するのを忘れないでください。」
とありますが、HSP3からは変数(バッファ)サイズの自動拡張が行われるようになりましたので、
仮に変数サイズよりも大きいデータを取得しても安全に拡張して処理されます。
 1
 2
 3
 4
 5
 6
	string = "ABCD\nEFGH\nIJKL\nMNOP\nQRST\nUVWX\nYZ01\n2345\n6789"
	notesel string
	repeat notemax
		noteget tmp, cnt // 先頭から順に1行ずつ取り出す
		mes "" + (cnt + 1) + "行目のデータ: " + tmp
	loop
次に紹介するのは、指定した行データを丸ごと削除する命令です。
notedel 削除行
削除行削除するインデクスを指定する。
第1パラメータに指定した行位置にあるテキストデータを除去します。
他の行には影響がありませんが、削除後は行番が1つずつシフトダウンするので間違えないようにしましょう。
 1
 2
 3
 4
 5
 6
 7
 8
	string = "ABCD\nEFGH\nIJKL\nMNOP\nQRST\nUVWX\nYZ01\n2345\n6789"
	notesel string
	notedel 2 // 先頭から2行目(実際の3行目)データを取り除く
	notedel 4 // 元のデータの5行目(実際の6行目)データを取り除く
	repeat notemax
		noteget tmp, cnt
		mes "" + (cnt + 1) + "行目のデータ: " + tmp
	loop
行の取得、削除、と来た次は…行の挿入(置換)を行う命令です。
noteadd 代入文字列, 追加行, モード
代入文字列メモリノートパッドに代入したいテキストを指定する。
追加行追加するインデクスを指定する。
モード追加挿入(=0)するか、上書置換(=1)するかを指定する。
第1パラメータにメモリノートパッドへ追加するテキストまたは文字列型変数を指定します。
第2パラメータに追加する行を指定し、第3パラメータに挿入するのか上書きするのかを指定します。
指定するモードにより変わりますが、もし第3パラメータに0または省略した場合、
指定した行以降のデータは1行ずつシフトアップしますので以後の処理は注意してください。
1(0と省略以外)を指定すると、指定した行データが入れ替わり、その他の行には行番を含め影響ありません。
尚、第2パラメータに−1を指定した場合は最終行が対象となります。
あと、「メモリノートパッド命令でテキストを増やした場合は拡張されるが、通常の連結時は拡張されない」と
ヘルプに記述されていますが、この説明はHSP2以前向けのもので、
HSP3以降であれば、通常の文字列連結時も自動拡張されるので心配ありません。
 1
 2
 3
 4
 5
 6
 7
 8
 9
	string = "ABCD\nEFGH\nIJKL\nMNOP\nQRST\nUVWX\nYZ01\n2345\n6789"
	notesel string
	noteadd "mnop", 3, 100
	tmp = "abcd"
	notedel 0 : noteadd tmp, 0 // 「noteadd tmp, 0, 1」と一緒
	repeat notemax
		noteget tmp, cnt
		mes "" + (cnt + 1) + "行目のデータ: " + tmp
	loop
この章最後に紹介するのは、HSP3で追加された命令です。
noteunsel
[パラメータなし]メモリノートパッドの対象変数を戻すだけの為、パラメータは必要ない。
この命令は主に、複数の変数をメモリノートパッドとして扱いたい場合に使用するものと思われます。
noteunsel命令を置くと、「最後にnotesel命令でメモリノートパッドの対象となった変数」の前に
「notesel命令で指定されていた変数」が対象となります。
今ココで紐解くとややこしくなりそうなので簡単にだけ書いておきますが、
HSPでは、HSPの命令や関数を複数用いて新しく命令・関数をユーザー定義することができます。
この新命令・関数内でメモリノートパッド対象変数を変更してしまうと、
メモリノートパッド対象先を新命令外・関数外の変数に戻すことが出来ませんでしたが、
HSP3から登場した、このnoteunsel命令で戻すことが出来るようになりました。
この説明は、またその時に改めて説明しようと思います。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
	var1 = "ABCDE\nFGHIJ\nKLMNO\nPQRST\nUVWXY\nZ1234\n56789"
	notesel var1
	repeat notemax
		noteget tmp, cnt
		notesel var2
		noteadd tmp, 0
		noteunsel // 1つ前(var1)に戻す
	loop
	pos  50,  50 : mes var1
	pos 150, 100 : mes "−入れ替え→"
	pos 300,  50 : mes var2
notesel命令を繰り返し使用すると、バッファの多重指定になるような書き方がヘルプにあります。
100万回ほどnotesel命令を連続使用してみましたが、影響はないように感じられました。
ただ、今回の検証で何も問題が発生しなかっただけかもしれませんし、
ヘルプに注意書きがされている以上、気をつけるべきポイントなのかもしれません。
複数回notesel命令でメモリノートパッド対象先を変更するようなプログラムを組む場合は、
念のためnoteunsel命令で戻すようにしておくとイイかもしれませんね。