Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Список(TList) методов. Как вызвать метод?


Kolan ©   (2007-05-20 12:24:00) 

Здравствуйте,
 Есть тип: TAttachCallBack = procedure(Subject: TSettingsManager) of object;

Я же могу хранить список таких методов? — Вроде могу.
FObserverCallBacks: TList;

 Как их помещать в список? — Вроде справился:
procedure TSettingsManager.Attach(AObserverCallBack: TAttachCallBack);
begin
 FObserverCallBacks.Add(@AObserverCallBack);
end;


А как теперь вызывать?
procedure TSettingsManager.NotifyObservers;
var
 I: Integer;
 CurrentCalback: TAttachCallBack;
begin
 for I := 0 to FObserverCallBacks.Count — 1 do
 begin
   CurrentCalback :=  TAttachCallBack(FObserverCallBacks[I]);
   CurrentCalback(Self);
 end;
end;


Получаю:
[Pascal Fatal Error] KAcousticPressureConverterGlobalSettings.pas(63): F2084 Internal Error: C4989

Так как же правильно их вызывать?


Юрий Зотов   (2007-05-20 23:28:00) [1]

> Kolan ©   (20.05.07 22:53) [5]

Наследоваться от TFileStream, а RefCount реализовать самому, по аналогии с TInterfacedObject.


Kolan   (2007-05-20 22:53:00) [2]

> реазовать в TLogManager (или в его потомке) интерфейс IObserver?

А я незнаю как. TInterfacedObjectи TFileStream— родители должны быть… а мн. наследования нет :)
Или вы предлогаете без TInterfacedObject'а  обойтись?


TStas   (2007-05-20 15:17:00) [3]

x: CurrentCalback;
....

@x = TAttachCallBack(FObserverCallBacks[I]);
x(Self)


Юрий Зотов   (2007-05-20 15:02:00) [4]

А почему не сделать нормально - реазовать в TLogManager (или в его потомке) интерфейс IObserver?


Kolan   (2007-05-20 13:28:00) [5]

> См. TMethod
> сюда еще глянь:

Ясно. Получается нужно знать еще и TMyClass…

Опишу задачу, может подругому можно…

Мне нужен Observer, но TConcreteObserverдолжен реализовавыть интерфейс IObserver.
То есть:
TConcreteObserver = class(TInterfacedObject, IObserver)

А что делать если мне надо сделать Обозревателем такой класс:
TLogManager = class(TFileStream)
Или такой
TGraphManager = class
?

Вот я и решил что в Attachпередавать надо не объект а метод, может можно проще?


MBo   (2007-05-20 12:51:00) [6]

>Я же могу хранить список таких методов? — Вроде могу.
Нет, прямо так - не можешь, поскольку метод объекта - 8 байт.
См. TMethod
сюда еще глянь:
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1179297317&n=18


Наверх

Титульная страница Поиск, карта сайта Написать письмо