2010 Delphi, Как изменить TList <рекордное> значение?
type TTest = record a,b,c:Integer end;
var List:TList<TTest>;
A:TTest;
P:Pointer;
....
....
List[10] := A; <- OK
List[10].a:=1; <- Here compiler error : Left side cannot be assined to
P:=@List[10]; <- Error: Variable requied
У вас возникла проблема с использованием записей.
Рассмотрим этот код:
function Test: TTest;
begin
...
end;
Test.a := 1;
На самом деле ваш код выглядит для компилятора так:
TTest temp := Test;
temp.a := 1;
Компилятор сообщает вам в сообщении об ошибке, что присвоение бессмысленно, так как он будет присвоить только новое значение до временного рекордного значения, которое будет мгновенно забыто.
Кроме того, @List [10]
недействителен, потому что List [10]
снова возвращает только временное значение записи, поэтому получение адреса этой записи бессмысленно.
Однако чтение и запись всей записи в порядке.
Итак, подведем итог:
List[10] := A; <- writing a whole record is OK
List[10].a:=1; <- List[10] returns a temporary record, pointless assignment
P:=@List[10]; <- List[10] returns a temporary record, its address is pointless
A := List[10];
A.a := 1;
list[10] := A;
Вам не нужно делать это с объектами, потому что они ссылочные типы, ( доступ через указатель, которым компилятор управляет изнутри, чтобы не допустить его попадания в ваши волосы), но записи являются типами значений, поэтому так не работает.
Если вы хотите хранить записи, для их обработки больше подходят динамические массивы:
type TTest = record a,b,c : Integer end;
type TTestList = array of TTest;
var List:TTestList;
A:TTest;
P:Pointer;
....
....
SetLength( List, 20 );
List[10] := A; //<- OK
List[10].a := 1; //<- Ok
P := @List[10]; //<- Not advised (the next SetLength(List,xx) will blow the address away),
// but technically works
Если вам нужно добавить методы для управления этими данными, вы можете сохраните этот массив как поле класса и добавьте свои методы в этот класс.