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

解決


たま  2024-01-31 00:50:49  No: 151367  IP: 192.*.*.*

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

下のような感じで、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 01:07:15  No: 151368  IP: 192.*.*.*

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

その処理を繰り返したり使っているうちに謎のエラーが出て悩むなら
最初から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 01:55:54  No: 151369  IP: 192.*.*.*

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 04:00:44  No: 151370  IP: 192.*.*.*

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

編集 削除
mam  URL  2024-01-31 04:15:04  No: 151371  IP: 192.*.*.*

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

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

編集 削除
たま  2024-01-31 04:41:33  No: 151372  IP: 192.*.*.*

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

編集 削除
mam  2024-01-31 04:54:55  No: 151373  IP: 192.*.*.*

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

編集 削除
たま  2024-02-01 03:55:23  No: 151374  IP: 192.*.*.*

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

編集 削除