2016-06-29 33 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; 

因为它站在图像不知道你的数据是什么图形格式。你需要以某种方式告诉它。