PowerBuilder中图片文件的处理

PowerBuilder中图片文件的处理

杨勤 莫国庆

摘 要 文章总结了在PowerBuilder应用程序中处理图片文件的两种方法:PowerBuilder语句加Picture控件以及OLE列加OLE控件。作者从图片的存储、显示与缩放三方面对这两种方法进行了较深入的讨论。
关键词 PowerBuilder  图片文件  Picture控件  OLE

Processing Picture File in PowerBuilder

Yang Qin  Mo Guoqing

  Abstract:Two methods to handle picture files in PB applications are illustrated in this paper. The first is using the PB clauses with picture control, and the second is using OLE column with OLE control. The discussion on both methods is unfolding in three steps: how to store, how to display and how to zoom pictures.
  Key words:PowerBuilder  picture file  picture control  OLE

  图片是数据库应用系统中常用的一种数据。图片处理主要涉及如何存储、显示和缩放图片等问题。比如,在人事管理信息系统中就要考虑如何对人员照片进行存储、显示和缩放。PowerBuilder(或简称PB)7.0以前的版本只能处理BMP格式的图片,PB7.0版本中可以处理JPG格式图片。在PB应用程序中这两种格式的图片数据都作为Blob数据类型进行处理。在PB应用程序的开发实践中,笔者发现了两种处理图片文件的方法:一种方法是使用PB提供的语句(SelectBlob和UpdateBlob)加Picture控件进行存取处理;另一种方法是在数据窗口中创建OLE列加OLE控件的方法。

1 PB语句加Picture控件的方法

  Picture控件主要用于显示图片,将该控件的PictureName属性指定图片文件名(扩展名可以是BMP或JPG),即可显示图片。这里以处理人员照片为例,对如何存储和显示照片作详细的介绍。
  .人员照片的存储
  (1) 使用GetFileOpenName函数得到图片文件名称,放入变量窗口示例变量filename中;
  GetFileOpenName(″打开照片文件″,filename, named, ″bmp″, ″照片图形文件(..bmp),..bmp,照片图形文件(..jpg),..jbp″)
  (2) 利用文件操作函数将文件读进BLOB类型的变量中;
int handle, loops, i
long file-len, bytes-read, new-pos
blob p1, p2
file-len=fileLength(filename)
handle=FileOpen(filename, STREAMMODE!,READ!,LOCKREAD!)
//计算读文件次数,最多只能读32 k的数据
if file-len>32765 then
if Mod(file-len, 32765)=0 then
loops=file-len/32765
else
loops=(file-len/32765)+1
end if
else
loops=1
end if
//读文件
for i=1 to loops
bytes-read=FileRead(handle,p1)
p2=p2+p1
new-pos=new-pos+bytes-read
FileSeek(handle, new-pos, FROMBEGINNING!)
next
FileClose(handle)
  (3) 利用UPDATEBLOB语句将图片存储进数据表Person中,设该表有以下主要字段(列):
P-Number, Char(4), Not Null, 主关键字,人员编号
P-Name, Varchar(30), Not Null, 人员姓名
P-Picture, Blob, Null, 人员照片
……
UPDATEBLOB Person SET P-Picture=:p2
WHERE P-Number=′0001′ USING SQLCA;
  .人员照片的显示
  (1) 用SELECTBLOB语句读取图片数据进BLOB变量中
Blob Pic
SELECTBLOB P-Picture INTO :PIC FROM Person
WHERE P-Number=′0001′ USING SQLCA;
.  (2) 通过Picture控件函数SetPicture显示图片。
P-out.SetPicture(Pic) //P-out为控件

2 OLE列加OLE控件的方法

  .人员照片的存储
  (1) 使用GetFileOpenName函数得到图片文件名称,放入变量filename中;
  GetFileOpenName(″打开照片文件″,filename,named,″bmp″,″照片图形文件(..bmp),..bmp,照片图形文件(..jpg),..jpg″)
  (2) 利用OLE控件将图片文件嵌入到OLE对象中。
