|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Доступ к свойствам внедренного компонента
Вопрос собственно говоря в следующем: есть компонент - потомок TPanel, включающий в себя другой компонент, например, тоже TPanel. Как из первого получить доступ к свойствам второго?
У внедренного компонента имеется свойство Caption. После размещения нового компонента на форме в инспекторе объектов (в Design-time) я вижу и могу изменить значение свойства Caption, но при компиляции (в Runtime) это значение сбрасыется на изначальное - почему? Код ниже: Код:
unit PanInPan; interface uses SysUtils, Classes, Controls, ExtCtrls, Graphics, QStdCtrls; type TPanInPan = class(TPanel) private FTitle: TPanel; { Private declarations } protected { Protected declarations } public { Public declarations } constructor Create(AOwner: TComponent); override; destructor Destroy; override; published { Published declarations } property Title: TPanel read FTitle write FTitle; end; procedure Register; implementation procedure Register; begin RegisterComponents('My', [TPanInPan]); end; // Создание компонента constructor TPanInPan.Create(AOwner: TComponent); begin inherited create(AOwner); width:=500; Height:=300; FTitle:=TPanel.Create(Self); with FTitle do begin Width:= 100; Align:= alRight; BevelOuter:= bvNone; TabOrder:= 0; Color:=clRed; Name:='SubTitle'; Caption:=Name; end; FTitle.Parent:=Self; end; // Уничтожение компонента destructor TPanInPan.Destroy; begin FTitle.Free; inherited; end; end. |
#2
|
||||
|
||||
Для начала, бери за основу TCustomPanel. У большинства контролов имеется свойство Caption, зачем вводить своё, родного не достаточно?
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#3
|
||||
|
||||
Цитата:
|
#4
|
||||
|
||||
Непонятно, что даёт вторая панель. Если для вывода дополнительного текста, то не удобнее ли переписать метод Paint?
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#5
|
||||
|
||||
Цитата:
|
#6
|
||||
|
||||
|
#7
|
||||
|
||||
Пробовал добавить stored?
Код:
property Title: TPanel read GetPanel write SetPanel stored true; Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#8
|
||||
|
||||
Цитата:
The stored directive must be followed by True, False, the name of a Boolean field, or the name of a parameterless method that returns a Boolean value. For example, property Name: TComponentName read FName write SetName stored False; If a property has no stored directive, it is treated as if stored True were specified. А вообще пробовал - не помогает. Вопрос по-прежнему открыт |
#9
|
||||
|
||||
Кстати. Хороший пример с исходником уже имеется в D7 - TLabeledEdit. Не знаю, есть ли он выше Может стоит его поковырять?
Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#10
|
||||
|
||||
Цитата:
|
#11
|
||||
|
||||
По-ходу разобрался!
После создания вложенного компонента нужно было указать, что он является "подкомпонентом": FTitle.SetSubComponent(true); Измененный кусок кода - может кому пригодится Код:
// Создание компонента constructor TPanInPan.Create(AOwner: TComponent); begin inherited create(AOwner); width:=500; Height:=300; FTitle:=TPanel.Create(Self); with FTitle do begin Width:= 100; Align:= alRight; BevelOuter:= bvNone; TabOrder:= 0; Color:=clRed; Name:='SubTitle'; Caption:=Name; end; FTitle.Parent:=Self; FTitle.SetSubComponent(true); end; |