Hast du schonmal mit den Generics gearbeitet?
GegnerListe[0] liefert dort den Record, genauer eine Kopie des Records und keinen Zeiger.
Delphi-Quellcode:
type
TGegnerRecord = record
Name:AnsiString;
PosX:Integer;
PosY:Integer;
{...}
end;
var
Gegner: TGegnerRecord;
GegnerListe: TList<TGegnerRecord>;
GegnerListe := TList<TGegnerRecord>.Create;
Gegner.Name := 'ich';
Gegner.PosX := 123;
...
GegnerListe.Add(Gegner);
Label1.Caption := GegnerListe[0].Name:
GegnerListe[0].PosX := 456; // geht nicht, auch wenn der Compiler, in älteren Delphi-Versionen, keine Warnung/Fehlermeldung anzeigt
GegnerListe.Free;
Vorteil ist zwar, daß hier delphi die komplette Speicherverwaltung übernimmt, innerhalb der Liste und auch für die Einzelrecords.