value=ole-1.InsertFile(filename) //OLE-1为OLE控件
if value=0 then //文件传送到OLE容器成功
//根据需要设置OLE控件容器的有关属性
ole-1.Activation=activatemanually!
ole-1.Border=false
ole-1.DragAuto=false
ole-1.FocusRectangle=false
ole-1.Resizable=false
ole-1.Bring To Top=false
ole-1.Enabled=false
ole-1.IsDragTarget=false
beep(16)
MessageBox(″提示信息″,″向OLE容器传输数据成功!″)
else
MessageBox(″出错信息″,″向OLE容器传输数据失败!″,stopsign!)
end if
  (3) 将图片存入到数据表Person中
photo=ole-1.ObjectData //图片数据送BLOB变量
UPDATEBLOB Person SET P-Picture=:photo
WHERE P-Number=:′0001′;
  .人员照片的显示
  (1) 创建数据窗口dw-zpxs,数据源选择QuicSelect,显示风格选择Tabular,全选表Person所有的列。
  (2) 选择OLE DataBase Blob对象,则系统自动显示DataBase Blob Object对话框的Definition页,其中:
Clients Class:默认值为Datawindow;
Client name:默认值为Untitled
Table:包含Blob列的表名,为Person
Large Binary/Text Columns: Blob列名,为P-Picture
Key Clause:指定where条件,为P-Number=:P-Number
File Template:为空值
OLE Class:指定应用类,第三方工具,为画笔Pbrush,
Client Name Express:为Blob列的每行赋予唯一的字符串,通常为主关键字
  (3) 定义数据窗口dw-zpxs的Retrieve函数的输入参数,列名P-Number为参数。
  (4) 上述数据窗口创建完后,使用dw-zpxs.retrieve(′0001′)函数即可看到图片。

3 图片的动态缩放

  必要时我们可以对所显示的图片进行放大与缩小处理,用上述两种方法均可实现图片的动态缩放。
  对Picture控件可以通过修改其高度(Height)和宽度(Weight)属性值来实现,根据显示比例将高度和宽度值进行换算,然后重新赋值即可。具体实现是:设图片原来的高度和宽度大小分别为h-old和w-old,并设显示比例为per,则Picture控件的新高度和新宽度属性值应修改为h-old . per和w-old . per。
  采用OLE列方法时利用数据窗口的Modify函数,通过修改数据窗口对象的Zoom属性来实现。初始时数据窗口中显示的图片是正常大小的,故显示比例是100%,假设现显示比例为per%,则下面语句可以实现按per的比例显示图片:
dw-zpxs.modify(″datawindow.zoom=′per′″)
比如,若要按150%比例显示,则语句应为:
dw-zpxs.modify(″datawindow.zoom=′150′″)
  比例值的动态变化可通过SingleLineEdit控件和VscrollBar控件实现,SingleLineEdit控件用于显示比例值(百分比值),VscrollBar控件表示比例值的增减变化。在SingleLineEdit控件的Modified事件中书写修改脚本。采用Picture控件方法则修改Picture控件高度与宽度,而采用OLE列方法则修改数据窗口对象的Zoom属性。

4 结 束 语

  应用系统中采用哪一种方法处理图片文件取决于系统本身,用Picture控件的方法简单方便,而用OLE列的方法则比较灵活,还可借助第三方工具修改图片。但值得注意的是,上述两种方法实现时不能混用,即若用Picture控件方法存储图片,则不能用OLE列方法显示图片;同样地,若用OLE列方法存储图片,则不能用Picture控件方法显示图片。

主要从事电信交换、程序设计方面的教学与科研工作。
主要从事计算机操作系统、数据库应用方面的教学与科研工作。

杨 勤(解放军理工大学通信工程学院讲师 南京 210016)
莫国庆(解放军理工大学计算机与指挥自动化学院讲师 南京 210016)

参考文献
1,Simon Gallagher. Simon Herbert. 康博创作室译. PowerBuilder 6.0程序设计大全. 北京: 机械工业出版社, 1998.
2,张长富,李 匀,严苏娅. PowerBuilder 6.0用户参考手册. 北京: 希望电脑公司, 1998.
3,PowerBuilder实用开发技巧. 北京: 晓通数据研究与发展中心, 1998.

收稿日期:2000-01-19

文章引用自:http://www.wanfangdata.com.cn/qikan/periodical.Articles/dnxx/dnxx2000/0005/000518.htm

你可能感兴趣的:(PowerBuilder中图片文件的处理)