|
Вопрос # 4 056/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты! У меня такая проблема. Пишу графический компонент на базе TGraphicControl. Параметры задаю public в переменных типа record. Published свойства компонента связываю с различными полями переменных record и все работает. Но свойств получается слишком много, и совсем не мешало бы их объединить в группы, чтобы в Инспекторе Объектов эти св-ва выглядели как составные - раскрывающиеся.
На пробу заменил тип record на class(TPersistent). В Инспекторе Объектов все выглядит как надо, но внешний вид компонента не обновляется при изменении значения вложенного св-ва. В чем я допускаю ошибку? Не смог найти внятного материала по созданию свойств типа class. Можно хотя бы в общих чертах схему создания таких свойств? Как это сделать правильно?
TMyColors = class (TPersistent)
private
Color1 :TColor;
Color2 :TColor;
Color3 :TColor;
public
procedure SetColor1(const Value:TColor);
...
published
property Set_Color1:TColor read Color1 write SetColor1;
...
end;
TMyComponent = class (TGraphicControl)
private
C :TMyColors;
...
public
procedure Draw;
procedure SetMyColors(const Value:TMyColors);
published
property Colors:TMyColors read C write SetMyColors;
...
end;
procedure TMyColors.SetColor1(const Value:TColor);
begin
Color1:=Value;
end;
procedure TMyComponent.SetMyColors(const Value:TMyColors);
begin
C.Assign(Value);
Draw;
invalidate;
end;
procedure TMyComponent.Draw;
begin
Bitmap.Canvas.Brush:=Color1;
Bitmap.Canvas.FillRect(Bitmap.Canvas.ClipRect);
//В обработчике OnPaint этот битмап выводится на компонент
end;
 |
Вопрос задал: Zigzag (статус: Посетитель)
Вопрос отправлен: 17 апреля 2010, 22:46
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 4; последнее сообщение — 18 апреля 2010, 20:40; участников в обсуждении: 3.
|
Amidamaru (статус: 4-ый класс), 17 апреля 2010, 23:46 [#1]:
Тебе нужно использовать обратную связь объектов.
1) сделай предварительное описание TMyComponent
TMyComponent = class;{перед описанием TMyColors}
2) для TMyColors сделай свойство FOwner: TMyComponent;
3) когда создаешь TMyColors в конструкторе TMyComponent - его свойство FOwner:=Self;
4) в SetColor1 используешь FOwner.Draw;
5) SetMyColors должен быть в private ну или хотябы в protected
SetColor1 это тоже касается
6) в Draw наверное нужно C.Color1;
|
|
DNK (статус: Студент), 18 апреля 2010, 07:49 [#2]:
Может тогда TMyColors сделать наследником TGraphicsObject. Посмотри как сделаны свойства Pen и Brush у компонета Shape.
"Digital Networked Knight"
|
|
Zigzag (статус: Посетитель), 18 апреля 2010, 19:26 [#3]:
Да, конечно, в Draw не написал C.Color1. Сделал все, как сказал Amidamaru, заработало. Огромная благодарность ему за быструю помощь и точные советы! Все описано исчерпывающе, что поможет и мне, и другим в подобной ситуации.
В помощи Delphi6 имеется инструкция по созданию визуального компонента, где описывается способ задания свойств типов TPen и TBrush. Я делал этот учебный компонент как сказано, и все было понятно, все работало. Но в создании собственного компонента учебный способ не прошел.
Как сделаны Pen и Brush я смотрел раньше. Там, как я понял, другой способ, не очень удобный. Каждый раз его не захочешь вписывать в свой класс. Да, я просто не разобрался как использовать владельца компонента, не сталкивался с этим. Теперь понятно.
Еще раз огромное спасибо экспертам за помощь в решении этой проблемы!
|
|
Amidamaru (статус: 4-ый класс), 18 апреля 2010, 20:40 [#4]:
Тебе повезло что я пьяный был
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|