.txtファイルからテキストデータを1行づつ読込みListViewに表示


あい  2005-06-05 12:26:41  No: 15385

Delphi初心者です。

あああ
いいい
ううう

というような、テキストファイルがあり、それを読み込んでListViewのCaptionに3行表示したいのですが、ファイルを1行づつ読み込む部分がわかりません。どなたか教えてください。


HOta  2005-06-05 17:04:54  No: 15386

テキストファイルの読み込みは、
簡単な方法は、TStringListを使います。
読み込んだ後は、
   TStringList[0]は'あああ'
   TStringList[1]は'いいい'
   TStringList[2]は'ううう'
になります。

var
  StringList1 : TStringList;

  StringList1 : TStringList.Create;
  try
    TStringList.LoadFromFile('テキストファイル名');
  finally
    StringList1.free;
    StringList1 := nil;
  end;


あい  2005-06-05 19:22:54  No: 15387

StringListという便利なものがあるんですね。勉強不足でした。

最後の2行の
StringList1.free;
StringList1 := nil;
は、freeだけではだめなのですか?


HOta  2005-06-05 20:04:41  No: 15388

残る可能性があるので、必要です。
FreeAndNil(TObject)もあります。これだと一行減ります。


にしの  2005-06-05 21:22:44  No: 15389

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がない環境なので確認できません。


ん?  2005-06-06 17:24:46  No: 15390

//例外が発生
  //割り当てられていたらFreeAndNilを実行
  //if not Assigned(StringList1) then FreeAndNil(StringList1);
  if Assigned(StringList1) then FreeAndNil(StringList1);

それこそアクセス違反の例外発生かと。

また、D5では、FreeAndNil内で、Assigned判定は行っていないので、例のように明示的に確認する必要ありです。

> StringList1.free;
> StringList1 := nil;
コレをやってくれるだけの関数かと。。。


にしの  2005-06-06 18:19:55  No: 15391

> それこそアクセス違反の例外発生かと。

またやってしまいました。
if Assigned(...) then ...Free;
ですね。
もし「割り当てられている」ならば「解放」ですね。
混乱させて申し訳ない。

ソースを確認したら、FreeAndNilの中では、
中身をnilにして、オブジェクトを解放
としているようです。やはりifは必要ですね。
freeしてnil代入、ではなく、一時変数に代入後、参照引数にnilを代入、一次変数をfreeという順ですので、解放時に例外が発生してもNilが代入されています。


sakiyama  2005-06-06 18:23:10  No: 15392

nilに対するfreeは安全です。
FreeAndNilはnilを入れてくれるだけじゃなく多スレッド間で参照される
オブジェクトでも安全に解放できますね。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加