Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
11-1059547007
_Polymorphic_
2003-07-30 10:36
2004.04.04
Как встроить компоненты редактирования в KOLmdvXLGrid?


1-1079341340
TUser
2004-03-15 12:02
2004.04.04
Оптимизатор


1-1079112475
European
2004-03-12 20:27
2004.04.04
Программное передвижение курсора мыши


1-1079605953
alextov
2004-03-18 13:32
2004.04.04
Перенос проекта из Delphi 6 в Delphi 5


1-1079508819
Dew
2004-03-17 10:33
2004.04.04
Как сделать так, чтобы при нажатии на в определенном месте картин