使用 BLOB 类型字段

vfp9 中增加了 blob 型字段,这可是个好东西!用它来存储图像数据最合适,与 SQL 的交换也很顺利,接下来就是使用它了。
使用它当然无外乎是显示/打印图像;显示很简单,表单上放一个 Image 控件,然后将 Image.PictureVal 赋值为这个 blob 字段即可;然而如何打印却费了我一番周折,在梅子上看到有人说先用 StrToFile 保存为图像文件,然后再用于报表,当然也行;不过,难道就不能直接使用吗?
当时确实没有找到好办法,一段时间后,终于在 Green1Vfp 找到了解决方案,唯一的问题是,需要使用 vfp9 的报表监听器,而 vfp9 的对象辅助报表对中文的支持仍存在一些问题,所以我一直没有 SET REPORTBEHAVIOR 90;那么在 SET REPORTBEHAVIOR 80 下是否也能直接打印 blob 中的图像呢?

要解决的问题是:
1. 不使用 blob 还原成文件的方法来打印 blob 字段(针对图片)内容
2. 不使用 vfp9 特有的对象辅助报表方式来打印(主要是不想使用报表监听器对象)

经过 20 分钟的探索,终于找到了方法,下面是验证的过程:

1. 先按下图建一个名为 Test 的报表:
 前面三个是字段控件,第 4 个是一个 Picture/Ole Bound 控件,注意按次序添加,至少③要在④之前加入,因为我们需要在打印④之前先由③来改变它绑定的图像数据。如果是修改已存在的报表,则应该先将 4 剪切掉,然后再粘贴回来;当然你也可以用布局工具中的 Bring to Front 将④放到最前端(也就最后显示/打印)。

2. 接下来设置它们的数据源,前两个没什么好说的,按下图设置即可(只有划红线的地方需要修改,其它用缺省值即可,下同)
 第一个绑定到 t1.fname 字段上,第二个绑到 t1.lname 上(这个咱就不放图片了,节约每一字节空间)

3. 接着是第三个字段控件,其实它并不用于打印,只是用它来改变 Pic/Ole Bound 所绑定的图片数据而已,所以需要将它的 Print When 设为 .F.

4. 最后加入最重要的图片控件:

好了,报表设计完毕!保存为 test.frx

5. 现在写验证代码:

  1. m.cPath = HOME()+'Samples/Tastrade/'
  2. SELECT CAST( ALLTRIM( First_Name ) AS  V(10) ) AS fname, ;
  3.   CAST( ALLTRIM( Last_Name ) AS V(10) ) AS lname, ;
  4.   CAST( FILETOSTR( m.cPath + Photo_File ) AS Blob ) AS pic ;
  5.   FROM ( m.cPath + 'data/Employee.dbf' ) ;
  6.   INTO CURSOR t1
  7. USE IN ( SELECT( 'Employee' ))
  8. PUBLIC goPic AS Image
  9. m.goPic = NEWOBJECT( 'Image' )
  10. REPORT FORM ( LOCFILE( 'test', 'frx' ) ) PREVIEW
  11. FUNCTION _GetPic
  12.   m.goPic.pictureval = t1.pic
  13. ENDFUNC

将上面的代码保存为 prg,运行它,我看到如下结果,你呢?

 


这里是上面的示例文件:示例文件(右击选目标另存为)

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值