2016-06-29 31 views
0

我正在開發一個應用程序在德爾福。我試圖提取保存在數據庫中的圖像,將其保存到TMemoryStream,並將相同的圖像加載到其他將動態填充的表單上的TImage控件上。我得到訪問衝突錯誤,當我嘗試加載圖像從流到圖像控件放置在窗體上。訪問衝突錯誤在delphi時保存/加載圖像流/從流

錯誤描述如下在地址00B548C

訪問衝突模塊abc.exe。讀地址0000000

我的代碼片段如下:

UniConnection1.Connected := true; 
UniQuery2.SQL.Text := 'Select image from userplays where id = :id'; 
UniQuery2.Params.ParamByName('id').Value := idpub1; 
UniQuery2.Open; 
if UniQuery2.FieldByName('image').AsString <> '' then 

begin  
    try 
    Stream121 := TMemoryStream.Create; 
    TBlobField(UniQuery2.FieldByName('image')).SaveToStream(Stream121); 
    Stream121.Position := 0; 
     if Assigned(Stream121) then 
     begin 
     Image1.Picture.Graphic.LoadFromStream(Stream121); 
     Image1.Update; 
     end; 

    finally 
     Stream121.Free; 
    end; 
end; 
+1

你檢查過Image1.Picture.Graphic <> nil嗎?你知道數據庫中的圖像類型嗎? –

+0

jpg圖像在數據庫中...實際上我只用數據庫行測試它的圖像。 –

+1

所以做一些調試。你沒有想到的地方有一個「無」指針。你的工作是解決問題。如果你不知道如何調試這段代碼,那麼你真正的問題不是這段代碼,而是你的調試技巧。修復調試技巧,這個問題將會消失,並且將來每一個人都會喜歡它。換句話說,試圖學習技能。 –

回答

4

TPicture不能夠確定流中的圖形類型,所以你纔來告訴它。如果您只有JPEG圖像,則可以對其進行硬編碼。否則,您也應該將圖像格式存儲在數據庫中。

var 
    graphic: TGraphic; 

Stream121.Position := 0; 
if Stream121.size > 0 then begin 
    graphic := TJPEGImage.Create; 
    try 
    graphic.LoadFromStream(Stream121); 
    Image1.Picture.Graphic := graphic; 
    finally 
    graphic.Free; 
    end; 
end; 
+1

真是太神奇了...它現在像魅力一樣工作......爲了你的努力 –

2

您指的是Graphic.LoadfromStream。但Graphic可能不會(可能不會)存在。你可以保存到一個文件並改爲使用Picture.LoadFromFile(因爲這會創建相應的TGraphic後代),或者先將Picture.Graphic創建爲適當的類型(例如TBitmap)。

Picture.Graphic := TBitMap.Create; 

因爲它站在圖像不知道你的數據是什麼圖形格式。你需要以某種方式告訴它。