Ошибка времени компиляции в операторе присваивания - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть этот код:

TTimer(TimerList.Items[Row]) := TTimer.Create(Self);

Когда я запускаю программу, возникает следующая ошибка:

unit1.pas (70,19) Ошибка: аргумент не может быть назначенным на

Почему выдается эта ошибка и как ее исправить?

1 Ответ

4 голосов
/ 03 февраля 2020

Вы включаете явное приведение типов в левой части - это может быть разрешено для переменных , но здесь Items - это свойство, доступ к которому осуществляется через геттер, и поэтому оно является не переменной, а результат функции. Единственное место, которое вы можете здесь ввести, при необходимости, это правая сторона задания.

Мы не знаем тип TimerList, но, предполагая, что это совместимый тип, такой как TList<TTimer>, вы можете просто назначить его напрямую.

 TimerList.Items[Row] := TTimer.Create(Self);

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


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

var 
  LMyTimer : TTimer
begin
  LMyTimer := TTimer(TimerList.Items[someIndex]);

Также будьте осторожны, что при создании объекта с TTimer.Create(self) вы даете self (вероятно, форма?) Владение объектом таймера. Поместив его в TObjectList, вы также передаете право собственности на объект в список. Оба будут пытаться освободить объект, когда освободятся сами - в зависимости от того, что будет выполнено последним, произойдет cra sh, так что это ошибка.

Решите, какой объект будет нести ответственность за владение, и реализуйте это - объект не должен иметь двух владельцев! Либо у TObjectList есть таймер, и, следовательно, создайте его с помощью TTimer.Create(nil), или , оставьте владение с (формой?) С помощью TTimer.Create(self) и используйте простой TList вместо TObjectList.

Если у вас есть современная версия Delphi, я бы настоятельно предпочел типизированный список generi c, либо TList<TTimer>, либо TObjectList<TTimer>. Это избавляет от необходимости полностью настраивать тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...