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

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

Перехват Notification для коллекции


Priest ©   (2005-10-26 16:26:00) 

У компонента есть метод
procedure Notification(AComponent: TComponent; Operation: TOperation);
А мне нужен такой же метод но для коллекции.

У меня есть коллекция...У элемента есть свойство Form:TForm....Я хочу чтобы при удалении формы, коллекция получала извещение.....Как быть?


Priest   (2005-10-27 17:29:00) [1]

Юрий Зотов ©   (27.10.05 15:41) [4]
А почему нельзя перекрыть Notification у всех включающих компонентов?

Это я сделал обходной способ...Сделал специально внутренний компонент, у которого переопределил Notification....Для предметной области он нигде не нужен

Рабочие формы наследуем от этого класса - и все становится ОК.
Можно и так...Только не очень хотелось взаимных ссылок.....Для меня лучше уж внутренний компонент...

Просто я думал может есть какой то внутренний механизм.....


Юрий Зотов   (2005-10-27 16:13:00) [2]

Еще вариант.

Делаем свой класс формы, который знает о коллекции, имеет ссылку не нее и уведомляет коллекцию из своего деструктора. Ссылка на коллекцию проставляется самой коллекцией из метода SetForm, а деструктор коллекции обнуляет ее. Получаем систему взаимных уведомлении коллекции и формы.

Рабочие формы наследуем от этого класса - и все становится ОК.


Юрий Зотов   (2005-10-27 15:41:00) [3]

А почему нельзя перекрыть Notification у всех включающих компонентов?

Вводим в коллекцию метод Notification (по аналогии с TComponent) - и задачей компонента становится только вызвать его. Остальное разрулит сама коллекция.


Priest   (2005-10-27 11:25:00) [4]

>>Джо
Мне нужно немного не то...

>>Юрий Зотов

Вот объявление элемента коллекции
 TMyFormtem = class(TCollectionItem)
 private
   FForm: TForm;
   procedure SetForm(const Value: TForm);
 public
   constructor Create(aCollection: TCollection); override;
   property Form: TForm read FForm write SetForm;
 end;

Я хочу чтобы при удалении формы, которая прописана в свойство Form вся коллекция получала сообщение...Я сейчас сделал внутренний компонент для колекции и в SetForm подписываюсь на Notification.Вот так

procedure SetForm(const Value: TForm);
begin
 if FForm <> Value then
 begin
   if FForm <> nil then
     FForm.RemoveFreeNotification(Collection.InnerComponent);
   FForm := Value;
   if FForm <> nil then
     FForm.FreeNotification(Collection.InnerComponent);
 end
end;

Вообще у меня коллекция представляет собой Синглтон...И входит public свойством в несколько компонентов...Поэтому я не могу переопределить метод Notification у включающего компонента...

Но с внутренним компонентом как то не очень красиво..


Юрий Зотов   (2005-10-27 02:55:00) [5]

> Priest ©   (26.10.05 16:26)  
> Я хочу чтобы при удалении формы, коллекция получала извещение

Уточните - какой именно формы? Вообще любой? Или той, на которой лежит компонент, свойством которого является коллекция? Или коллекция является свойством самой формы? Или еще что-то?

Решение может зависеть от этих подробностей. А общий механизм такой: поскольку коллекция, как правило, является свойством компонента, то у этого компонента и перекрывается Notification - а оттуда компонент как раз и уведомляет свою коллекцию.


Джо   (2005-10-27 01:33:00) [6]

У класса TCollection тоже есть виртуальный метод
procedure Notify(Item: TCollectionItem; Action: TCollectionNotification); virtual;
Или требуется нечто иное?


Наверх

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