Som den gode borrisholt siger så er løsningen at skippe arrays TList. For at se om jeg kan tiltuske mig nogle points ... så vedlægger jeg her et par eksempler:
TMyList1 er en nedarving af TClassList (forventer objekter, hvor TList forventer pointere => når listen frigives, så frigives eventuelle objekter på listen automatisk). Fordelen er, at det ikke fylder meget at lave sin egen variant. Ulempen er, at du får alle de properties og metoder som TClassList har, med. Det er ikke altid hensigtsmæssigt.
TMyList2 er et eks. på indirekt nedarving og jeg offentliggør kun tre metoder: Add, Delete og Count. Ulempen er, at det fylder mere i implementeringsdelen.
unit ULists;
interface
uses SysUtils, Classes, ContNrs;
type TMyData = class private fName : string; fAdr : string; public constructor Create(const aName, aAdr : string); property Name : string read fName; property Adr : string read fAdr; end;
TMyList1 = class(TClassList) // direct inheritance! private function GetMyData(aIndex: integer): TMyData; public property Items[aIndex : integer] : TMyData read GetMyData; default; function Add(aMyData : TMyData) : integer; end;
TMyList2 = class // indirect inheritance! private fList : TClassList; function GetMyData(aIndex: integer): TMyData; public constructor Create; destructor Destroy; override; procedure Delete(aIndex : integer); function Count : integer; function Add(aMyData : TMyData) : integer; property Items[aIndex : integer] : TMyData read GetMyData; default; end;
Efter en tur inde i VCL-sourcen er jeg blevet opmærksom på, at TClassList IKKE rydder op efter sig. Ovenstående eksempel, hvor jeg kalder fList.Free i destructoren, vil efterlade en stak løse objekter.
I midlertid skulle man kunne erstatte den med TObjectList i stedet. Her kan man med en optionel parameter angive om listen skal håndtere hukommelsen eller om det klares eksternt.
Beklager
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.