Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Zigzag (статус: Посетитель)
Вопрос отправлен: 17 апреля 2010, 22:46
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 4; последнее сообщение — 18 апреля 2010, 20:40; участников в обсуждении: 3.
Amidamaru

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;
Приглашаю Вас на наш IRC-канал: #delphiintru в сети DalNet.
DNK

DNK (статус: Студент), 18 апреля 2010, 07:49 [#2]:

Может тогда TMyColors сделать наследником TGraphicsObject. Посмотри как сделаны свойства Pen и Brush у компонета Shape.
"Digital Networked Knight"
Zigzag

Zigzag (статус: Посетитель), 18 апреля 2010, 19:26 [#3]:

Да, конечно, в Draw не написал C.Color1. Сделал все, как сказал Amidamaru, заработало. Огромная благодарность ему за быструю помощь и точные советы! Все описано исчерпывающе, что поможет и мне, и другим в подобной ситуации.

В помощи Delphi6 имеется инструкция по созданию визуального компонента, где описывается способ задания свойств типов TPen и TBrush. Я делал этот учебный компонент как сказано, и все было понятно, все работало. Но в создании собственного компонента учебный способ не прошел.

Как сделаны Pen и Brush я смотрел раньше. Там, как я понял, другой способ, не очень удобный. Каждый раз его не захочешь вписывать в свой класс. Да, я просто не разобрался как использовать владельца компонента, не сталкивался с этим. Теперь понятно.

Еще раз огромное спасибо экспертам за помощь в решении этой проблемы!
Amidamaru

Amidamaru (статус: 4-ый класс), 18 апреля 2010, 20:40 [#4]:

Тебе повезло что я пьяный был
Приглашаю Вас на наш IRC-канал: #delphiintru в сети DalNet.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:54
Выполнено за 0.03 сек.