Как использовать IMultiCastEvent из spring4d? - PullRequest
1 голос
/ 05 февраля 2012

Я пытаюсь начать использовать часть коллекций Spring4D.Но я не могу подписаться на события, меняющие коллекцию.Получите ошибку: [Ошибка DCC]: E2008 Несовместимые типы в:

var
  TestList: TObjectList<TObject>;
begin
  ... List initialization code ...

  TestList.OnNotify.Add(TestHandler);     <--- Error here
end

Свойство OnNotify TObjectList объявлено как:

property OnNotify: ICollectionNotifyDelegate<T>, где

ICollectionNotifyDelegate<T> = interface(IMulticastEvent<Generics.Collections.TCollectionNotifyEvent<T>>)
end;

т.е. метод OnNotify.Add ожидает Generics.Collections.TCollectionNotifyEvent, который объявлен как:

TCollectionNotifyEvent<T> = procedure(Sender: TObject; const Item: T; 
    Action: TCollectionNotification) of object;

мой обработчик событий объявлен как:

procedure TTestClass.TestHandler(Sender: TObject; const Item: TObject; Action: TCollectionNotification);
begin

end;

Я в замешательстве%)пожалуйста помогите)

1 Ответ

5 голосов
/ 05 февраля 2012

Это было вызвано одними и теми же определениями типов в разных единицах:

Classes.pas:

TCollectionNotification = (cnAdded, cnExtracting, cnDeleting);

Generics.Collections.pas

TCollectionNotification = (cnAdded, cnRemoved, cnExtracted);

На самом деле, Spring.Collections использует псевдоним типа для упрощения использования:

TCollectionNotification = Generics.Collections.TCollectionNotification;

Вы можете добавить Spring.Collections после Classesв вашем списке использования.

PS

Рекомендуется использовать интерфейсную версию IList<T>.

...