Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 2006.03.05;
Скачать: [xml.tar.bz2];

Вниз

Написание компонента с нуля!   Найти похожие ветки 

 
MacroDenS ©   (2005-09-07 09:38) [0]

Доброго времени суток.

Хочу написать визуальный компонент с нуля, то есть не наследуя от уже созданных компонентов.

объявление типа выглядит так:

Type
  TMyComponent = class(TGraphicControl)
  private  
     ....
  protected
     ...
  public
     ...
  published
end;


Самая основная задумка - отрисовка своего интерфейса, который потом можно будет каже настраивать (ширина бордюров, основной цвет, дополнительные цвета, ширина, высота и т.д.)

Вопрос:
Как сделать прорисовку интерфеса собственно в дизайн-тайме (т.е. когда компонент только помещается на форму).
Если есть конкретные предложения или направляющие ссылки - прошу изложить.

Заранее благодарен.


 
MBo ©   (2005-09-07 09:43) [1]

Перекрыть метод Paint, в нем и выполнять рисование интерфейса


 
Macrodens ©   (2005-09-07 09:48) [2]

Отрисовку производить на канве или нужен другой способ?


 
Macrodens ©   (2005-09-07 09:50) [3]

Да и еще такой вопрос:
объявляя метод паинт procedure Paint; нужно ли его обозначать как virtual?


 
MBo ©   (2005-09-07 09:54) [4]

>[2]
Ну да, на Canvas.

>[3]
нет, override


 
Macrodens ©   (2005-09-07 13:53) [5]

Набил такую конструкцию:

type
  TMyComponent = class(TGraphicControl)
  private
     FWidth:Integer;
     FHeight:Integer;
     FLeft:Integer;
     FTop:Integer;
     Procedure SetWidth(Const Value:Integer);
     Procedure SetHeight(Const Value:Integer);
     Procedure SetLeft(Value:Integer);
     Procedure SetTop(Value:Integer);
  protected
     procedure Paint;override;
  public
  published
     constructor Create(AOwner:TComponent);
     property Width:Integer read FWidth write SetWidth;
     property Height:Integer read FHeight write SetHeight;
     property Top:Integer read FTop write SetTop;
     property Left:Integer read FLeft write SetLeft;
end;
...

constructor TMyComponent.Create(AOwner:TComponent);
begin
  FWidth:=300;
  FHeight:=150;
  Paint();
end;

procedure TMyComponent.Paint;
begin
  inherited Paint;
  Canvas.Brush.Color:=clWhite;
  Canvas.FillRect(Rect(0,0,FWidth, FHeight));
end;

procedure TMyComponent.SetHeight(const Value: Integer);
begin
  FHeight:=Value;
end;

procedure TMyComponent.SetLeft(Value: Integer);
begin
  FLeft:=Value;
end;

procedure TMyComponent.SetTop(Value: Integer);
begin
  FTop:=Value;
end;

procedure TMyComponent.SetWidth(const Value: Integer);
begin
  FWidth:=Value;
end;



Компилирую модуль, все без ошибок, инсталлирую компонент, бросаю на форму - на форме отобрашается область (100х75 точек) цвета clBtnFace.

Т.е. отрисовка в Paint не произошла. Может нужны еще какие либо методы, перед тем как делать отрисовку интерфейсной части?

Я впервые создаю визуальный компонент, тем более с нуля, и поэтому много чего непонятно, с невизульными (с нуля или насудники) все гораздо проще.

прошу направляющей помощи.


 
MBo ©   (2005-09-07 14:04) [6]

constructor Create(AOwner:TComponent);override

в конструкторе (и вообще где-либо) Paint вызывать не надо, это произойдет автоматически.

inherited Paint; - выбросить

FWidth и прочие размерные параметры и методы доступа -  не нужно в объявлении класса - все это уже есть.


 
MBo ©   (2005-09-07 14:09) [7]

Вот минимальный пример:

type
TMyComponent = class(TGraphicControl)
 protected
    procedure Paint;override;
 public
    constructor Create(AOwner:TComponent); override;
end;

constructor TMyComponent.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 Width:=200;
 Height:=150;
end;

procedure TMyComponent.Paint;
begin
 Canvas.Brush.Color:=clWhite;
 Canvas.FillRect(ClientRect);
end;



 
Юрий Зотов ©   (2005-09-07 15:20) [8]

> MacroDenS ©   (07.09.05 09:38)  

> Хочу написать визуальный компонент с нуля, то есть не
> наследуя от уже созданных компонентов.

> TMyComponent = class(TGraphicControl)

1. Это уже не с нуля, потому что TGraphicControl - тоже компонент. А с нуля и не надо.

2. Все, что нужно сделать - это перекрыть метод Paint и прописать свои дефолтные размеры (если они нужны). Больше ничего не требуется.

3. Маленькое дополнение к [7]:

type
 TMyComponent = class(TGraphicControl)
 protected
   procedure Paint; override;
 public
   constructor Create(AOwner: TComponent); override;
 published
   property Height default 150;
   property Width default 200;

 end;

constructor TMyComponent.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 SetBounds(Left, Top, 200, 150)
end;

procedure TMyComponent.Paint;
begin
 ... // И здесь рисуем на Canvas все, что угодно.
end;


 
Macrodens ©   (2005-09-07 15:34) [9]

to © MBo огромное спасибо, очень даже помогло.
to © Юрий Зотов - сделал как раз таки как Вы и описываете, только изначально, поскольку Width и Height уже определены, значения проставлял в Create компонента после Inherited.
Всем спасибо за помощь.


 
TStas ©   (2005-09-07 19:21) [10]

>Юрий Зотов
А только у TGraphicControl"а не надо вызывать inherited paint?
Тоже наследовал от него и тоже вызывал просто.


 
Юрий Зотов ©   (2005-09-07 22:06) [11]

> TStas ©   (07.09.05 19:21) [10]

> А только у TGraphicControl"а не надо вызывать inherited paint?

Любой унаследованный метод любого класса вызываем, только если это надо и в той точке кода, где это надо. И не вызываем совсем, если этого не надо.

В данном случае - если мы всю отрисовку все равно выполняем полностью сами, то зачем вообще вызывать унаследованный Paint? Тем более, что в классе-предке этом метод ничего не делает, а введен лишь для того, чтобы было что перекрывать и при этом не делать класс абстрактным.


 
TStas ©   (2005-09-08 00:37) [12]

>Юрий Зотов
Спасибо, он не только у TGraphicControl ничего не делает. Как раз вот только что перекрыл его не вызывая унаследованный.


 
Дельфин   (2005-09-10 09:00) [13]

Смотрите русскую справку по созданию компонентов в Delphi

http://dcomponents.narod.ru



Страницы: 1 вся ветка

Форум: "Компоненты";
Текущий архив: 2006.03.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.011 c
1-1138940530
beglec
2006-02-03 07:22
2006.03.05
Как вставить именно анимационную картинку в RichEdit?


3-1135067935
sanich
2005-12-20 11:38
2006.03.05
Не сохранются данные при работе с TIBTable


2-1140092704
Конопелька
2006-02-16 15:25
2006.03.05
Управление ошибками !


2-1138816063
Дмитрий_177
2006-02-01 20:47
2006.03.05
Компоненты на api (или еще как-нибудь)


15-1139581564
LordOfRock
2006-02-10 17:26
2006.03.05
Чтение "плохих" дисков.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский