Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.05;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.029 c
15-1139312761
_RusLAN
2006-02-07 14:46
2006.03.05
Программа для создания резервных копий проэктов


2-1139922266
GoshaT
2006-02-14 16:04
2006.03.05
Скрытие программы в tray


3-1136983239
Asail
2006-01-11 15:40
2006.03.05
Нужна помощь в написании запроса SQL (SELECT)


10-1114175801
Mx
2005-04-22 17:16
2006.03.05
Как получить объект по интерфейсу?


3-1136474358
AlexLines
2006-01-05 18:19
2006.03.05
Как ускорить время поиска?