2013-03-05 53 views
2

我正在使用VCL TPNGImage類來加載PNG圖像。如果我使用FindClass(S).CreateSString並且它可能包含'TPNGImage')創建TPNGImage對象,當我嘗試使用LoadFromStream加載png圖像時,我會淡化訪問衝突異常。你有什麼想法?通過調用TPNGImage`LoadFromStream`在某些情況下不工作

P := TPNGImage(FindClass('tpngimage').NewInstance); 
+1

你爲什麼使用'FindClass('TPNGImage')'語句。你有這個理由嗎? – TLama 2013-03-05 13:26:08

+1

'使用PNGImage'就是你需要的 – 2013-03-05 13:29:21

+0

當然。它實際上是一個字符串變量,而不是'TPNGImage'。 – Javid 2013-03-05 13:29:49

回答

6

你說你創建類:

請注意,我用下面的代碼創建一個新的實例

P := TPNGImage(FindClass('tpngimage').NewInstance); 

該代碼將分配一個實例,但會不運行構造函數。那是你的問題。如果你沒有正確地構建它,你不能指望一個實例工作。

您需要使用

P := TPNGImage.Create; 

現在,這聽起來好像你要能夠編寫的代碼,可以在多種TGraphic後代的工作。你可以做這件事。

首先聲明你的變量是TGraphic

var 
    Image: TGraphic; 

然後得到一個類的引用。

var 
    Cls: TPersistentClass; 
.... 
Cls := FindClass('TPNGImage'); 

然後實例化對象,如果類的引用是兼容的。

if Cls.InheritsFrom(TGraphic) then 
    Image := TGraphicClass(Cls).Create; 

因爲TGraphic使用將運行TPNGImage構造一個虛擬的構造函數。你可以使用這個相同的代碼來構造JPEG,BMP,GIF等。

+0

正是!當我在等待答案時,我嘗試了這段代碼,它的工作原理如下:'P:= TPNGImage(TGraphicClass(FindClass('TPNGImage'))Create);' – Javid 2013-03-05 13:45:15

+1

如果你知道你想要'TPNGImage',那麼你應該寫' TPNGImage.Create'。但我想你想能夠創建由名稱指定的圖形類的實例。那是對的嗎? – 2013-03-05 13:49:57

+0

當然可以。我知道當我可以使用'TPNGImage.Create'時絕對會更好;但我想要做的是保存並加載任何圖像到一個流。在這種情況下,首先,我在流中編寫類的名稱,然後創建圖形類。 – Javid 2013-03-07 14:58:38

相關問題