Как изменить TList <рекордное> значение?

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
11
задан Astronavigator 30 April 2010 в 20:38
поделиться

3 ответа

У вас возникла проблема с использованием записей.

Рассмотрим этот код:

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
9
ответ дан 3 December 2019 в 05:33
поделиться
A := List[10];
A.a := 1;
list[10] := A;

Вам не нужно делать это с объектами, потому что они ссылочные типы, ( доступ через указатель, которым компилятор управляет изнутри, чтобы не допустить его попадания в ваши волосы), но записи являются типами значений, поэтому так не работает.

10
ответ дан 3 December 2019 в 05:33
поделиться

Если вы хотите хранить записи, для их обработки больше подходят динамические массивы:

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

Если вам нужно добавить методы для управления этими данными, вы можете сохраните этот массив как поле класса и добавьте свои методы в этот класс.

2
ответ дан 3 December 2019 в 05:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: