With TList.CreateのFreeのしかた。

解決


マッコ  2003-08-07 02:58:21  No: 4345

procedure TForm1.Button3Click(Sender: TObject);
begin
  With TList.Create do
  begin
    //何かする
    {
    このところしかFree出来ないの,

    }
  end;
  //ここでFreeしたいがやり方がわからないです、どなたか教えてください!。
end;


Halbow  URL  2003-08-07 04:34:53  No: 4346

Halbow です。

With TList.Create do は、TList のコンストラクタが返すオブジェクト
を with で参照しているので、このままでは with の外で Free できません。

procedure TForm1.Button3Click(Sender: TObject);
var
  List:TList;
begin
  List := TList.Create;
  With List  do
  begin
    //何かする
  end;
  List.Free;
end;

とするといいです。個人的には、元質問のようなインスタンスを明確にしない 
with の使用はしないようにしています。


たかみちえ  URL  2003-08-07 06:32:49  No: 4347

> 個人的には、元質問のようなインスタンスを明確にしない 
with の使用はしないようにしています。
  というのはわかっているんですけど、ついついやっちゃうんですよね、簡単なので…^^;

  ええと、こういう風にやります。
Delphiですから、BCBに翻訳してください。あまり変わらないと思います。
  With TList.Create do begin try
    //何かする
  finally Free; end;
  end;
です。ここで、try..finallyは、オブジェクト生成の決まり文句なので(必ず破棄できるようにするため)、こうしておきましょう。
with内のFreeは、TFormにもあるメソッドなので、使用をためらうでしょうけど、
この場合、まずwith文の中から(もっと言うと、with文内のdoに近いほうから)参照されるので、
問題はありません。
  たとえば以下のような構文もOKです。
with FileList.Items, TList.Create do begin try... // FileListは、事前に宣言したTListBoxとします。
最後にFreeした場合は、TListのFreeが呼ばれますし、
Deleteメソッドを使っても、TListのが呼ばれます。

  でも、こうすると、
procedure ABC(List: TList)みたいな関数に渡すことはできません。


たかみちえ  URL  2003-08-07 07:53:39  No: 4348

ああ、よくみたらDelphiですね^^;
{}があるのでBCBだと思ってしまいました。


マッコ  2003-08-08 00:15:28  No: 4349

よく著名なフリーソフトの作家がよくこのような方法でソフトを書かれるので、
Withの外でfree;出来る方法があるかと思い質問させていただきました、
大変よくわかりました、ありがとうございます。


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

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






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