第二节 使用dbimage引出jpeg—错误的方式
dbimage—思路一(the dbimage - take one)
当试图使用delphi做新的尝试时,我所做的第一件事是向delphi的自带帮助寻求方法。这是帮助文档将回答:tdbimage(在组件面板的data controls页)表示数据库当前记录的一个blob字段的图形图像。使用tdbimage表示图形字段值。tdbimage允许表单显示数据库的图形数据。tdbimage仅仅比timage组件多了一些数据可视属性。其中两个最重要的属性是:datasource(数据源)和field(字段)。datasource(数据源)属性连接图形组件到数据库。在我们的表单上有一个名为datasource1的datasource(数据源)组件—代表着一个数据集。field(字段)属性指出拥有图像的字段(在表中)。
一切都清楚了,现在在表单上放置一个dbimage组件并默认名为dbimage1。为了真正的把dbimage与表的blob字段相连,我们仅需要做以下的配置(使用object inspector):
dbimage1.datasource = datasource1
dbimage1.field = picture
为了显示存在applications表的picture字段的jpeg图像,这是必需的窍门。
为了验证这样的配置是否可以工作,我们所需做的唯一一件事是设置adotable1组件的active(激活)属性为true即可。在设计时我们就可在object inspector(对象检视器)中完成。一旦你这样做了,就会出现以下的对话框:

什么?为什么显示“位图图像无效”呢?我们有jpeg图片而不是bmp图片—问题就在这里吗?让我们再回头看看帮助。
通过在帮助中的一阵点击之后,得出结论:为了得到数据库里的jpg图片,我们得使用tjpegimage对象。为了显示图片,我们需要image(图像)组件的简单、不可视版本。同时,我们需要用流(stream)从blob对象中载出图片。帮助文档叙述:我们应使用tadoblobstream来访问或改变ado数据集中blob或memo(备注)字段的值。
第三节 用流引出jpeg—错误的方法
引出jpeg—思路二(pulling the jpeg - take two!)
既然我们不能使用dbimage做任何事—从表单中去掉它并放上一个普通的timage组件(additional页)命名为adoimage。不幸的是,image组件没有任何数据可视(data-aware)的属性,因此,需要一个单独的程序来显示它所表示的数据库表中的图片。完成这件事的最简单的方法是:在表单上放置一个button(按钮),把所有的程序代码放在它的onclick事件中,按钮的名称为:“btnshowimage”。
为了使用adoblobstream,帮助文档建议创建一个tadoblobstream实例,用“流”的方法从数据集中读取图形字段,然后释放blob流。在中间的某个地方,我们将需要用loadfromstream方法从tadoblobstream对象中载入jpeg图像。image(图像)组件的picture(图片)、graphic(图形)属性将用于真正的存储和显示图片。
字段对象,它是什么?
这时,我假设只需要一点点关于字段对象的知识对于你掌握本章已绰绰有余了。在delphi数据库的开发中,主要的对象之一是tfield对象。字段组件是表示运行(或设计)时的数据集字段的非可视化对象。tadotable(和其他tdataset子类)提供设计时对fields editor(字段编辑器)的访问方法。fields editor使你能选择数据集中你所想包含的字段。更重要的是,它创建了应用程序数据集中使用的字段组件的稳固的列表。为了调用fields editor,可以双击tadotable组件。默认情况下,字段列表是空的。点击add按钮打开一个对话框,里面列出了applications表的字段列表。缺省情况下,所有字段都被选择,然后选择ok。
delphi会按如下的方式给出字段的默认名称:table(表)名+field(字段)名。这意味着我们的图片字段名为:adotable1picture。
tadoblobstream的create(创建)方法创建一个实例用于读或写一个指定的blob字段对象,在这里是adotable1picture字段。
我们在btnshowimage按钮的onclick事件中写入程序代码。该代码将从当前所选行的picture字段中读取图片。源代码如下所示:
uses jpeg;
...
procedure tform1.btnshowimageclick(sender: tobject);
var bs: tadoblobstream;
pic : tjpegimage;
begin
bs := tadoblobstream.create
(adotable1picture, bmread);
try
pic:=tjpegimage.create;
try
pic.loadfromstream(bs);
adoimage.picture.graphic:=pic;
finally
pic.free;
end;
finally
bs.free
end;