Главная страница
    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.012 c
4-1139223625
3D
2006-02-06 14:00
2006.04.23
Вывод формы на другой монитор в мультимониторной системе


2-1144289745
raptor3
2006-04-06 06:15
2006.04.23
Глюк с запросом


2-1144259430
md
2006-04-05 21:50
2006.04.23
как...


3-1140981306
Sorter
2006-02-26 22:15
2006.04.23
Сортировка


2-1144563094
DimDim
2006-04-09 10:11
2006.04.23
Как заблокировать отдельные пункты в ComboBox?





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