Форум: "Компоненты";
Текущий архив: 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