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)
并且更容易打字.
除非你遇到旧的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中这绝对是这样做的方法.遍布整个地方的无类型指针和类型转换列表可能成为维护的噩梦.
| 归档时间: |
|
| 查看次数: |
937 次 |
| 最近记录: |