【问题标题】:How to use a method of an object stored in a TList?如何使用存储在 TList 中的对象的方法?
【发布时间】:2012-04-16 07:55:51
【问题描述】:

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

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

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

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

提前谢谢你!

【问题讨论】:

  • 只是一个旁注。使用第一个字符T 命名类型有一个不成文的约定,比如TLamaLama 的类型,所以对于你的情况,它是TCNotif ;-)
  • 不是 C 代表类,T 代表“基本”类型(如数组或记录)吗?
  • 不,它适用于所有 Types,包括类、记录、枚举等。假设您在代码的 type 部分拥有的所有内容。
  • 只是为了澄清,正如 TLama 指出的那样,如果我没记错的话,在你的情况下它实际上是 TNotif - 如果 C 是你的前缀。但无论如何,T 之后的一切都取决于你,所以从技术上讲,命名类型没有正确或错误的方式。没有T 仍然可以工作,但在Delphi 中,类型应该以T 开头。

标签: delphi pascal lazarus


【解决方案1】:

问题是,当我使用 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]

而且更容易打字。

【讨论】:

  • 好点。 :) 我的错;写得太快了,一定是在想TObjectList。我会纠正它。谢谢。 :)
  • 确实,很好的解释,+1
【解决方案2】:

除非您坚持使用旧的 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 中这绝对是这样做的方法。到处都是无类型指针和类型转换的列表可能会成为维护的噩梦。

【讨论】:

  • +1,但最好从 D2010+ 中提及,因为 D2009 中存在一些问题,尤其是 TList
  • 在 fpc ObjFPC 模式下,语法为type TQueue = specialize TFPGList&lt;CNotify&gt; -- 但您也可以使用具有 Delphi 语法的 Delphi 模式(至少从 2.6 开始)。
猜你喜欢
  • 1970-01-01
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多