テキストファイルのロードとセーブ


●テキストファイルのロードに便利な文字列リスト形式

テキストでロードやセーブをするのに便利な変数に
文字列リスト形式というものがある。

これは、複数行の文字列を扱うことができる形式で
行ごとに追加や削除や変更ができる。
もちろん全体を改行つきテキストとして、セーブやロードができる。

何ができるか詳しく知りたければ、プログラム内に
TStringListと打ち込んでから点滅カーソルを合わせてF1のヘルプ。

●文字列リストの初期化と破棄

文字列リストはこれまでの形式と違い、どのくらいのサイズになるか
判り難いデーターである。そのせいで宣言した後で初期化して
あらかじめメモリを確保しなければならない。
これは最初にする宣言とはまた別の命令となっている。
LoadList: TStringList; //宣言
〜〜〜〜〜〜〜〜〜
LoadList := TStringList.Create; //初期化
これが宣言と初期化の方法。
LoadListは使いたい文字列リストの名前。
この二つでやっと使用が可能になる。

そして使用した後はきちんと破棄してやらないといけない。
procedure TForm1.FormDestroy(Sender: TObject);
begin
 LoadList.Free; //終了時、フリーで廃棄
end;
破棄は主にプログラムを終了させる時に行われる。
が、文字列リストのデーターをどこかに移しておき
読み出し後にすぐ破棄する方法もある。

プログラム終了時に行われる命令にはFormDestroyの他に
FormCloseなどがあるが、FormDestroyのほうがより確実。

●データーのある場所を探す

普通のゲームではプレイヤーがどこにゲームデーターを置くかは
人によってバラバラである。だが、データーファイルは実行ファイルと
同じフォルダにあるのが普通なので、実行ファイルが実行された場所を
調べれば、データーファイルのある場所もわかる。
ExePath: string;
〜〜〜〜〜〜〜〜〜〜
ExePath := ExtractFilePath(Application.ExeName);
それが上のプログラムになる。

Application.ExeNameは実行プログラムのある位置を
パス名すべて含めて返す命令。

ExtractFilePathはフォルダ部分、つまりパスのみを抜き出す命令。
たとえば文字列c:\windows\Win.ini
ExtractFilePath( 'c:\windows\Win.ini' ) としてやると
文字列c:\windows\ を返してくれる。

●テキストデーターのロード

try
 LoadList.LoadFromFile(ExePath+'stagedata.txt'); //ファイルを読み込む。
except //ロードに失敗したらここを実行
 ShowMessage('面データーのロードに失敗しました。');
end;
LoadList.LoadFromFileが実際にロードしている行。
上で取得したExePathを利用し、そのフォルダにある
stagedata.txtをロードしている。

その前後にあるtryexceptend;はエラーを制御する命令。
try以後のプログラムで何かエラーが発生した場合
except以後に書かれたプログラムを実行する。
ロードが失敗した時に対応を変えなければいけないのと
プログラムエラーでそのまま異常終了しないために必要。

●データーの加工方法

ロードセーブとは関わりが無いが一応。リスト名は仮にLoadListとしておく。

 LoadList.Count

最初を1行目とした総行数。for文での全行操作のためによく使われるが
for文指定時に直接LoadList.Countが使えないので
別の数値変数に代入して使わなければならない。
また、多くの他数値が最初の行を0としているので代入時に-1が必要。

 LoadList.Strings[**]

**行目の文字列。**内は最初を0行目とした行数指定。
moji := LoadList.Strings[0] とやれば文字列リストの最初の行にある
文字列のみを取り出すことができるし
LoadList.Strings[0] := moji; なら最初の行の内容を変更できる。

なお、LoadList[**]という形に省略が可能。

 LoadList.Insert(**,'文字列');

**行目に文字列を挿入する。ここの行の文字列とそれ以降は
+1された行へ移る。**がLoadList.Count行目なら
一番最後に追加されることになる。(.addを使ったほうが楽だが)
使用後は当然LoadList.Countが1増える。

 Loadlist.Delete(**);

**行目の文字列を削除する。以降の行は間を詰める。
空行だけが残ったりしない。当然LoadList.Countは1減る。

 そのほかは自己学習で。


●テキストデーターのセーブ

LoadList.SavetoFile(Name);
これだけ。セーブ先のNameはフルパスが必要なので
実行ファイルのある場所へセーブしたい場合。
Name := ExtractFilePath(Application.ExeName)+'data.txt';
とやっておくことが必要。

 戻る