表題の通り、「ジェネリックのTListに格納したrecord型変数は解放する必要が無い」らしい。
従来型のTListだと下記のサンプルのようにrecord型変数を、TList.Addする際にNewで生成して格納して、TList.Delete(remove?)する際に格納していたrecord型変数をDisposeする必要があった。
type TMyRec = record ID: integer; Name: string; end; PMyRec = ^TMyRec; var List:TList; i: integer; myrec: PMyRec; begin List := TList.create; // データサンプルを作成してListに持ってもらう for i := 0 to 99 do begin new(myrec); myrec^.name := intToStr(random(99999)); myrec^.ID := i; List.add(myrec); end; // データの使用例 for i:= 0 to List.Count-1 do begin ListBox1.items.add(Format(’ID:%5.5d, Name=%s’, [PMyRec(List[i])^.ID), PMyRec(List[i])^.Name]); end; // 使い終わったら必ず個々のデータもTListも解放 for i:= 0 to List.count-1 do dispose(PMyRec(List[i])); List.free; end;
しかし、ジェネリックだとNewやDisposeは不要でそのまま使えると言うことらしい。便利になったな。
しかし、基本的にTListを使う際には継承してして独自クラスを作ってから使うんだけどジェネリックのTListはDeleteがオーバーライドできない。
classを格納する場合はどうしたら良いのかな?とふと疑問が湧いた…。
Delphi付属のジェネリッククラスは、使い方がよくわからん。ソートとかの実装方法が直感的にわからなかった。
Delphi 2010, XE だと delphi-coll というサイトで公開されているジェネリッククラス群もあるみたい。
以下のコメントは、その投稿者が所有するものでサイト管理者はコメントに関する責任を負いません。