Last Update : 2008/11/xx
テキストデータを「行単位」で取得・編集できるメモリノートパッド命令群です。命令や関数の名前がすべて「note〜」というスタイルなのでまとめて説明解説します。
メモリノートパッド命令は基本的にテキストデータの扱うために用意されてます。たとえば、プログラムの設定をINIファイル(*.ini)として保存したり、テキストファイル(*.txt)を扱う簡易的なテキストエディタなど、保存されたデータをファイルから読み込む時に利用します。テキストデータはファイルの拡張子関係なく、Windowsの「メモ帳」などで文字化けすることなく閲覧できるものです。
命令・関数 | 機能 |
notesel命令 | 操作対象となる変数バッファの指定 (必須) |
notesave命令 | テキストデータをテキストファイルとして出力保存 |
noteload命令 | テキストファイルをテキストデータとして読み込み |
noteget命令 | 1行分のテキストデータの取得 |
noteadd命令 | 1行分のテキストデータの追加挿入・上書き変更 |
notedel命令 | 1行分のテキストデータの削除 |
noteunsel命令 | [HSP3] バッファの復帰? |
noteinfo関数 (notemax変数) |
テキストデータ全体の行数の取得 |
noteinfo関数 (notesize変数) |
テキストデータ全体のサイズの取得 (バイト単位) |
HSP3に付属するサンプルコードで、メモリノートパッド機能を利用してる実例はこちら。
この「Let's HSP!」サイト内にある実例はこちら。
notesel命令は操作対象となる変数バッファを指定する命令です。note〜命令を利用する際に必ず呼ぶ必要があります。命令名は「note select」から来たものです。
下のコードは変数bufが操作対象先となり、noteload命令によるテキストファイルの読み込み結果がこの変数に格納されることになります。bload命令と違って、noteload命令による読み込み処理の場合、バッファ確保はHSP内部で行うのでsdim命令は不要です。
notesel 操作対象となる変数バッファ
// テキストファイルの読み込みと表示 // ※「readme.txt」ファイルが存在することが前提 notesel buf noteload "readme.txt" title "サイズ : "+strsize+" バイト" ; テキストデータ全体の表示 mes buf
noteload命令はファイルを読み込む(ロード)命令です。第1パラメータに読み込みたいファイルパスやファイル名を指定します。ハードディスク上のファイルの他に、HSPのPACKFILE機能を利用して実行ファイル内に埋め込んだデータもそのまま読み込めます。
システム変数strsizeには読み込んだファイルのサイズ(バイト単位)が返ります。
noteload "ファイルパス", 読み込み上限値
第2パラメータは読み込むサイズの上限値(バイト単位)です。指定がなければファイル全体を読み込みます。ファイル全体を読み込む必要がない場合に指定しておけば、通常よりもメモリ消費量を抑制できます。
// テキストファイルの読み込みと表示 (最大で500バイト分) notesel buf noteload "readme.txt", 500 title "サイズ : "+strsize+" バイト" mes buf
◆ ポイント!
・notesel命令は必ず呼び出す必要がありますが、操作対象バッファが複数個ないなら何回も呼ぶ必要はありません。goto命令やrepeat命令のループ中などで何度も呼ぶような処理は無駄なので、基本的に1度だけの宣言でOKです。
・noteload命令はテキストファイル以外にバイナリファイルも読み込めます。bload命令の場合だと、ファイルサイズを確認するexist命令とバッファを確保するsdim命令が必要ですが、これら相当するバッファサイズ確保処理はHSP内部で行ってくれるので効率がいいです。一方、bload命令の第3パラメータにあるサイズオフセットに相当するパラメータがnoteload命令にはなく、読み込む先頭バイトは必ず0バイト目からです。
テキストファイルを読み込んでテキストデータを取得した後、1行分のデータを取り出すにはnoteget命令を利用します。第2パラメータに取得したいインデックス番号(0〜)を指定します。1行目がインデックス0、2行目がインデックス1、になるので注意してください。
noteget 結果が格納される変数, インデックス番号
取得した結果は第1パラメータで指定した変数に格納されます。なお、この変数のバッファ確保をあらかじめsdim命令で行っておくようにしてください。取得したデータが変数バッファのサイズから溢れそうな場合(バッファオーバーフロー)は、HSPエラーにならないよう内部でバッファサイズの自動拡張処理が行われますが、動作パフォーマンスに響きます。
// テキストファイルの読み込みと1行分の表示 // ※「readme.txt」ファイルが存在することが前提 notesel buf noteload "readme.txt" title "サイズ : "+strsize+" バイト" ; 結果が返る変数用に256バイト分のバッファ確保 sdim data, 256 noteget data, 1 mes "2行目 : "+data noteget data, 6 mes "7行目 : "+data
// テキストファイルの読み込んで1行ごとに表示 notesel buf noteload "readme.txt" title "サイズ : "+strsize+" バイト" ; 結果が返る変数用に256バイト分のバッファ確保 sdim data, 256 ; noteinfo関数で行数取得 repeat noteinfo(0) noteget data, cnt mes ""+strf("%02d", cnt + 1)+" | "+data+"" loop
ちなみに、この取得した1行分のデータをさらに細かく切り出したい場合は、getstr命令、instr関数、strmid関数など文字列操作処理の命令や関数を利用します。
◆ ポイント!
・取得したデータは「文字列型」になってます。データが数字の場合、これを命令のパラメータにそのまま反映してしまうと、「HSPエラー6」(パラメータの型が違います)となります。HSP3の場合は、int関数を使うなどして整数値へと変換させたものを指定してください。
テキストデータを行単位で編集変更です。
(1) 行の追加挿入
1行の追加挿入は、noteadd命令(モード0)を利用します。第3パラメータを0か省略すると、追加挿入です。この処理で全体行数は増えることになります。noteadd命令の時点で行がずれてシフトしてる点に注意してください。
noteadd "挿入する文字列"or文字列型変数, インデックス番号
第1パラメータには挿入する文字列、あるいは挿入する文字列が代入されてる変数を指定します。「\n」を利用すれば一度に複数行の挿入ができます。第2パラメータは挿入するインデックス番号(0〜)です。0を指定すれば1行目、-1か省略した場合は最終行となります。
// テキストデータの1行の追加挿入 buf = "あいうえお\nかきくけこ\nさしすせそ\nたちつてと\nなにぬねの" mes ""+buf+"\n↓" notesel buf noteadd "2行目に追加する", 1 noteadd "最終行に追加する" mes buf
文字列型変数のデータを追加していく雑多なサンプルコードです。noteadd命令で指定した文字列には改行コードも付加されます。
// 一行ずつ文字列を追加 data = "HSP講座", "メモリノートパッド", "命令" notesel buf noteadd data.0 noteadd data.1 noteadd data.2 mes "---" mes buf mes "---"
// 一度に複数行の文字列を追加 notesel buf noteadd "HSP講座\nメモリノートパッド\n命令" mes "---" mes buf mes "---"
// 挿入行をインデックス0に固定して反転格納 data = "あいうえお", "かきくけこ", "させしせそ", "たちつてと", "なにぬねの" notesel buf ; foreach命令はHSP3のみサポート foreach data noteadd data.cnt, 0 loop mes buf
(2) 行の上書き変更
1行の上書き変更は、noteadd命令(モード1)を利用します。第3パラメータで1を指定すると上書き変更です。この処理で全体行数そのものは基本的に変動しないことになります。
noteadd "変更する文字列"or文字列型変数, インデックス番号, 1
第1パラメータには変更する文字列、あるいは変更する文字列が代入されてる変数を指定します。「\n」を利用すれば複数行の挿入ができます(全体行数は変動)。第2パラメータは変更するインデックス番号(0〜)です。
// テキストデータの1行の上書き変更 buf = "あいうえお\nかきくけこ\nさしすせそ\nたちつてと\nなにぬねの" mes ""+buf+"\n↓" notesel buf noteadd "2行目を変更する", 1, 1 noteadd "4行目を変更する", 3, 1 mes buf
(3) 行の削除
1行の削除は、notedel命令を利用します。この処理で全体行数は減ることになります。notedel命令の時点で行がずれてシフトしてる点に注意してください。第1パラメータは削除するインデックス番号(0〜)です。空行化したい場合はnoteadd命令を組み合わせます。
notedel インデックス番号
// テキストデータの行の削除 buf = "あいうえお\nかきくけこ\nさしすせそ\nたちつてと\nなにぬねの" mes ""+buf+"\n↓" notesel buf notedel 1 ; 2行目の削除 notedel 2 ; 4行目の削除 (直前では3行目にずれてる) mes buf
// テキストデータの行の空行化 buf = "あいうえお\nかきくけこ\nさしすせそ\nたちつてと\nなにぬねの" mes ""+buf+"\n↓" notesel buf notedel 1 noteadd "", 1 notedel 3 noteadd "", 3 mes buf
notesave命令はテキストデータをファイルとして出力(セーブ保存)する命令です。ファイルが存在しなければ新規作成され、すでに存在すればそのまま上書き保存されます。notesel命令で指定した変数バッファのデータが書き出される形になります。
notesave "ファイルパス"
第1パラメータに出力するファイルパスやファイル名を指定します。拡張子は何を付けようと自由です。システム変数strsizeには出力したファイルサイズ(バイト単位)が返ります。
// テキストファイルの出力保存 buf = "あいうえお\nかきくけこ\nさしすせそ\nたちつてと\nなにぬねの" notesel buf notesave "hoge.txt" mes ""+strsize+" バイト"
// ウィンドウの左上位置の情報を保存 notesel buf noteadd "ウィンドウの左上位置:" noteadd ""+ginfo(4)+"x"+ginfo(5) notesave "hoge.txt" mes ""+strsize+" バイト"
// 入力ボックス内の文字列を保存 sdim data, 256 data = "この入力ボックス内の文字列を保存するよ!" input data, 500 button "保存", *save stop *save notesel data notesave dirinfo($10000) + "\\hoge-hoge.txt" ; デスクトップに mes ""+strsize+" バイト"
◆ ポイント!
・noteload命令はHSPのPACKFILE内のファイルを読み込めますが、逆にそれをnotesave命令で書き換えることはできません。notesave命令はハードディスク上にファイルを書き出すためのものです。(実行ファイルの時点で、そもそもPACKFILE内のファイルを改変することができません。)
noteinfo関数はnotesel命令で指定した変数バッファ内に格納されてるテキストデータの情報を取得する命令です。モード0が全体行数、モード1が全体サイズ(バイト単位)です。呼び出し時点の状態が返ります。
「hspdef.as」ファイルでマクロ定義されていて、システム変数では「notemax」と「notesize」となってます。
noteinfo(取得モード)
// テキストデータの行数とサイズの取得 notesel buf noteload "readme.txt" mes "全体行数 : "+noteinfo(0) mes "全体サイズ : "+noteinfo(1)