サンデープログラマーレベルの者です。
宜しくお願いします。
下のような感じで、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;
宜しくお願い致します。
メモリ使用量とか作法とか気にしないなら別にそのままでも終了時に勝手にメモリは解放されるでしょう
その処理を繰り返したり使っているうちに謎のエラーが出て悩むなら
最初から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;
TListViewのOnDeletionイベントを使うと簡単です。
procedure TForm1.ListView1Deletion(Sender: TObject; Item: TListItem);
var
Obj: TObject;
begin
Obj := TObject(Item.Data);
Item.Data := nil;
Obj.Free;
end;
vram様
HFUKUSHI様
ありがとうございました。
Q:ListView.Item.Dataに登録したTStringListはFreeが必要でしょうか?
A:YES
ということで良いのでしょうか?
とりあえず作法通り自分で解放することにします。
お使いのバージョンによって答えが変わるので、以下を参照されることをおすすめしますが、何れにせよどのバージョンでも私個人としてはFreeは入れた方が良いと思います。答えにくくてすいません。
Jun HOSOKAWA様の記事
ARCとDisposeOfについて
https://qiita.com/pik/items/3a43514c60d2d24bd20d
mam様、ありがとうございます。
バージョン書き忘れてましたね。Delphi11CEです。最近Delphi7から引っ越しました。
紹介していただいた記事を読みました・・・
DisposeOfは知らなかったです。Freeしか使ったことないです。
Delphi11CEならARCは多分無効で、
DisposeOf は、未だ deprecatedでは無いのですが、後々非推奨になるので、freeを使うのが良いと思います。
皆様ありがとうございました。
自分で作ったものは自分で解放するということで解決と致します。
ツイート | ![]() |