|
|
Регистрация | << Правила форума >> | 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. |