6

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

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

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

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

先感谢您 !

4

2 回答 2

10

问题是,当我使用 queue.Items[0].is_alive() 时,我收到一条错误消息,提示错误:非法限定符。

那是因为编译器不知道queue.items[0]除了通用指针之外还有什么(见下文)。

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

这正是您需要这样做的方式。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]

并且更容易打字。

于 2012-04-15T17:05:12.963 回答
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 中这绝对是这样做的方法。到处都是无类型指针和类型转换的列表可能成为维护的噩梦。

于 2012-04-15T23:55:51.027 回答