Почему первая версия не работает?
Рассмотрим этот код
points[index].Test := 'test';
Индексированное свойство преобразуется компилятором в вызов функции и т. Д. компилятор эффективно компилирует это:
points.get(index).Text := 'test';
Теперь points.get(index)
возвращает копию значения TTest
. Так как вы ничего не назначаете, компилятор вводит локальную переменную для хранения возвращаемого значения.
Таким образом, ваш код становится:
var
tmp: TTest;
...
tmp := points.get(index);
tmp.Text := 'test';
Это последнее, что когда-либо делается с tmp
, и поэтому изменения, которые вы вносите в tmp.Text
, просто отбрасываются, оставляя базовый объект нетронутым.
Эта проблема довольно трудна для решения при работе с типами значений .
Коллекция generi c Delphi TList<T>
обеспечивает прямой доступ к базовому массиву, что позволяет напрямую работать с сохраненными значениями.
Другой подход заключается в использовании ссылка, а не значение. Один простой способ добиться этого - использовать T
, который является классом, а не записью, то есть ссылочным типом, а не типом значения.