Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как в Delphi применить технологию


Автор: Delphist 9.2.2010, 18:00
Вообщем встала задача следующего рода:
есть класс - TSomeClass у которого есть событие OnEvent. Стандартные возможности Delphi позволяют сделать так: OnEvent := ProcSome;
где ProcSome некоторый метод другого класса, 
А как сделать так, чтобы OnEvent отлавливали методы нескольких классов. Это легко реализовывается в технологии signal-slot, например, в библиотеке QT.
можно, конечно, финтить как-то так:
Код

type
 TListNotifyEvent: array of  TNotifyEvent;

TSomeClass = class
...
private
  FListenerNotifyEvent: TListNotifyEvent;
  procedure NotifyListinerEvent;
  procedure SomeEvent;

public
  procedure SignalSomeEvent(Proc: TNotifyEvent)
...

procedure TSomeClass.SignalSomeEvent(Proc: TNotifyEvent);
begin
   SetLength(FListNotifyEvent, Length(FListenerNotifyEvent) + 1);
   FListNotifyEvent[High(FListenerNotifyEvent)] := Proc;
end;

procedure TSomeClass.NotifyListenerEvent;
var
  i: integer;
begin
   
  for i := 0 to High(FListenerNotifyEvent) do
    if Assigned(FListenerNotifyEvent[i]) then
      FListenerNotifyEvent[i](Self);
end;

procedure TSomeClass.SomeEvent;
begin
  NotifyListenerEvent; 
  ...
end;

--------------------
var GlobalSomeClass: TSomeClass; 
--------------------

TMyClass = class
...
public
  procedure Init;
  procedure SlotSomeEvent(Sender: TObject);
...
end;

procedure TMyClass.Init;
begin

  GlobalSomeClass.SignalSomeEvent(SlotSomeEvent)
...
end;

procedure TMyClass.SlotSomeEvent(Sender: TObject);
begin
...
end;



У этого способа есть основной недостаток, дело в том, что если будет уничтожен класс 
метод которого помещен в список ListenerEvent, тогда в ListenerEvent окажется мусор, а следить за всем этим вручную не хотелось бы.
Использовать Broadcast (через сообщения) тоже нельзя, так этот способ пригоден только для оконных классов.

Может быть в Delphi можно как-то реализовать технологию подобной signal-slot

Автор: bems 9.2.2010, 21:20
Посмотри модуль, где реализован TApplicationEvents

Автор: Delphist 10.2.2010, 12:42
Цитата(bems @  9.2.2010,  22:20 Найти цитируемый пост)
Посмотри модуль, где реализован TApplicationEvents 

Это совсем не то. Зачем мне наследник TComponent'a???

Автор: bems 10.2.2010, 14:44
Цитата(Delphist @  10.2.2010,  12:42 Найти цитируемый пост)
Это совсем не то

Ну как не то... Все TApplicationEvents знают же когда возникает одно единственное событие в TApplication.
Цитата(Delphist @  10.2.2010,  12:42 Найти цитируемый пост)
Зачем мне наследник TComponent'a??? 

А что в нем плохого?

Автор: Delphist 10.2.2010, 16:14
Цитата(bems @  10.2.2010,  15:44 Найти цитируемый пост)
Ну как не то... Все TApplicationEvents знают же когда возникает одно единственное событие в TApplication.


Да так - знают только наследники TComponent, а как быть с классами наследующися от TObject.

Смотрим это http://forum.sources.ru/index.php?showtopic=294562&view=findpost&p=2501475 и будет счастье.

P.S. Я так понял заядлые поклонники Delphi, использовать новые подходы совсем не хотят

Автор: bems 10.2.2010, 18:18
Ты так и не сказал что плохого в компонентах. Кроме того, насколько я помню уведомлятор TApplicationEvents'ов никак не завяза на компоненты (проверить сейчас не могу).


Цитата(Delphist @  10.2.2010,  16:14 Найти цитируемый пост)
Я так понял заядлые поклонники Delphi, использовать новые подходы совсем не хотят 
Подход не новый. Ну и никто же тебя не заставляет ни использовать Дельфи, ни задавать вопрос в дельфийской ветке форума. Обидься на когнитивно закрытых дельфистов и переходи на другой язык/технологию. А мы и дальше не будем бояться использовать для соответствующих целей соответствующий класс (если компонентность действительно тут как-то завязана, в чем я очень сомневаюсь)

Автор: former 10.2.2010, 19:44
Delphist, ты уже второй раз эту тему поднимаешь.

Автор: Delphist 11.2.2010, 09:01
Цитата(former @  10.2.2010,  20:44 Найти цитируемый пост)
Delphist, ты уже второй раз эту тему поднимаешь. 

Просьба только не обижаться, на мои изречения. Я и сам большой поклонник Delphi ( smile не зря же называюсь Delphist'ом). Да действительно подобную тему я уже поднимал. Дублирование связано с тем, чтобы оценить как изменились взгляды на использование немного других подходов в Delphi. К сожалению как я понял пока с этим туго  smile.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)