2015-03-25 18 views
0

我想使用的TImage我的組件裏面,但我收到上線一個編譯器錯誤" Image.Parent:=Self;" as 'incompatible type 'TWinControl' and 'TGasTurbine'使用的TImage我的組件裏面

所以「TGasTurbine是我的組件名稱

這裏是我的畫圖程序。我該怎麼辦?

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程序中創建內部組件?通常它會在每次重新繪製時被調用很多次,並且一次又一次地創建新組件(順便說一句,沒有釋放) - 不是明智的方法。

+0

我使用的基類是TGraphicControl和關於在繪製過程中創建TImage過程你是對的我只是現在糾正它並將代碼移動到Create Constructor但它已經引發錯誤 – Fayyaz 2015-03-25 06:26:00

+0

看添加 – MBo 2015-03-25 06:54:30

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作爲其內部組件。