我想使用通用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'。我做错了什么?
答案 0 :(得分:13)
问题是RTL定义了两个不同版本的TCollectionNotification
。一个位于System.Classes
,一个位于Generics.Collections
。
您正在使用TList<T>
中的Generics.Collections
,因此需要TCollectionNotification
中的Generics.Collections
。但在您的代码TCollectionNotification
中是System.Classes
中声明的版本。这是因为,在您撰写TCollectionNotification
时,System.Classes
之后使用了Generics.Collections
。
解决方案是:
Generics.Collections
之后显示System.Classes
。无论如何,这都是好习惯。或者,Generics.Collections.TCollectionNotification
。