Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.138.200.66] |
|
Сообщ.
#1
,
|
|
|
Учусь создавать собственные визуальные компоненты. Задача: создать компонент потомок TGraphicControl, представляющий собой любую статичную картинку на форме, представленный соответствующей картинкой на панели компонентов. Инсталировать в среду я вроде понял как. У меня сама суть не получается. Вот в этом юните описан компонент
unit MyGraphicControl; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TMyGraphicControl = class(TGraphicControl) private FPicture: TPicture; procedure SetPicture(value: TPicture); protected public Constructor Create(AOwner: TComponent); override; published property Picture: TPicture read FPicture write SetPicture; end; procedure Register; implementation Constructor TMyGraphicControl.Create(AOwner: TComponent); begin inherited Create(AOwner); FPicture := TPicture.Create; Height := 105; Width := 105; end; procedure Register; begin RegisterComponents('Samples', [TMyGraphicControl]); end; procedure TMyGraphicControl.SetPicture(Value: TPicture); begin FPicture.Assign(Value); end; end. А вот здесь я с ним работаю: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, MyGraphicControl; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public MyGraphicControl1: TMyGraphicControl; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin MyGraphicControl1:=TMyGraphicControl.Create(self); MyGraphicControl1.Picture.LoadFromFile('BitMap1.bmp'); end; end. Но картинка не отображается... |
Сообщ.
#2
,
|
|
|
если размеры картинки не совпададут, ничего не будет...
|
Сообщ.
#3
,
|
|
|
DroN_S, не понял. Т.е. надо писать
Constructor TMyGraphicControl.Create(AOwner: TComponent); begin inherited Create(AOwner); FPicture := TPicture.Create; Height := <высота картинки>; Width := <ширина картинки>; end; Иначе картинка не появится? |
Сообщ.
#4
,
|
|
|
Ну описали свойство для хранения графики.. А где же вывод?
Нужно ещё переопределить виртуальный метод procedure TGraphicControl.Paint; begin end; который изначально пустой. Выход: дописываем новый метод, и его имплементацию: ... type TMyGraphicControl = class(TGraphicControl) private FPicture: TPicture; procedure SetPicture(value: TPicture); protected procedure Paint; override; public Constructor Create(AOwner: TComponent); override; published property Picture: TPicture read FPicture write SetPicture; end; ... implementation ... procedure TMyGraphicControl.Paint; begin if Assigned(FPicture) then Canvas.StretchDraw(ClientRect, FPicture.Bitmap); end; Теперь всё отрисовывается. |
Сообщ.
#5
,
|
|
|
Цитата SerCh @ MyGraphicControl1:=TMyGraphicControl.Create(self); MyGraphicControl1.Picture.LoadFromFile('BitMap1.bmp'); И еще Parent надо задать. |
Сообщ.
#6
,
|
|
|
Цитата s-mike @ И еще Parent надо задать Точно, просто я в DesignTime создавал, и картинку грузил даблкликом.. В DesignTime тоже отрисовывается. |