Dein Fehler ist, dass a eine Lokale Variable ist die nach der Funktion überschrieben wird. Mit @a bekommst du die Adresse davon und diese wird abgespeichert.
Alle Objekte (auch TListItem) sind bereits Pointer. Was du erzeugst sind Pointer auf Pointer. Mach also folgendes:
1. Record ändern und das ^ entfernen.
Delphi-Quellcode:
TUser =
record
name:
string;
ip:
string;
status: integer;
lvp: TListItem;
end;
2. user.lvp := @a; nach user.lvp := a; ändern
und 3. Überall beim Zugriff auf lvp das ^ entfernen.