2015-03-25 5 views
0

Я пытаюсь использовать TImage внутри моего компонента, но я получаю ошибку компилятора на линии " Image.Parent:=Self;" as 'incompatible type 'TWinControl' and 'TGasTurbine'Использование TImage внутри моего компонента

Так «TGasTurbine мой компонент Имя

вот моя процедура Paint , Что мне делать?

Procedure TGasTurbine.Paint; 
var 
    Image: TImage; 
begin 
    Inherited; 
    Image := TImage.Create(self); 
    Image.Parent:=Self; 
    Image.Height := 100; 
    Image.Width := 100; 
    Image.Stretch:=True; 
    Image.Picture.LoadFromFile('H:\Component\Automation\Pump.Bmp'); 
end; 

ответ

3

Каков ваш компонент? Как вы описали свой класс?
Если ваш элемент управления предназначен для родителя для других элементов управления, он должен быть предком TWinControl.

Редактировать: TGraphicControl не может содержать другие компоненты, не может их хранить. Вы должны выбрать или наследовать свой класс из TWindowControl или отказаться от использования внутреннего TImage и позаботиться о сохранении и рисовании изображений (предпочтительнее).
Было бы лучше описать ваш сценарий использования изображения.

И почему вы создаете внутренний компонент в процедуре Paint? Обычно он называется много раз, при каждой перекраске и создании нового компонента (BTW, без освобождения) снова и снова - это не разумный подход.

+0

Базовый класс, который я использую, - это TGraphicControl и о создании TImage в краске. Процедура. Вы правы. Я только что исправлю это и переместим коды в Create Constructor, но он уже вызывает ошибку. – Fayyaz

+0

посмотрите на дополнение – MBo

3

несовместимый тип 'TWinControl' и 'TGasTurbine'

Это говорит о том, что родитель элемента управления должен быть производным от TWinControl. И ваш класс TGasTurbine не получен из TWinControl.

Хотя вы могли бы изменить вывод, это было бы неправильным решением. Вы должны удалить элемент управления TImage. Вы выбрали неправильный способ рисования изображения в настраиваемом элементе управления.

Вместо этого объявьте поле типа TBitmap внутри вашего контроля.

FBitmap: TBitmap; 

Создать и заполнить его в конструкторе:

FBitmap := TBitmap.Create; 
FBitmap.LoadFromFile(...); 

Затем покрасить его в методе Paint:

Canvas.Draw(0, 0, FBitmap); 

Не забудьте освободить растровое изображение в деструкторе.

Возможно, вам лучше привязать изображение как к ресурсу, а не к внешнему файлу.

2

Почему вы даже пытаетесь создать компонент TImage как внутренний компонент вашего собственного компонента?

Вместо этого вы должны создать TBitmap для хранения данных изображения, а затем просто нарисовать, что растровое изображение на компоненте холсте, используя StretchDraw http://docwiki.embarcadero.com/Libraries/XE7/en/Vcl.Graphics.TCanvas.StretchDraw

И в случае, если вам нужна поддержка других типов изображений можно также использовать TPicture в качестве внутреннего компонента вместо TBitmap, чтобы вы получили возможность рисовать все поддерживаемые типы изображений, которые поддерживаются компонентом TImage, который также имеет TPicture в качестве внутреннего компонента.