Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 2006.04.23;
Скачать: [xml.tar.bz2];

Вниз

Перехват 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.011 c
2-1144318090
Рафик
2006-04-06 14:08
2006.04.23
ADO


4-1138860238
Сергей Ю.
2006-02-02 09:03
2006.04.23
Отлов подключения флешки и залива туда инфы


1-1141624759
Fuel
2006-03-06 08:59
2006.04.23
Скорость добавления


1-1142429031
DelphiLexx
2006-03-15 16:23
2006.04.23
Запрет ввода символа для Memo


2-1144658548
pavlin_pah
2006-04-10 12:42
2006.04.23
Вставки на ассемблере





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский