既然你在ACCESS数据库中的字段插入的是BMP位图的OLE 对象,那么这个字段的内容就不光是BMP图象, 还有OLE服务器的信息.
如果你要用图形控件显示字段中存放的位图,首先需要通过"流"的方式把字段内容读到一个内存流(MemoryStream)中然后把其中头部的Ole服务器信息剥除,只除下BMP位图信息,然后将位图信息Assign到一个图形控件上(不需要是数据感应的图形控件)。
还有一个方法, 就是通过容器来显示位图, 容器直接从字段的流中读取数据, 然后自动启动OLE服务器(此为画板程序), 通过OLE服务器来显示编辑位图。

解决方案 »

  1.   

    lightTop说得对.我试过,在ACCESS数据库中插入的OLE,它被记录成一个包,随着图片大小的不同,这个头大小似乎也不一样.我不知道应该从什么位置读取它.
    利用容器我不知LIGHTTOP试过没有,我使用OLE容器来读这个流,也不是OLE格式的流,它应该是一个PACKAGE.
      

  2.   

    在ACCESS的OLE字段中存放图片,则图片不再是完全的图片格式。在99年上半年的一期《电子与电脑》中有一个有关在ASP中显示ACCESS数据库中OLE图片的解答。请参考一下。
    对不起,具体哪一期,我忘了!
      

  3.   

    好象TGraphicField及TDBImage仅对Paradox有效(也许dBase for Window也行,没玩过),它是针对Paradox的Graphic类型字段。查看VCL的源代码,在TBlobField.LoadFromBitmap及SaveToBitmap中还加了一个头。如果是用的别的数据库存放图片,你应该自己处理图片的存取,显示。我用Sybase的Image类型字段存过。但只能用TImage控件了。大体实现是这样:
    读入时:aStream := TBlobStream.Create(TBlobField(theBMPField), bmRead);
    Image.Picture.Graphic.LoadFromStream( aStream );
    aStream.Free;写时:
    aStream := TBlobStream.Create(TBlobField(theBMPField), bmWrite);
    Image.Picture.Graphic.SaveToStream( aStream );
    aStream.Free;正式用时,可能会需要测试空值等情况、加上try...finally等。如果你仅是存图片的话,这个应该能满足你的要求。
    如果你要用Ole的话,那得另想办法了。
    -------
    阿贵
      跳出三界外
      不在五行中
    -------