如何使用通用 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.Collections
的TList<T>
,因此需要来自Generics.Collections
的TCollectionNotification
。但是在您的代码中TCollectionNotification
是System.Classes
中声明的版本。那是因为,在你写 TCollectionNotification
的时候,System.Classes
是在 Generics.Collections
之后使用的。
解决方案是:
-
更改使用顺序,使
Generics.Collections
出现在System.Classes
之后。无论如何,这都是很好的做法。或者,
完全指定类型:Generics.Collections.TCollectionNotification
。
【讨论】:
您省略了一个错误来源:声明了 System.Classes 而不是在这种情况下发生的 System.Generics.Collections :-) 您帮助我找到了罪魁祸首,谢谢!这种混淆存在一些令人讨厌的错误。我会听从你的建议,总是先声明 System.Classes。 这不是错误的来源。如果您省略Generics.Collections
,那么您会遇到不同的失败。那么你的失败是 TList<T>
没有定义。
在这种情况下。主窗体中有 system.classes
声明,但没有 system.generics.collection
导致编译器错误。 tlist
在另一个单元中声明。添加 system.generics.collection 解决了错误。
好吧,我看不到这些细节。顺便说一句,将FEditors
公开似乎是错误的。代码真的是这样吗?以上是关于如何使用通用 TList 的 OnNotify的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 TMyRecord 中的通用子列表释放通用 TList<TMyRecord>