Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: -0.98 c
8-1068235153
Delphi5.01
2003-11-07 22:59
2004.04.04
[Error] DirectDraw.pas(173): Type IDirectDrawSurface needs fina


3-1078348575
yaric
2004-03-04 00:16
2004.04.04
Возможно ли отсортировать данные в TTable


1-1079372833
Chcnger
2004-03-15 20:47
2004.04.04
Ошибка при закрытии


14-1078760321
Knight
2004-03-08 18:38
2004.04.04
Люди, а слабо написать все свои ники?


4-1075281288
DENGER
2004-01-28 12:14
2004.04.04
имя com интерфейса...




   Наверх