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

Вниз

Событие вложенного объекта в Object Inspector   Найти похожие ветки 

 
AndreyAs   (2003-05-22 18:28) [0]

Помогите, пожалуйста. Застопорился на вроде бы простой вещи.
Пишу компонент. У него есть свойство-объект.
У этого объекта есть некоторые свойства и события.
Свойства отображаются в Object Inspector как и полагается: появляется плюсик и каждое свойство можно отредактировать. А событие не появляется.
Пытался разобраться по исходникам VCL (например, такое можно наблюдать у компонента TSimpleDataSet, который содержит объект Connection), но все вроде бы так как и у меня. Help me please!
Заранее большое спасибо за советы.


 
vuk ©   (2003-05-22 18:47) [1]

Свойства и события можно будет смотреть только у наследников TComponent. Для этого нужно у этого компонента установить флаг стиля csSubComponent вызовом SetSubComponent. Для лучшего понимания посмотрите, как это реализовано в TLabeledEdit.


 
Dimka Maslov ©   (2003-05-22 19:13) [2]

Простейший способ - в основном компоненте описать события, аналогичные событиям вложенного компонента, и вызывать их при необходимости из вложенного компонента

пример

class
TSubComponent = class;

TUpComponent = class (TComponent)
private
FSubComponent: TSubComponent;
procedure SubComponentEvent(Sender: TObject);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
SubComponent: TSubComponent read FSubComponent;
property OnSubComponentEvent: TNotifyEvent read FOnSubComponentEvent write SetOnSubComponentEvent;
end;

TSubComponent = class (TComponent)
private
procedure Event;
published
property OnEvent: TNotifyEvent read FOnEvent write SetOnEvent;
end;

....

procedure TUpComponent.SubComponentEvent(Sender: TObject);
begin
if Assigned(FOnSubComponentEvent) then
FOnSubComponentEvent(Self);
end;

constructor TUpComponent.Create(AOwner: TComponent);
begin
inherited;
FSubComponent := TSubComponent.Create(Self);
FSubComponent.OnEvent := SubComponentEvent;
end;

destructor TUpComponent.Destroy;
begin
FSubComponent.Free;
inherited;
end;

procedure TSubComponent.Event;
begin
if Assigned(FOnEvent) then
FOnEvent(Self)
end;



А вот при наступлении события в SubComponent просто вызывай его метод Event


 
vuk ©   (2003-05-22 19:21) [3]

to Dimka Maslov:
>Простейший способ
Начиная с D6 этот способ не является простейшим. :o) Использование SubComponent намного удобнее. И для программирования и для пользователя компонента.


 
AndreyAs   (2003-05-22 19:46) [4]

Спасибо Dimka Maslov ©,
но мне все-таки необходимо иметь это событие у sub-компонета, а не у главного.

И огромное спасибо vuk ©!
Я перерыл все исходники, имеющиеся в наличии и закопался по уши, совсем забыв, что то же самое есть у такого простого и хорошего компонета как TLabelededEdit.
Все получилось, спасибо еще раз!


 
vuk ©   (2003-05-22 19:51) [5]

Кстати, абсолютно точно так же, как у TLabeledEdit (с порождением специального потомка для вложенного компонента) делать не обязательно. Достаточно просто в основном компоненте при создании вложенного вызвать у него SetSubComponent.



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

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

Наверх




Память: 0.48 MB
Время: 0.015 c
1-2960
AlickSnegov
2003-05-21 10:18
2003.06.02
Подскажите пожалуйста, как осуществлять поиск подстроки в TFileSt


14-3085
nokk9
2003-05-13 00:52
2003.06.02
Шифрование


1-2994
Пубертанец
2003-05-21 16:28
2003.06.02
Как в OnShow формы уничтожать ее при определенных условиях?


1-2948
kost
2003-05-21 08:12
2003.06.02
res


3-2758
Alex(Lion)
2003-05-13 17:31
2003.06.02
Как на Label1.Capiton повесить количество записей в DBGrid1