我有以下代码:
TTimer(TimerList.Items[Row]) := TTimer.Create(Self);
当我运行程序时,出现以下错误:
unit1.pas(70,19)错误:无法将参数分配给
为什么会引发此错误,我该如何解决?
您将在左侧包括一个显式类型转换- 可以允许变量使用,但这里Items
是通过getter访问的属性,因此它不是变量,而是函数结果。如果需要,您可以在此处键入的唯一位置是作业的右侧。
我们不知道的类型TimerList
,但是假设它是兼容类型,就像TList<TTimer>
您可以直接分配它一样。
TimerList.Items[Row] := TTimer.Create(Self);
如果列表或数组的元素具有不同的,兼容的但不是隐式类型可移植的类型,则您将对赋值的右侧进行类型转换以匹配期望的左侧类型。
如果是纯文本TObjectList
(来自注释),则列表元素为plain TObject
,因此TTimer
可以将任何对象(包括)分配给上述列表元素。您需要进行类型转换的地方是另一种方式-将TObject
back 分配给TTimer
变量:
var
LMyTimer : TTimer
begin
LMyTimer := TTimer(TimerList.Items[someIndex]);
同样要注意,在与TTimer.Create(self)
您一起创建对象时,要赋予self
计时器对象所有权(可能是形式?)。通过将其放入a,TObjectList
您还可以将该对象的所有权授予列表。两者都将在尝试释放对象时尝试释放对象-最后执行的任何操作都会导致崩溃,所以这是一个错误。
确定哪个对象将承担所有权责任并实施该责任-一个对象不应具有两个所有者!要么有TObjectList
自己的计时器,并因此与创建它TTimer.Create(nil)
,或使用留下的所有权(形式?) TTimer.Create(self)
,并使用一个普通的TList
,而不是一个TObjectList
。
如果您使用的是Delphi的现代版本,则我强烈希望使用类型化的泛型列表TList<TTimer>
或TObjectList<TTimer>
。这样就完全不需要进行类型转换了。