标题:[求助]pb处理图片(急呀!)
取消只看楼主
lclqxy
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2005-6-6
 问题点数:0 回复次数:6 
[求助]pb处理图片(急呀!)

我使用的是PB9.0+ORACLE
在表sb_zmsb_jb中有blob字段sbtx用来保存图片
实例变量 blob tx,b_tx
数据窗口控件dw_jb,数据窗口dw_zmsb_jb内有一图片控件p_1,按纽cb_sbtx
在数据窗口控件dw_jb的buttonclicked事件中代码如下:
string ls_path,ls_file
long fh,ll_filelen,li_pos,li_cnt,li_nr,sjtx,ll_sjtx
//选择图片
fh=getfileopenname("select file",+ls_path,ls_file,"jpg",&
+"jpg files(*.jpg),*.jpg,"+"gif files(*.gif),*.gif")
if len(ls_path)=0 then
f_mess("请重新选择图形!")
return
end if
this.object.p_1.Filename=ls_path
IF fh =1 THEN
ll_filelen=filelength(ls_path)
if ll_filelen>32766 then
li_pos=((ll_filelen - 1)/32766) + 1
li_nr=fileopen(ls_path,streammode!,read!,lockread!)
else
li_pos=1
end if
for li_cnt=1 to li_pos
sjtx=FileRead(fh, tx)
b_tx=b_tx + tx
ll_sjtx=ll_sjtx + sjtx
fileseek(li_nr,ll_sjtx,frombeginning!)
next
fileclose(li_nr)

END IF
//完成对外部图片的读入
----以上代码是成功实现的
在界面上另有保存按纽,代码
//保存图片
UPDATEBLOB sb_zmsb_jb SET sbtx= :b_tx

WHERE zczh=:ls_zczh

USING sqlca ;
IF sqlca.SQLNRows > 0 THEN
COMMIT USING sqlca ;
f_mess("图片保存成功!")
END IF
问题就出在保存上了,所有代码运行正常也提示图片保存成功!可是表中就是没有图片的数据?但如果把blob字段改为long raw就可以了,不知道原因出在哪里了,请大家帮个忙。另外该如何从数据库中将图片读到数据窗口中的p_1控件中,
selectblob sbtx into :blb_tmp
from sb_zmsb_jb
where zczh=:ls_zczh
using sqlca;
使用dw_jb.object.p_1.setpicture(blb_tmp)或dw_jb.object.p_1.Filename=blb_tmp都无法实现,为何?该如何处理?

搜索更多相关主题的帖子: blob path gif 控件 
2006-06-21 09:01
lclqxy
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2005-6-6
得分:0 
没人给个回答吗?郁闷。
2006-06-21 13:00
lclqxy
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2005-6-6
得分:0 
oracle和PB9.0以上版本都有BLOB类型,估计你是用PB9以下的版本,PB9以下的版本在建立表时是没有该类型的,只有LONG RAW。但做项目一般是很少用PB来建立表的。(你好象是新手,不过很好可以共同探讨)你的P_1控件不在数据窗口中就很简单了。使用我上面的的代码就完全可以了。当你从数据库中读图片到你的p_1时只把最后一句代码改为p_1.setpicture(blb_tmp)就可以了。我上面的代码第一部分是从外部读图片到数据窗口的p_1中,如果p_1不在数据窗口中就把this.object.p_1.Filename=ls_path改为:p_1.picturename=ls_path。第二部分是把图片存储到数据库中,第三部分是从数据库中读图片到数据窗口中的p_1.
2006-06-22 09:22
lclqxy
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2005-6-6
得分:0 
哦,我想起来了,你说的数据窗口不能选择BLOB字段可能是说在建立数据窗口时从表中选择字段时没有出现BLOB字段吧?如果是这样那很正确,因为数据窗口的读数据的SQL是使用select而BLOB字段是使用selectblob来读,所以在建立数据窗口时肯定是不出现BLOB字段的。BLOB字段是需要单独处理的,我上面不是简单的说了吗。保存数据窗口数据是使用update(),而blob字段是用updateblob(),所以保存也要单独处理。
2006-06-22 09:36
lclqxy
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2005-6-6
得分:0 

我现在研究得知:PB是不支持BLOB类型的,只支持longraw\raw\nvachar2三种类型,所以在建表时字段不能使用blob类型,一般是longraw类型。如果是静态图片使用图片控件是很方便的,ole也可以实现但效果不好,用户操作比较麻烦,且ole调入的图象颜色失真的厉害。
对于照片等小图片我认为还是用图片控件好,现在我只要解决如何把数据库中的图片读到数据窗口中的图片控件中就行了。

如果有朋友知道如何做请告诉我,万分感谢!

2006-06-22 16:54
lclqxy
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2005-6-6
得分:0 

我用oracle数据库和pb9,可以肯定的是不支持BLOB类型,系统也提示了只支持longraw、raw和nvachar2。我使用了longraw保存没问题了,从库中读出时,如果是读到窗口中的图片控件内也没问题,问题是如何读到数据窗口中的图片控件内。有做出来的吗?请告诉我如何做的?
以下是读到窗口内的图片控件,没问题的。
selectblob sbtx into :blb_tmp
from sb_zmsb_jb
where zczh=:ls_zczh
using sqlca;
p_1.setpicture(blb_tmp)

2006-06-23 14:52
lclqxy
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2005-6-6
得分:0 
我只所以想使用blob类型,原因是上报国家局时不需要进行数据转换了,因为他们使用的是db2的blob类型。
2006-06-23 14:55



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-73758-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.626514 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved