2013-03-20 16 views
3

我得到一個錯誤:tagBitmap @ DELPHI ???什麼樣的?

[DCC錯誤] Unit_TProcessClass.pas(334):E2010不兼容的類型: 'TBitmap' 和 'tagBITMAP'

的類被定義爲

TMyClass = Class 
private 
    MyBMP : TBitmap; 
    property aBMP : TBitmap read MyBMP write MyBMP; 

和代碼是這樣

processABitmap(aMyClass.aBMP) ; -> here is the compile error !!! 

回答

11

問題是在VCL中有兩種名爲TBitmap的類型。一個在Windows單元中定義,另一個在Graphics單元中定義。很明顯,您正在將Windows.TBitmap傳遞給期望值爲Graphics.TBitmap的函數,反之亦然。

你幾乎肯定不想與Windows.TBitmap有任何關係。因此,解決方案是確保您的所有單位在使用條款中列出Graphics單位單位Windows單位。這會隱藏Windows.TBitmap

我的心理調試表明單元中TMyClass聲明既沒有列出Graphics都在其uses條款,或Windows之前列出Graphics

最後,你將如何去做出這樣的事情呢?那麼,請嘗試按CTRL +點擊TMyClass中引用的TBitmap。我相信他們會帶你到Windows中聲明的TBitmap。對於你來說,這應該已經足夠了,當你寫下TBitmap時,這不是你的意思。

12

問題在於,您將Windows.TBitmap(又名tagBitmap,描述位於Windows API意義上的位圖記錄)與Graphics.TBitmap(VCL位圖類)混爲一談。

所以,你要麼需要

var 
    b: Windows.TBitmap; 

或(更可能)

var 
    b: Graphics.TBitmap; 

如果省略了單位,那麼最後引用的單元將被使用。舉例來說,如果你的uses條款看起來像

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs; 

然後TBitmap意味着Graphics.TBitmap,這是你通常想要什麼。

所以解決您的問題,或者是你需要添加Graphics一些uses條款,或者你需要確保Graphics之後在列表Windows上市

+0

事實上,我總是確保'Windows'是我使用子句中的第一個單元 - 總是。這自然是我每一個新單位所做的第一件事。 – 2013-03-21 13:37:48