Форум: "Основная";
Текущий архив: 2003.06.02;
Скачать: [xml.tar.bz2];
ВнизСобытие вложенного объекта в 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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.007 c