Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.30;
Скачать: CL | DM;

Вниз

Event для TCollectionItem   Найти похожие ветки 

 
Олег Лаукарт ©   (2003-01-20 15:22) [0]

Создаю компонент, одним из свойств которого есть коллекция. Соответственно описан класс для елемента коллекции (TCItem). У TCItem усть публичное свойство-метод
procedure OnItemEvent:TItemEvent read .. write ..;
Если в Object Inspector, если выбрать редактор елементов коллекции, и для конктретного елемента сделать двойной щелчок на его свойстве, чтобы автоматом сгенерировать и привязать к елементу событие - получаю "Cannot create a method for an unnamed component". Если описать обработчик события то привязать его в инспекторе все-равно не получается - его просто там не видно. Приходится в OnCreate формы програмно привязывать обработчик к елементу - неудобно и жутко некрасиво.
Как добиться желаемого результата?


 
Юрий Зотов ©   (2003-01-20 15:46) [1]

Наследуйте коллекцию от TOwnedCollection, либо перекройте в ней метод GetOwner, а в нем возвращайте ссылку на компонент-владелец.

procedure OnItemEvent:TItemEvent read .. write ..;
Надеюсь, это опечатка. Должно быть property .


 
Олег Лаукарт ©   (2003-01-20 18:38) [2]

Большое спасибо. Попробовал наследовать TOwnedCollection - все работает как надо.
с procedure конечно опечатался :), бывает.


 
Олег Лаукарт ©   (2003-01-20 18:45) [3]

Есть ли возможность использовать Object Inspector в случае, когда свойство компонента имеет тип клас:
type TMyClass = class of TSomeClass;

Задача - компоненту надо привязать класс, чтобы создавать объектыданного класса в рантайме.


 
Юрий Зотов ©   (2003-01-20 19:28) [4]

Можно сделать, как обычное стринговое свойство с выпадающим списком. Редактор свойства нужно будет написать, чтобы не дать возможности ввести неверное имя класса. Это будет наследник TStringProperty с переписанными GetAttributes и GetValues. Проверку строки можно делать в самом методе Set для свойства:
if not (GetClass(Value) is TSomeClass) then raise ...

Конструктор TSomeClass должен быть виртуальным, а все классы его семейства - зарегистрированы в где-то в initialization (см. RegisterClasses). Тогда создание в run-time:
TSomeClass(GetClass(PropValue)).Create(...)


 
Олег Лаукарт ©   (2003-01-20 19:32) [5]

Большое спасибо за помощь.


 
vuk ©   (2003-01-20 19:36) [6]

Вообще обычно используется немного другой подход. Создаются специальные компоненты, которые создают экземпляр определенного класса (что-то подобное фабрикам класса) и делаются ссылки не на класс, а на компонент такого типа. Таким образом убирается зависимость от того, зарегистрированы все нужные классы или нет.



Страницы: 1 вся ветка

Текущий архив: 2003.01.30;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.018 c
1-96783
Oleg_G
2003-01-22 13:03
2003.01.30
Создание СОМ порта с сетевым адресом


3-96553
Samael6
2003-01-11 13:48
2003.01.30
Перенос программы на другой компьютер


6-96933
Эндрю2
2002-10-17 23:55
2003.01.30
Закрыть все открытые диски или папки на доступ


3-96628
Kurt_
2003-01-14 09:40
2003.01.30
Обьясните плиз что значит значение для CursorType (АДО) - OpenFor


1-96787
mixamixa
2003-01-23 00:13
2003.01.30
Как защититься от Ctrl+Alt+Del в Windows 2000?