Кто-нибудь может дать линк на инфу, описывающую принципы использования одного компонента несколькими другими.
Написал компонент A, который имеет некоторую информацию. Далее подключаю его к нескольким другим визуальным компонентам B1..Bn (они умеют работать c А), но работает с ним только последний по подключению, остальные не получают информацию.
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
08-01-2007 09:28 | Сообщение от автора вопроса
>>А нужно, чтобы все фреймы "знали" что свойства или данные в менеджере изменились...
>Ну посмотрите как это сделано в TCustomActionBarColorMap...
Спасибо. Теперь более понятно.
Полез в исходники TCustomActionBarColorMap покапаюсь.
А нужно, чтобы все фреймы "знали" что свойства или данные в менеджере изменились...
Ну посмотрите как это сделано в TCustomActionBarColorMap: там хранится список всех контролов подключенных к ColorMap и при изменении цветов делается пробежка по этим компонентам и вызов у них какого нибудь UpdateColors. А сами компоненты регистрируют себя в этом списке через Add/Remove.
Если тип компонентов использующих ваш ColorMap неизвестен, то лучше применять объект-посредник, пример так же можно найти в VCL, это будет TChangeLink и TCustomImageList из ImgList.pas
06-01-2007 15:34 | Вопрос к автору: запрос дополнительной информации
В догонку... А как в компоненте TFrameColorMap (если брать по исходнику) узнать что какое либо-из свойств ActionManager изменилось? Если привязывать событие на ActionManager (например OnChange) то его получит только последний TFrameColorMap который привязал его. А нужно, чтобы все фреймы "знали" что свойства или данные в менеджере изменились...
>>> Cepгей Poщин пишет:
Допустим есть некий компонент TFrameColorMap (их экземпляров может быть много)...
Благодаря этому примеру решил проблему разрушения менеджера во время использования его другими компонентами - программа засыпалась ошибками, а в случае дизайн-тайма тоже самое делала IDE.
Спасибо.
Еще такой вопрос. А сам ActionManager должен что-то делать со своей стороны при подключении его к TFrameColorMap?
Допустим есть некий компонент TFrameColorMap (их экземпляров может быть много), со свойством ActionManager. Тогда организовать работу с этим свойством можно примерно так:
procedure TFrameColorMap.UpdateControls;
begin
//Некоторые действия по обновлению компонента
end;
procedure TFrameColorMap.SetActionManager(const Value: TCustomActionManager);
begin
if Value <> fActionManager then
begin
if fActionManager <> nil then
begin
fActionManager.RemoveFreeNotification(Self);
end;
if Value <> nil then
begin
// При разрущении компонента Value, текущему
// компоненту будет послано уведомление
Value.FreeNotification(self);
end;
fActionManager := Value;
UpdateControls;
end;
end;
procedure TFrameColorMap.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited;
if (Operation = opRemove) and (AComponent = fActionManager) then
begin
// Был уничтожен компонент fActionManager, надо обнулить поле fActionManager
fActionManager := nil;
if not (csDestroying in ComponentState) then UpdateControls;
end;
end;
05-01-2007 11:08 | Вопрос к автору: запрос дополнительной информации
Ну очевидно что без исходников тут ничего не сказать, может какие нибудь глобальные переменные используете или как-то не так регистрация компонента в менеджере (если она вообще есть) сделана.
Если быть дословным, то пишу аналог менеджера цветов (TACSColorsMgr) для TActionMainMenuBar. У меня есть компонент (TACSControl), который должен брать с менеджера те самые цвета, т.е. у него есть проперть типа TACSColorsMgr.
Если таких контролов >1 то брать может данные только последний, проперти которого присвоили ACSColorsMgr.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.