Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.23;
Скачать: CL | DM;

Вниз

Перехват Notification для коллекции   Найти похожие ветки 

 
Priest ©   (2005-10-26 16:26) [0]

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

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


 
Джо ©   (2005-10-27 01:33) [1]

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


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

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

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

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


 
Priest ©   (2005-10-27 11:25) [3]

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

>>Юрий Зотов

Вот объявление элемента коллекции
 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 15:41) [4]

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

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


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

Еще вариант.

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

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


 
Priest ©   (2005-10-27 17:29) [6]

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

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2006.04.23;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.034 c
15-1143797930
Kolan
2006-03-31 13:38
2006.04.23
Пример из книги не соответствует действительности.


3-1141299314
Alex2006
2006-03-02 14:35
2006.04.23
Выбор неверно заведённой информации


2-1144526652
Volf_555
2006-04-09 00:04
2006.04.23
Как из DLL выгрузить самого себя?


1-1142103774
Fenix
2006-03-11 22:02
2006.04.23
Подсветка синтаксиса в RichEdit


15-1143721344
Mike Kouzmine
2006-03-30 16:22
2006.04.23
Не успели запустить бразильца в космос, как