我的问题非常简单。我有一个包含类queue
对象的TList(名为CNotif
),并希望在这些对象上使用方法is_alive
。
问题是,当我使用queue.Items[0].is_alive()
时,收到一条错误消息Error: Illegal qualifier
。
我也对我在这个TList中实例化对象的方式感到困惑(以及编译器“知道”存储的对象是如何形成这种类型的方式......)
我现在所做的是:queue.Add(CNotif.create(timer, title, text, badge))
但我认为不应该这样做。
提前谢谢!
答案 0 :(得分:10)
问题是,当我使用queue.Items [0] .is_alive()时,我收到一条错误消息,指出错误:非法限定符。
那是因为编译器不知道queue.items[0]
是什么而不是通用指针(见下文)。
我现在所做的是:queue.Add(CNotif.create(计时器,标题,文字,徽章))但我认为不应该这样做。
这正是您需要的方式。 CNotif.Create
构造一个新对象,该对象来自TObject
。
它编译得很好,因为你的queue.Add
调用期望一个指针,包含一个对象实例的Delphi / FreePascal变量实际上是一个指针。 (两种语言都隐藏了使用MyObj^
取消引用的需要。)
要在queue.Items
中使用某些内容,您需要告诉编译器除了泛型pointer
之外还有什么(当然没有is_alive
方法)。你通过类型转换来做到这一点:
CNotif(queue.Items[0]).is_alive
注意:使用TList.Items
的方法较短; Items
被声明为TList
的默认属性,因此您可以省略它:
queue[0]
与
相同queue.Items[0]
并且更容易输入。
答案 1 :(得分:6)
除非你遇到旧的Delphi版本,否则你应该研究泛型。
在generics.collection单元中,您可以使用TList<T>
类。
Queue:TList<CNotify>;
...
Begin
Queue := TList<CNotify>.Create; // remember to clean it up
Queue.Add(CNotify.Create(...));
Queue.Add(CNotify.Create(...));
If Queue[0].isAlive then
Beep;
End;
我有一段时间没有使用fpc和lazarus,但在Delphi中这绝对是这样做的方法。无处不在的指针和类型转换列表可能成为维持的噩梦。