powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ошибка при присвоении значения элементу генерик списка
9 сообщений из 9, страница 1 из 1
Ошибка при присвоении значения элементу генерик списка
    #39687925
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите понять, где я туплю :)
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
type
  TVehicleInfoRec = packed record  
    vehicle_id: integer;
    s_end: integer;
    use_cargo_koef: boolean;
  end;
var
  VIR: TVehicleInfoRec;
  VehicleInfoList: TList<TVehicleInfoRec>;

...

  VehicleInfoList := TList<TVehicleInfoRec>.Create;
  try
    VIR := Default(TVehicleInfoRec); 
    VIR.vehicle_id := 1;
    VehicleInfoList.Add(VIR);

// далее еще добавляется кучка записей в список - проблем нет
// однако, при попытке изменить одно из значений i-й записи списка вот так
    VehicleInfoList[i].vehicle_id := 777;

// компилер ругается: [dcc32 Error] E2064 Left side cannot be assigned to

  finally
    VehicleInfoList.Free;
  end;


Почему эта ошибка? Как тогда правильно изменить элемент записи списка?
...
Рейтинг: 0 / 0
Ошибка при присвоении значения элементу генерик списка
    #39687943
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LiYing,

TList это список указателей.
Надо как-то так.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
type
  pTVehicleInfoRec=^TVehicleInfoRec ;
  TVehicleInfoRec = packed record  
    vehicle_id: integer;
    s_end: integer;
    use_cargo_koef: boolean;
  end;
var
  VIR: pTVehicleInfoRec;
  VehicleInfoList: TList<pTVehicleInfoRec>;

……

    New(VIR);
    VIR.vehicle_id := 1;
    VehicleInfoList.Add(VIR);
...
Рейтинг: 0 / 0
Ошибка при присвоении значения элементу генерик списка
    #39687949
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DesWind,

TList<T> это ни разу не список указателей
...
Рейтинг: 0 / 0
Ошибка при присвоении значения элементу генерик списка
    #39687962
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYingПочему эта ошибка? Как тогда правильно изменить элемент записи списка?
Потому что рекорды нельзя так менять. Тут либо TVehicleInfoRec = record поменять на class, либо использовать rec := list[i]; rec.id := 111; list[i] := rec;
...
Рейтинг: 0 / 0
Ошибка при присвоении значения элементу генерик списка
    #39687976
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ага. Почитал https://stackoverflow.com/questions/620506/left-side-cannot-be-assigned-to-for-record-type-properties-in-delphi и всё прояснилось :)
Спасибо, JaDi !
...
Рейтинг: 0 / 0
Ошибка при присвоении значения элементу генерик списка
    #39687978
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
списки тут не при чем - это стандартная вещь с возвратом структур из списка, компонентов и т.д. - вообще из функций.

LiYingПочему эта ошибка?

потому что слишком много людей делали это раньше, когда это не было явно запрещено

а потом удивлялись результату

Код: pascal
1.
// при попытке изменить одно из значений i-й записи списка


Это не так. Ты не пытаешься изменить "значение в списке", ты пытаешься изменить копию значения из списка присвоенную невидимой безымяннйо переменной.

ты из функции получаешь запись в невидимую переменную.
фактически - если смыть "синтаксический сахар" - ты делаешь вот что:
Код: pascal
1.
2.
  invisible_unnamed_automatic_variable := ListGetVehicleInfoRec(VehicleInfoList,i);
  invisible_unnamed_automatic_variable.vehicle_id := 777;



Ну, в общем, не вопрос, ты изменил значение невидимой безымянной переменной.
После чего ты вышел из функции - и эта переменная пропала с твоими изменениями.
В самом списке ты ничего не менял.

Задним числом всё очевидно, но новички регулярно ловятся. Потому что array properties 20 лет назад сделали слишком похожими на массив.

В данном случае правильно делать
Код: pascal
1.
2.
3.
4.
5.
VIR := VehicleInfoList[i];
VIR.vehicle_id := 77;
VIR.xxx := ...
VIR.aaa := ...
VehicleInfoList[i] := VIR;



Либо же, да, хранить указатели.

Либо после наполнения списка - сделать копию списка в дин-массиве - VIRs := VehicleInfoList.ToArray();
...
Рейтинг: 0 / 0
Ошибка при присвоении значения элементу генерик списка
    #39687999
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VehicleInfoList.List[i].vehicle_id := 777;
...
Рейтинг: 0 / 0
Ошибка при присвоении значения элементу генерик списка
    #39688048
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arioch, Dmitry Arefiev
Спасибо, с вашей помощью устранил еще один пробел в своих знаниях.
...
Рейтинг: 0 / 0
Ошибка при присвоении значения элементу генерик списка
    #39688093
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry ArefievVehicleInfoList.>>>List<<<[i].vehicle_id := 777;

Это что такое, прямой доступ к TList<T>.FItems ???

В XE2 такого не было...

Можно, конечно, в Spring4D глянуть, может быть там подломали...
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ошибка при присвоении значения элементу генерик списка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]