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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.06.2019, 01:41
Motorolla Motorolla вне форума
Прохожий
 
Регистрация: 06.06.2019
Сообщения: 17
Версия Delphi: Delphi 7 / XE8
Репутация: 10
По умолчанию Несколько вопросов по созданию компонентов

Практикуюсь в создании компонента на основе TGraphicControl.
Подскажите где почитать или посмотреть пример компонента с возможностью добавления вложенных элементов (например как это сделано в TabControl или StatusBar).
А так же у меня не получается создать в инспекторе объектов группу свойств второго порядка. Применяя стандартный тип, он будет отображаться в виде ветки дерева свойств, если применяю свой, то он будто не инициализирован - в инспекторе объектов появляется, но не может раскрыться. Вот поясняющая часть кода :

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
type TPivotPoint = (TopLeft,TopRight,BottomLeft,BottomRight);
 
type
    TEdgeParams = class (TPersistent)
     private
        FShowFrame:boolean;
        FWidth:byte;
        FColor: TColor;
 
 published
     property ShowFrame:boolean read FShowFrame write FShowFrame default false;
     property Color:TColor read FColor write FColor;
     property Width:byte read FWidth write FWidth;
 
end;
 
type
     TChartName = class(TPersistent)
     private
        FChartText:string;
        FFontSize:integer;
        FFontStyle:TFontStyles; //Этот работает
        FEdgeParams:TEdgeParams; // Этот не раскрывается в инспекторе объектов
 
     protected
 
     published
        property ChartText:string read FChartText write FChartText;
        property FontSize:integer read FFontSize write FFontSize;
        property FontStyle:TFontStyles read FFontStyle write FFontStyle;
        property EdgeParams:TEdgeParams read FEdgeParams write FEdgeParams;
    end;
 
 
{========================================================================}
 
type
    TGraphPanel = class(TGraphicControl)
    private
   //...
        FPivotPoint : TPivotPoint; 
        FChartName : TChartName;   
         
    protected
        procedure SetPivot(NewPivot: TPivotPoint);
        procedure DrawEdge;
        procedure DrawChartName;
 
    public
        FWorkFrame:TAxis;
 
    published
     
            constructor Create(AOwner: TComponent); override;
    //...
        property PivotPoint : TPivotPoint read FPivotPoint write SetPivot default BottomLeft;
        property ChartName : TChartName read FChartName write FChartName;// default BottomLeft;
        property OnResize;
    end;
 
procedure Register;
 
implementation
 
uses DateUtils;
 
procedure Register;
begin
    RegisterComponents('Monitor', [TGraphPanel]);
end;
 
 
constructor TGraphPanel.Create(AOwner: TComponent);
begin
    inherited Create(AOwner);
 
        FChartName:=TChartName.Create;
    FEdge:=TEdgeParams.Create;
     
 //...
    with FWorkFrame do
    begin
      x0:=0;
      y0:=0;
      x1:=Width;
      y1:=Height;
    end;
     
    Height := 100;
    Width := 100;
    FChartName.FFontSize:=8;
    FChartName.FFontName:='System';
 
end;

ЗЫ. Пробую сейчас разобраться в содержимом ComCtrl, наверное TCollectionItem и есть ответ на мой вопрос. В любом случае ваши прямые ответы будут мне полезными, указывая на важные моменты.

Последний раз редактировалось Motorolla, 24.06.2019 в 02:41.
Ответить с цитированием
  #2  
Старый 28.06.2019, 02:37
Motorolla Motorolla вне форума
Прохожий
 
Регистрация: 06.06.2019
Сообщения: 17
Версия Delphi: Delphi 7 / XE8
Репутация: 10
По умолчанию

Вроде бы с предыдущими вопросами более-менее стало понятно - получилось создать и коллекцию и группировку свойств.

Но проблема с изменениями в Design-time у меня осталась. Свойства, которые не входят в группы посредством процедур Setxxx перерисовывают компонент на форме, но если свойство входит в состав группы, то изменения видны лишь при принудительном перестроении(нужно сдвинуть компонент на форме или запустить приложение ).
Как вызывать обновление компонента при изменении свойств в FChartName?

Последний раз редактировалось Motorolla, 28.06.2019 в 02:40.
Ответить с цитированием
  #3  
Старый 28.06.2019, 05:19
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,111
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, например, сделать сеттер и из него вызывать обновление/перерисовку.
Ответить с цитированием
  #4  
Старый 28.06.2019, 23:57
Motorolla Motorolla вне форума
Прохожий
 
Регистрация: 06.06.2019
Сообщения: 17
Версия Delphi: Delphi 7 / XE8
Репутация: 10
По умолчанию

Если я правильно понимаю значение слова Сеттер, то в самом скромном виде он выглядит как-то так:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
type
     TChartName = class(TPersistent)
     private
        FChartText:string;
        FFontColor:TColor;
  
     protected
       Procedure SetFontColor(NewValue:TColor);
 
     published
        property ChartText:string read FChartText write FChartText;
        property FontColor:TColor read FFontColor write SetFontColor default clGray;
  
    end;
 
//.......
  
procedure TChartName.SetFontColor(NewValue:TColor);
begin
 if not (FFontColor=NewValue) then
   begin
      Self.FFontColor:= NewValue;
 
      // вызов перерисовки компонента
     
  end;
end;

У меня не получается из процедур вложенного класса воздействовать на методы основного TGraphPanel.

В одном из стандартных компонентов Делфи была применена примерно такая конструкция, но мне она мне не помогла:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
type
        TChartName = class;
 
    TGraphPanel = class(TGraphicControl)
    private
        //...  
        FChartName : TChartName;
 
    protected
        //...
                procedure SetChartName(const Value:TChartName);
        procedure Paint; override;
         
 
    public
 
        FWorkFrame:TRectAxis;
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
 
    published
 
        //...
        property ChartName : TChartName read FChartName write SetChartName;
 
    end;
 
type
     TChartName = class(TPersistent)
     private
        FChartText:string;
        FFontColor:TColor;
  
     protected
    {   Procedure SetFontColor(NewValue:TColor);}
 
     published
        property ChartText:string read FChartText write FChartText;
        property FontColor:TColor read FFontColor write SetFontColor default clGray;
 
//......
 
procedure TGraphPanel.SetChartName(const Value: TChartName);
  begin
    FChartName.FFontColor:=Value.FFontColor;
    Self.Paint;
  end;

Последний раз редактировалось Motorolla, 29.06.2019 в 00:03.
Ответить с цитированием
Ответ


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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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