Текущий архив: 2004.04.04;
Скачать: CL | DM;
Вниз
Знатокам написания компонентов Найти похожие ветки
← →
ЕвгенийВ (2004-03-10 15:50) [0]Здравствуйте!
У своего компонента сделал свойство коллекцию. У элемента коллекции одна свойство: ссылка на TAction.
При наследовании формы от формы, на которой лежит компонент возникает ошибка: Action указывает на на action на форме-наследника, а на Action на форме предке.
Как исправить?
[code]
TMyToolBarItem = class (TCollectionItem)
...
published
...
property Action: TAction read FAction write SetAction;
end;
TMyToolBarItems = class (TCollection)
...
property Items[Index: Integer]: TMyToolBarItem read GetItem
write SetItem; default;
end;
TMyToolBar = class (TCustomControl)
...
published
property Items: TMyToolBarItems read FItems write SetItems;
end;
unit Card;
TCardForm = class(TMediatorMultyForm)
ActionList1: TActionList;
SaveA: TAction;
MyToolBar1: TMyToolBar;
...
end
unit OSInCard2;
TOSInCardForm2 = class(TCardForm)
...
end;
[/code]
В модуле OSInCard2 написано
inherited MyToolBar1: TMyToolBar
Width = 732
Items = <
item
Action = CardForm.SaveA
end>
А не Action = SaveA.
Как исправить?
--
С уважением, Евгений.
← →
ЕвгенийВ (2004-03-10 16:22) [1]Наверх.
← →
ЕвгенийВ (2004-03-12 09:53) [2]Знатоков нету, что ли?
← →
ЕвгенийВ (2004-03-15 10:54) [3]Юрий Зотов, где Вы?
← →
Юрий Зотов © (2004-03-15 18:37) [4]Где, где... Видел я это вопрос, только непростой он и отвечать на него подробно - замучаешься, очень много тонкостей и целая намаленькая и непростая статья получится. А отвечать неподробно - есть ли смысл...
Ладно, давайте пробовать, а там увидим. Фокус в том, что в коде VCL элементы коллекций и их свойства сохраняются в DFM всегда, независимо от наследования - вот потому они наследования не понимают. Сравните, например, с тем, как сохраняются строки в TStrings - только в том случае, если в наследнике они отличаются от предка. Посмотрите TStrings.DefineProperties и (вот что самое главное!!!) - разберите код DoWrite и Equals до самого последнего винтика, чтобы все было абсолютно понятно.
Вот и Вам нужно сделать что-то подобное для свойства Action. И еще - что поизойдет, если Action, на который ссылается Item будет удален? Как только Item обратится к нему по своей ссылке, получим Access Violation. Чтобы этого не было, в SetAction свяжите Action c Вашим тулбаром через FreeNotification, а в Notification самого тулбара при opRemove очищайте ссылку в соответствующем Item"е (но только при условии - not (csDestroying in ComponentState).
← →
Юрий Зотов © (2004-03-15 18:37) [5]Где, где... Видел я это вопрос, только непростой он и отвечать на него подробно - замучаешься, очень много тонкостей и целая намаленькая и непростая статья получится. А отвечать неподробно - есть ли смысл...
Ладно, давайте пробовать, а там увидим. Фокус в том, что в коде VCL элементы коллекций и их свойства сохраняются в DFM всегда, независимо от наследования - вот потому они наследования не понимают. Сравните, например, с тем, как сохраняются строки в TStrings - только в том случае, если в наследнике они отличаются от предка. Посмотрите TStrings.DefineProperties и (вот что самое главное!!!) - разберите код DoWrite и Equals до самого последнего винтика, чтобы все было абсолютно понятно.
Вот и Вам нужно сделать что-то подобное для свойства Action. И еще - что поизойдет, если Action, на который ссылается Item будет удален? Как только Item обратится к нему по своей ссылке, получим Access Violation. Чтобы этого не было, в SetAction свяжите Action c Вашим тулбаром через FreeNotification, а в Notification самого тулбара при opRemove очищайте ссылку в соответствующем Item"е (но только при условии - not (csDestroying in ComponentState).
← →
Юрий Зотов © (2004-03-15 18:39) [6]Эва, блин, как сервак-то колбасит... Сорри за повтор, только я не виноват, чесслово.
Страницы: 1 вся ветка
Текущий архив: 2004.04.04;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.028 c