如何使用存储在TList中的对象的方法?

时间:2012-04-15 16:51:11

标签: delphi pascal lazarus

我的问题非常简单。我有一个包含类queue对象的TList(名为CNotif),并希望在这些对象上使用方法is_alive

问题是,当我使用queue.Items[0].is_alive()时,收到一条错误消息Error: Illegal qualifier

我也对我在这个TList中实例化对象的方式感到困惑(以及编译器“知道”存储的对象是如何形成这种类型的方式......)

我现在所做的是:queue.Add(CNotif.create(timer, title, text, badge))但我认为不应该这样做。

提前谢谢!

2 个答案:

答案 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中这绝对是这样做的方法。无处不在的指针和类型转换列表可能成为维持的噩梦。