Delphi初心者です。
あああ
いいい
ううう
というような、テキストファイルがあり、それを読み込んでListViewのCaptionに3行表示したいのですが、ファイルを1行づつ読み込む部分がわかりません。どなたか教えてください。
テキストファイルの読み込みは、
簡単な方法は、TStringListを使います。
読み込んだ後は、
TStringList[0]は'あああ'
TStringList[1]は'いいい'
TStringList[2]は'ううう'
になります。
var
StringList1 : TStringList;
StringList1 : TStringList.Create;
try
TStringList.LoadFromFile('テキストファイル名');
finally
StringList1.free;
StringList1 := nil;
end;
StringListという便利なものがあるんですね。勉強不足でした。
最後の2行の
StringList1.free;
StringList1 := nil;
は、freeだけではだめなのですか?
残る可能性があるので、必要です。
FreeAndNil(TObject)もあります。これだと一行減ります。
nilを代入しなくても残りませんよ。
残るのはVBですな。
StringList1.Freeした時点で、StringList1は無効なポインタを指しています。
次のような場合に、nilを代入する必要があります。
StringList1 := nil; // 初期値をnil(not assignの状態)にする。
try
{...なんらかの処理...}
StringList1 := TStringList.Create;
{...なんらかの処理...}
FreeAndNil(StringList1); // Freeしたらnilを代入しておく
except
//例外が発生
//割り当てられていたらFreeAndNilを実行
if not Assigned(StringList1) then FreeAndNil(StringList1);
end;
もしかしたら、FreeAndNilするのにnot Assignedで確認する必要はないかもしれませんが、今Delphiがない環境なので確認できません。
//例外が発生
//割り当てられていたらFreeAndNilを実行
//if not Assigned(StringList1) then FreeAndNil(StringList1);
if Assigned(StringList1) then FreeAndNil(StringList1);
それこそアクセス違反の例外発生かと。
また、D5では、FreeAndNil内で、Assigned判定は行っていないので、例のように明示的に確認する必要ありです。
> StringList1.free;
> StringList1 := nil;
コレをやってくれるだけの関数かと。。。
> それこそアクセス違反の例外発生かと。
またやってしまいました。
if Assigned(...) then ...Free;
ですね。
もし「割り当てられている」ならば「解放」ですね。
混乱させて申し訳ない。
ソースを確認したら、FreeAndNilの中では、
中身をnilにして、オブジェクトを解放
としているようです。やはりifは必要ですね。
freeしてnil代入、ではなく、一時変数に代入後、参照引数にnilを代入、一次変数をfreeという順ですので、解放時に例外が発生してもNilが代入されています。
nilに対するfreeは安全です。
FreeAndNilはnilを入れてくれるだけじゃなく多スレッド間で参照される
オブジェクトでも安全に解放できますね。
ツイート | ![]() |