Я согласен с Ником. Но ты все равно можешь делать то, что делаешь.
Если «a» относится к типу «Real»,
a := Real(aList.Items[i]^);
или, если 'a' - указатель на вещественное (^ Real),
a := aList.Items[i];
для строк, сохраните адрес первого элемента (конечно, вам нужно проверить наличие пустых строк),
s := 'Hello World';
aList.Add(@S[1]);
[...]
s1 := string(aList[i]);
или используйте 'PChar' и сохраните адрес, на который он указывает,
s := 'Hello World';
aList.Add(@s^);
[...]
s1 := PChar(aList[i]);