開放のタイミング

解決


  2005-06-10 23:32:27  No: 15522

こんにちは

Delphiを勉強中のものなのですが、
Form上にリストボックスが合って
関数で取得した値を表示するプログラムを作成しました
そこで質問なんですが、以下のGListっていつ開放してあげれば
良いかいまいち分かりません。
どなたか教えていただけませんか?

----------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form1.ListBox1.items.Assign (GetList);
end;

Function TForm1.GetList:Tstringlist;
var
  GList:TStringList;
  i:integer;
begin
  GList:=TStringList.Create ;
  for i:=0 to 10 do
  begin
    GList.Add(Inttostr(i));
  end;
  Result:=GList;
  //GList.free;
end;


Basser  2005-06-10 23:48:14  No: 15523

クラスを戻り値にしているので呼出側で解放する必要があります。

procedure TForm1.Button1Click(Sender: TObject);
var
  SL: TStringList;
begin
  SL:= GetList;
  try
    Form1.ListBox1.items.Assign(SL);
  finally
    SL.Free;
  end;
end;


  2005-06-10 23:52:11  No: 15524

Basser さん

レスありがとうございます。
GListをグローバルとかにすればよいのかなぁ
など考えていたんですが、
この方法できっちり開放します。

ありがとうございました


えーと  2005-06-10 23:53:38  No: 15525

> GListっていつ開放してあげれば

セットした直後に開放します。

procedure TForm1.Button1Click(Sender: TObject);
var
  sl: TStringList;
begin
  sl := GetList;
  Form1.ListBox1.items.Assign (sl);
  sl.Free;
end;

でも、クラスのインスタンスを返す関数はあまりよい設計とはいえません。
わたしなら

procedure TForm1.Button1Click(Sender: TObject);
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  InitList(sl);
  Form1.ListBox1.items.Assign (sl);
  sl.Free;
end;

procedure TForm1.InitList(sl: TStringlist);
var
  i:integer;
begin
  sl.Clear;
  for i:=0 to 10 do sl.Add(Inttostr(i));
end;

というふうにします。


ん?  2005-06-10 23:53:42  No: 15526

GetListは、新しいインスタンスを返すため、結果を受け取る側で開放すべき。
GetListをそのまま利用したいのであれば、Button1Click内に、TStringList型の変数を用意して、まずその変数にGetListの結果を代入。
Assign後、破棄。

GetListの引数としてTStringListを受け取り、それにAddするほうが、開放のタイミングが難しくならないでしょう。
Button1Click内でStringListをCreateしておく。
それより、ListBox1.itemsをそのまま引数として渡す方が、なおよし。


ん?  2005-06-10 23:54:46  No: 15527

ありゃ、みんな回答早い。


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

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






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