如何使用通用 TList 的 OnNotify

Posted

技术标签:

【中文标题】如何使用通用 TList 的 OnNotify【英文标题】:How to use OnNotify of generic TList 【发布时间】:2013-11-07 20:14:15 【问题描述】:

我想使用通用 TList 的 OnNotify 事件。将过程分配给 OnNotify 会产生错误消息:

E2010 Incompatible types: 'System.Generics.Collections.TCollectionNotification' and 'System.Classes.TCollectionNotification'

我正在声明一个类,其中使用了一个通用的 TList,如下所示:

TEditor_Table = class (TObject)
public
  FEditors: TList<TGradient_Editor>;  // List containing the editors

这不是最好的方法,但我需要这个来进行测试。该列表在构造函数中被实例化:

constructor TEditor_Table.Create (Owner: TFMXObject);
begin
   inherited Create;

   FEditors := TList<TGradient_Editor>.Create;
   FOwner := Owner;
end; // Create //

接下来在主窗体中声明一个函数

procedure do_editor_change (Sender: TObject; const Item: TGradient_Editor; Action: TCollectionNotification);

TColor_Editor 类实例化如下:

FColor_Editor := TEditor_Table.Create (List_Gradients);
FColor_Editor.FEditors.OnNotify := do_editor_change;
                                                   ^
error occurs here----------------------------------+

我根本不理解该消息,我不明白为什么编译器似乎混淆了这两个单元:“System.Generics.Collections.TCollectionNotification”和“System.Classes.TCollectionNotification”。我做错了什么?

【问题讨论】:

【参考方案1】:

问题在于 RTL 定义了两个不同版本的TCollectionNotification。一个在System.Classes,一个在Generics.Collections

您正在使用来自Generics.CollectionsTList&lt;T&gt;,因此需要来自Generics.CollectionsTCollectionNotification。但是在您的代码中TCollectionNotificationSystem.Classes 中声明的版本。那是因为,在你写 TCollectionNotification 的时候,System.Classes 是在 Generics.Collections 之后使用的。

解决方案是:

    更改使用顺序,使Generics.Collections 出现在System.Classes 之后。无论如何,这都是很好的做法。或者, 完全指定类型:Generics.Collections.TCollectionNotification

【讨论】:

您省略了一个错误来源:声明了 System.Classes 而不是在这种情况下发生的 System.Generics.Collections :-) 您帮助我找到了罪魁祸首,谢谢!这种混淆存在一些令人讨厌的错误。我会听从你的建议,总是先声明 System.Classes。 这不是错误的来源。如果您省略Generics.Collections,那么您会遇到不同的失败。那么你的失败是 TList&lt;T&gt; 没有定义。 在这种情况下。主窗体中有 system.classes 声明,但没有 system.generics.collection 导致编译器错误。 tlist 在另一个单元中声明。添加 system.generics.collection 解决了错误。 好吧,我看不到这些细节。顺便说一句,将FEditors 公开似乎是错误的。代码真的是这样吗?

以上是关于如何使用通用 TList 的 OnNotify的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 TMyRecord 中的通用子列表释放通用 TList<TMyRecord>

如何使用mormot将通用TList序列化为JSON

Delphi,如何在 TList 中释放记录

delphi TList中如何对一个double或者single类型的数据从小到大排序?

TList TObjectList的区别和使用

delphi 线程教学第六节:TList与泛型