![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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, зачем вводить своё, родного не достаточно?
|
|
#3
|
||||
|
||||
|
Цитата:
|
|
#4
|
||||
|
||||
|
Непонятно, что даёт вторая панель. Если для вывода дополнительного текста, то не удобнее ли переписать метод Paint?
|
|
#5
|
||||
|
||||
|
Цитата:
|
|
#6
|
||||
|
||||
![]() |
|
#7
|
||||
|
||||
|
Пробовал добавить stored?
Код:
property Title: TPanel read GetPanel write SetPanel stored true; |
|
#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. Не знаю, есть ли он выше
Может стоит его поковырять? |
|
#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; |