我正在使用VCL TPNGImage
類來加載PNG圖像。如果我使用FindClass(S).Create
(S
是String
並且它可能包含'TPNGImage'
)創建TPNGImage
對象,當我嘗試使用LoadFromStream
加載png圖像時,我會淡化訪問衝突異常。你有什麼想法?通過調用TPNGImage`LoadFromStream`在某些情況下不工作
P := TPNGImage(FindClass('tpngimage').NewInstance);
我正在使用VCL TPNGImage
類來加載PNG圖像。如果我使用FindClass(S).Create
(S
是String
並且它可能包含'TPNGImage'
)創建TPNGImage
對象,當我嘗試使用LoadFromStream
加載png圖像時,我會淡化訪問衝突異常。你有什麼想法?通過調用TPNGImage`LoadFromStream`在某些情況下不工作
P := TPNGImage(FindClass('tpngimage').NewInstance);
你說你創建類:
請注意,我用下面的代碼創建一個新的實例
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等。
正是!當我在等待答案時,我嘗試了這段代碼,它的工作原理如下:'P:= TPNGImage(TGraphicClass(FindClass('TPNGImage'))Create);' – Javid 2013-03-05 13:45:15
如果你知道你想要'TPNGImage',那麼你應該寫' TPNGImage.Create'。但我想你想能夠創建由名稱指定的圖形類的實例。那是對的嗎? – 2013-03-05 13:49:57
當然可以。我知道當我可以使用'TPNGImage.Create'時絕對會更好;但我想要做的是保存並加載任何圖像到一個流。在這種情況下,首先,我在流中編寫類的名稱,然後創建圖形類。 – Javid 2013-03-07 14:58:38
你爲什麼使用'FindClass('TPNGImage')'語句。你有這個理由嗎? – TLama 2013-03-05 13:26:08
'使用PNGImage'就是你需要的 – 2013-03-05 13:29:21
當然。它實際上是一個字符串變量,而不是'TPNGImage'。 – Javid 2013-03-05 13:29:49