Variablen vom Typ Record in einer dynamischen Liste verwalten

unit MerkRecord;

interface

uses Classes,Variants;

type
// Dieser Rekord soll in der Liste enthalten sein
TMerkRecord = Record
I :integer;
s :string;
v : Variant;
a :array of char;
End;

// die eigentliche Liste
TMerkList = class(TList)
private
function GetItems(index: integer): TMerkRecord;
protected
// Freigabe des Speichers
procedure Notify(Ptr: Pointer; Action: TListNotification); override;
public
// Zugriff auf den Rekord
property Items[index :integer] :TMerkRecord read GetItems; default;
// Neuen Record hinzufügen
function Add(R :TMerkRecord) :integer;
end;

implementation

type
PMerkRecord = ^TMerkrecord;

{ TMerkList }

function TMerkList.Add(R: TMerkRecord): integer;
var
P :PMerkRecord;
begin
P:= new(PMerkRecord);
P^:=R;
Result:=inherited Add(P);
end;

function TMerkList.GetItems(index: integer): TMerkRecord;
begin
Result:=PMerkRecord(inherited Items[Index])^;
end;

{Strings und dynamische Arrays müssen auf die Länge von 0 gesetzt werden.
Da Variants alle Typen enthalten können, müssen sie auf NULL gesetzt werden}

procedure TMerkList.Notify(Ptr: Pointer; Action: TListNotification);
begin
if Action=lnDeleted then begin
PMerkRecord(Ptr).s:='';
PMerkRecord(Ptr).V:=Null;
SetLength(PMerkRecord(Ptr).a,0);
Dispose(Ptr);
end;
inherited;
end;

end.