Вы включаете явное приведение типов в левой части - это может быть разрешено для переменных , но здесь 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>
. Это избавляет от необходимости полностью настраивать тип.