![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Написание компонента с нуля! [D6, Win95/98, Win2k, WinXP]
MacroDenS © (2005-09-07 09:38:00)Доброго времени суток.
Хочу написать визуальный компонент с нуля, то есть не наследуя от уже созданных компонентов.
объявление типа выглядит так:
Type
TMyComponent = class(TGraphicControl)
private
....
protected
...
public
...
published
end;
Самая основная задумка - отрисовка своего интерфейса, который потом можно будет каже настраивать (ширина бордюров, основной цвет, дополнительные цвета, ширина, высота и т.д.)
Вопрос:
Как сделать прорисовку интерфеса собственно в дизайн-тайме (т.е. когда компонент только помещается на форму).
Если есть конкретные предложения или направляющие ссылки - прошу изложить.
Заранее благодарен.
Дельфин (2005-09-10 09:00:00) [1]Смотрите русскую справку по созданию компонентов в Delphi
http://dcomponents.narod.ru
TStas (2005-09-08 00:37:00) [2]>Юрий Зотов
Спасибо, он не только у TGraphicControl ничего не делает. Как раз вот только что перекрыл его не вызывая унаследованный.
Юрий Зотов (2005-09-07 22:06:00) [3]> TStas © (07.09.05 19:21) [10]
> А только у TGraphicControl'а не надо вызывать inherited paint?
Любой унаследованный метод любого класса вызываем, только если это надо и в той точке кода, где это надо. И не вызываем совсем , если этого не надо.
В данном случае - если мы всю отрисовку все равно выполняем полностью сами, то зачем вообще вызывать унаследованный Paint? Тем более, что в классе-предке этом метод ничего не делает, а введен лишь для того, чтобы было что перекрывать и при этом не делать класс абстрактным.
TStas (2005-09-07 19:21:00) [4]>Юрий Зотов
А только у TGraphicControl'а не надо вызывать inherited paint?
Тоже наследовал от него и тоже вызывал просто.
Macrodens (2005-09-07 15:34:00) [5]to © MBo огромное спасибо, очень даже помогло.
to © Юрий Зотов - сделал как раз таки как Вы и описываете, только изначально, поскольку Width и Height уже определены, значения проставлял в Create компонента после Inherited.
Всем спасибо за помощь.
Юрий Зотов (2005-09-07 15:20:00) [6]> 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;
MBo (2005-09-07 14:09:00) [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;
MBo (2005-09-07 14:04:00) [8]constructor Create(AOwner:TComponent); override
в конструкторе (и вообще где-либо) Paint вызывать не надо, это произойдет автоматически.
inherited Paint; - выбросить
FWidth и прочие размерные параметры и методы доступа - не нужно в объявлении класса - все это уже есть.
Macrodens (2005-09-07 13:53:00) [9]Набил такую конструкцию:
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 09:54:00) [10]>[2]
Ну да, на Canvas.
>[3]
нет, override
Macrodens (2005-09-07 09:50:00) [11]Да и еще такой вопрос:
объявляя метод паинтprocedure Paint;нужно ли его обозначать какvirtual?
Macrodens (2005-09-07 09:48:00) [12]Отрисовку производить на канве или нужен другой способ?
MBo (2005-09-07 09:43:00) [13]Перекрыть метод Paint, в нем и выполнять рисование интерфейса