![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Практикуюсь в создании компонента на основе 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  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Вроде бы с предыдущими вопросами более-менее стало понятно - получилось создать и коллекцию и группировку свойств.  
		
	
		
		
		
		
		
		
			Но проблема с изменениями в Design-time у меня осталась. Свойства, которые не входят в группы посредством процедур Setxxx перерисовывают компонент на форме, но если свойство входит в состав группы, то изменения видны лишь при принудительном перестроении(нужно сдвинуть компонент на форме или запустить приложение ). Как вызывать обновление компонента при изменении свойств в FChartName? Последний раз редактировалось Motorolla, 28.06.2019 в 02:40.  | 
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Ну, например, сделать сеттер и из него вызывать обновление/перерисовку. 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Если я правильно понимаю значение слова Сеттер, то в самом скромном виде он выглядит как-то так: 
		
	
		
		
		
		
		
		
			Код: 
	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.  |