Variablen vom Typ Record in einer dynamischen Liste verwalten

August 6, 2010 - Lesezeit: ~1 Minute
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.
Tags: Delphi Delphi 2009