Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.03.2012, 22:40
Аватар для Cheetos
Cheetos Cheetos вне форума
Прохожий
 
Регистрация: 27.09.2011
Адрес: Тульская область
Сообщения: 18
Версия Delphi: 7
Репутация: 10
Восклицание Доступ к свойствам внедренного компонента

Вопрос собственно говоря в следующем: есть компонент - потомок 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  
Старый 17.03.2012, 23:01
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Для начала, бери за основу TCustomPanel. У большинства контролов имеется свойство Caption, зачем вводить своё, родного не достаточно?
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 18.03.2012, 00:07
Аватар для Cheetos
Cheetos Cheetos вне форума
Прохожий
 
Регистрация: 27.09.2011
Адрес: Тульская область
Сообщения: 18
Версия Delphi: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Для начала, бери за основу TCustomPanel. У большинства контролов имеется свойство Caption, зачем вводить своё, родного не достаточно?
Реально внедренный компонент на основе TCustomControl, а тот, в который внедряется первый, как раз на основе TCustomPanel. Для простоты понимания привел пример на основе TPanel
Ответить с цитированием
  #4  
Старый 18.03.2012, 00:33
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Непонятно, что даёт вторая панель. Если для вывода дополнительного текста, то не удобнее ли переписать метод Paint?
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #5  
Старый 18.03.2012, 00:39
Аватар для Cheetos
Cheetos Cheetos вне форума
Прохожий
 
Регистрация: 27.09.2011
Адрес: Тульская область
Сообщения: 18
Версия Delphi: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Непонятно, что даёт вторая панель. Если для вывода дополнительного текста, то не удобнее ли переписать метод Paint?
Я же поясняю, что это просто пример, на котором легко увидеть ту проблему, которая меня интересует и не больше.
Ответить с цитированием
  #6  
Старый 18.03.2012, 01:02
Аватар для Cheetos
Cheetos Cheetos вне форума
Прохожий
 
Регистрация: 27.09.2011
Адрес: Тульская область
Сообщения: 18
Версия Delphi: 7
Репутация: 10
По умолчанию

Ответить с цитированием
  #7  
Старый 18.03.2012, 08:16
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Пробовал добавить stored?
Код:
property Title: TPanel read GetPanel write SetPanel stored true;
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #8  
Старый 18.03.2012, 10:59
Аватар для Cheetos
Cheetos Cheetos вне форума
Прохожий
 
Регистрация: 27.09.2011
Адрес: Тульская область
Сообщения: 18
Версия Delphi: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от dr. F.I.N.
Пробовал добавить stored?
Код:
property Title: TPanel read GetPanel write SetPanel stored true;
Delphi Help:
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  
Старый 18.03.2012, 13:34
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Кстати. Хороший пример с исходником уже имеется в D7 - TLabeledEdit. Не знаю, есть ли он выше Может стоит его поковырять?
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #10  
Старый 18.03.2012, 13:45
Аватар для Cheetos
Cheetos Cheetos вне форума
Прохожий
 
Регистрация: 27.09.2011
Адрес: Тульская область
Сообщения: 18
Версия Delphi: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от dr. F.I.N.
Кстати. Хороший пример с исходником уже имеется в D7 - TLabeledEdit. Не знаю, есть ли он выше Может стоит его поковырять?
У меня триальная версия дельфи, исходников в комплекте нет - буду признателен, если выложишь что-нить полезное
Ответить с цитированием
  #11  
Старый 18.03.2012, 14:33
Аватар для Cheetos
Cheetos Cheetos вне форума
Прохожий
 
Регистрация: 27.09.2011
Адрес: Тульская область
Сообщения: 18
Версия Delphi: 7
Репутация: 10
По умолчанию

По-ходу разобрался!
После создания вложенного компонента нужно было указать, что он является "подкомпонентом": 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;
Спасибо всем, кто откликнулся!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:41.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter