Главная страница
    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
3-1141206268
RomanH
2006-03-01 12:44
2006.04.23
Структура БД торговой организации


4-1139213874
Chaser
2006-02-06 11:17
2006.04.23
Как определить на весь ли экран DOS оно


15-1143758823
Andy BitOff
2006-03-31 02:47
2006.04.23
Интересная статья о птичьем гриппе.


3-1141392474
ancot
2006-03-03 16:27
2006.04.23
Не отробатывает IsEmpty в TQuery


2-1144314543
fast2
2006-04-06 13:09
2006.04.23
Как в PageControl e вставить новый TabSheet среди существующих?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский