Форум: "Компоненты";
Текущий архив: 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