2016-05-31 1 views
1

In Delphi 10 Berlin unter Windows einen allgemeinen TList mit generischen Unterlisten befreien Ich habe folgende Fragen in Bezug auf die Befreiung von generischen Listen: Wie in TMyRecord

Ich habe die folgende Aufzeichnung/Listenstruktur:

type 
    TMyRecord=record 
    Value1: Real; 
    SubList1: TList<Integer>; 
    SubList2: TList<Real>; 
    end; 

    TMyListOfRecords=TList<TMyRecord>; 

ich mag die Struktur mit dem folgenden Code befreien:

var 
    i: Integer; 
    AMyListOfRecords: TMyListOfRecords; 
begin 
    //other code 

    //free AMyListOfRecords and all its content 
    for i:=0 to AMyListOfRecords.Count-1 do 
    begin 
    AMyListOfRecords[i].SubList1.Free; 
    AMyListOfRecords[i].SubList2.Free; 
    end; 
    AMyListOfRecords.Free; 
end; 

Dies scheint zu funktionieren. Aber ich frage mich, ob es eine einfachere oder elegantere Lösung gibt?

+0

Wenn Sie das DeHL verwenden können, dann können Sie einfach IList <> verwenden, das automatisch wie alle anderen verbundenen Objekte verwaltet wird. –

+0

Andernfalls können Sie nur Ihren eigenen Wrapper über IList über TList implementieren und TInterfacedObject tun. –

+2

Ihr Code scheint mir gut zu sein –

Antwort

2

Sie können die Schnittstelle Liste für die Unterpunkte definieren wie :

type 
    TMyRecord=record 
    Value1: Real; 
    SubList1: IList<Integer>; 
    SubList2: IList<Real>; 
    end; 

    TMyListOfRecords=TList<TMyRecord>; 

Wo IList Art ist:

type 
    IList<T> = interface 
    function Add(const AValue: T): Integer; 
    function Remove(AValue: T): Integer; 
    end; 

, wo Sie es wie folgt implementieren:

TIntfList<T> = class(TInterfacedObject, IList<T>) 
    private 
    FList: TList<T>; 
    function Add(const AValue: T): Integer; 
    function Remove(AValue: T): Integer; 

    constructor Create; 
    destructor Destroy; override; 
    end; 

{ TIntfList<T> } 

function TIntfList<T>.Add(const AValue: T): Integer; 
begin 
    Result := FList.Add(AValue); 
end; 

constructor TIntfList<T>.Create; 
begin 
    FList := TList<T>.Create; 
end; 

destructor TIntfList<T>.Destroy; 
begin 
    FList.Free; 
    inherited; 
end; 

function TIntfList<T>.Remove(AValue: T): Integer; 
begin 
    Result := FList.Remove(AValue); 
end; 

Danach können Sie Felder Ihrer Datensatz mit TIntfList.Create zuweisen können, und sie werden automatisch mit Ihren Aufzeichnungen freigegeben.

4

Sie könnten den Datensatztyp in eine Klasse umwandeln - der Overhead ist vernachlässigbar, da der Datensatz bereits Unterobjekte enthält. Kostenlose Unterobjekte in dieser Klasse destructor, und verwenden Sie

TMyListOfClasses = TObjectList<TMyClass>; 

mit OwnsObjects = True

In diesem Fall alles, was Sie brauchen, ist

AMyListOfClasses.Free; 
+0

Ist es eine separate Liste von eigenen Objekten zu zerstören, oder wird es verwendet RTTI dafür? – Michael

+0

@Michael TObjectList ist nur eine Liste von Objekten, es zerstört alle seine Elemente (wenn 'OwnsObjects'), gibt es keine Notwendigkeit in separaten Liste oder RTTI – MBo

+0

Ja, ich bin Old School. Ich bevorzuge es, den Destruktor zu machen, weil du manchmal keine eigene Option hast und ich es vergesse. – Michael

Verwandte Themen