Форум по 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).
А так же у меня не получается создать в инспекторе объектов группу свойств второго порядка. Применяя стандартный тип, он будет отображаться в виде ветки дерева свойств, если применяю свой, то он будто не инициализирован - в инспекторе объектов появляется, но не может раскрыться. Вот поясняющая часть кода :

Код:
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,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

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

Если я правильно понимаю значение слова Сеттер, то в самом скромном виде он выглядит как-то так:
Код:
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.

В одном из стандартных компонентов Делфи была применена примерно такая конструкция, но мне она мне не помогла:
Код:
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.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter