9

我想使用通用 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”。我究竟做错了什么?

4

1 回答 1

13

问题是 RTL 定义了两个不同版本的TCollectionNotification. 一进System.Classes一进Generics.Collections

您正在使用TList<T>from Generics.Collections,因此需要TCollectionNotificationfrom Generics.Collections。但是在您的代码TCollectionNotification中是在System.Classes. 那是因为,在你写的那一刻TCollectionNotificationSystem.ClassesGenerics.Collections.

解决方案是:

  1. 更改您的使用顺序,以便Generics.Collections出现在System.Classes. 无论如何,这都是很好的做法。或者,
  2. 完全指定类型:Generics.Collections.TCollectionNotification.
于 2013-11-07T20:35:42.410 回答