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

hal*_*ngs 6 delphi pascal lazarus

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

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

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

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

先感谢您 !

Ken*_*ite 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
Run Code Online (Sandbox Code Playgroud)

注意:有一种较短的使用方式TList.Items; Items被声明为的默认属性TList,因此您可以省略它:

queue[0] 
Run Code Online (Sandbox Code Playgroud)

是相同的

queue.Items[0]
Run Code Online (Sandbox Code Playgroud)

并且更容易打字.

  • `TList`的成员不是'TObject`而是指针. (3认同)

Wou*_*ick 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;
Run Code Online (Sandbox Code Playgroud)

我有一段时间没有使用过fpc和lazarus,但在Delphi中这绝对是这样做的方法.遍布整个地方的无类型指针和类型转换列表可能成为维护的噩梦.

  • 在fpc ObjFPC模式中,语法是`type TQueue = specialize TFPGList <CNotify>` - 但你也可以使用Delphi模式,它具有Delphi语法(至少从2.6开始). (4认同)
  • +1,但是从D2010 +中提一下可能会很好,因为在D2009中存在几个问题,尤其是"TList". (2认同)