ListView.Item.Dataに登録したTStringListはFreeが必要でしょうか?

解決


たま  2024-01-31 09:50:49  No: 151367

サンデープログラマーレベルの者です。
宜しくお願いします。

下のような感じで、ListViewのItemに登録したTStringListは
var
  LstItem : TListItem;
  LstData : TStringList;
begin
  ListView1.Items.Clear;
  LstItem := ListView1.Items.Add; //ListViewにItemを追加
  LstData := TStringList.Create;  //StringListを生成して
  LstItem.Data := LstData;        //ItemのDataに登録
  //その他いろいろな処理
end;
このようにつくられた TStringListは
FormClose または FormCloseQuery あたりで Freeする必要があるのでしょうか?

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
  i : integer;
begin
  for i := 0 to ListView1.Items.Count - 1  do
    TStringList(ListView1.Items[i].Data).Free;
end;

宜しくお願い致します。


vram  2024-01-31 10:07:15  No: 151368

メモリ使用量とか作法とか気にしないなら別にそのままでも終了時に勝手にメモリは解放されるでしょう

その処理を繰り返したり使っているうちに謎のエラーが出て悩むなら
最初からFreeも実装したほうがいいかもね

ぐらいでしょうか?

リストから削除する処理で

procedure ListDelete(Index : Integer);
var
  ts : TStringList;
begin
  ts := TStringList(ListView1.Items[i].Data);
  ts.Free;
  ListView1.Items.Delete(Index);
end;

こんな感じ
Clearも作ると

procedure ListClear();
var
  i : Integer;
begin
  for i:= Count-1 downto 0 do begin
    ListDelete(i);
  end;
end;


HFUKUSHI  2024-01-31 10:55:54  No: 151369

TListViewのOnDeletionイベントを使うと簡単です。
procedure TForm1.ListView1Deletion(Sender: TObject; Item: TListItem);
var
  Obj: TObject;
begin
  Obj := TObject(Item.Data);
  Item.Data := nil;
  Obj.Free;
end;


たま  2024-01-31 13:00:44  No: 151370

vram様
HFUKUSHI様
ありがとうございました。
Q:ListView.Item.Dataに登録したTStringListはFreeが必要でしょうか?
A:YES
ということで良いのでしょうか?
とりあえず作法通り自分で解放することにします。


mam  URL  2024-01-31 13:15:04  No: 151371

お使いのバージョンによって答えが変わるので、以下を参照されることをおすすめしますが、何れにせよどのバージョンでも私個人としてはFreeは入れた方が良いと思います。答えにくくてすいません。

Jun HOSOKAWA様の記事
ARCとDisposeOfについて
https://qiita.com/pik/items/3a43514c60d2d24bd20d


たま  2024-01-31 13:41:33  No: 151372

mam様、ありがとうございます。
バージョン書き忘れてましたね。Delphi11CEです。最近Delphi7から引っ越しました。
紹介していただいた記事を読みました・・・
DisposeOfは知らなかったです。Freeしか使ったことないです。


mam  2024-01-31 13:54:55  No: 151373

Delphi11CEならARCは多分無効で、
DisposeOf は、未だ deprecatedでは無いのですが、後々非推奨になるので、freeを使うのが良いと思います。


たま  2024-02-01 12:55:23  No: 151374

皆様ありがとうございました。
自分で作ったものは自分で解放するということで解決と致します。


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








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