荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Peter (小飞侠), 信区: Program
标  题: FUNCky的使用
发信站: BBS 荔园晨风站 (Thu Jan 21 23:07:47 1999), 转信


    Funcky是一个PowerBuilder应用程序库,它提供了16位和32位两
种应用库,其中包含了大量的底层函数,开发人员不必自已动手用C语
言编写动态链接库,来处理很多常用的诸如文件操作、字符串操作、
位操作等功能,从而大大提高了开发效率。本文简单讲述如何在Power
u ilder中使用Funcky。

    将Funcky加到应用中
    FunCky提供了16位和32位的运行库Funcky.dll、Funcky16.pbl和
Funcky32.dll、Fuc ky32.pbl,应用程序调用的函数或过程都在该动
态链接库和PBL文件中。安装完FunCky后,两个动态链接库被拷贝到Wi
ndows的System目录下,两个PBL则在安装的目录下。使用时将用到的
函数在应用的Global External Function或Local External Functio
n中作相应的声明即可,如需使用全部函数则可以将整个PBL文件加到
应用的搜索库中。函数原型定义可以从相应函数帮助中获得。
    除帮助文件中提供的函数以外,Funcky.dll中还有其它的一些未
公开的函数在Funckyp bl中被调用,用户也可以使用这些函数。

    Funcky使用注意事项
    ·在应用中,只将用到的函数加到函数原型声明中去,不要声明过
多的函数原型,否则运行时系统可能会报函数原型不匹配错误;
    ·如只需使用少量函数,用户尽量不要将FUNCky.pbl加到应用中,
因为那将需要大量的函数原型声明才能编译通过;
    ·某些函数原型是以"_"开头的定义,这些函数都在Funcky.pbl中
有定义,使用者可以直接使用该函数,将Funcky.pbl中的代码直接拷贝
到自己的pbl中,或自己编写相关的Poweruil der函数。

    Funcky函数分类
    Funcky一共提供了12类的函数:
    ·位操作函数
    ·块和内存操作函数
    ·数据转换函数
    ·DBF文件访问函数
    ·磁盘访问函数
    ·DOS环境函数
    ·日期函数
    ·低级文件操作函数
    ·转换函数
    ·字符串操作函数
    ·系统资源函数
    ·时间操作函数

    举例说明
    下面我们举几个例子,说明一下这些函数的使用。我们着重介绍
的是DBF文件访问、块操作和内存操作、低级文件操作等这几类函数,
这是大家在应用中经常要用到的,而PowerBuid er本身却不提供这些
操作。

    1.图像处理
    我们经常在PowerBuilder应用中遇到有关图像存储和显示的问题
,而在这方面,PowerBi lder本身的处理功能较弱,在实际应用中经常
无法达到用户的要求。我们可以借助Funcky的函数来处理图像文件。
    例如在应用中需要存储、查询、显示和打印照片,一般开发人员
使用OLE嵌入的方法来做,但是如果获得的每一幅照片的规格不完全一
样,显示和打印的效果就很差,采用这种方法制作通行证或身份证上的
照片几乎是不可用的。解决这一问题较简单的方法是,以bitmap格式
在数据库中存放图像数据, 显示/打印时,将数据取出在本地保存成为
临时文件,根据图像的尺寸进行等比例缩放显示在图像控件上,这样既
能达到界面的要求,又能获得高质量的图像。我们可以借助Funcky函
数来解决这样几个问题:
    ·bitmap图像文件存储效率不高,在数据库中占据的空间过大,可
在存入前使用fcompe ss函数对图像文件进行压缩。
    函数声明:
    FUNCTION long fcompress(string s,string d)  LIBRARY  "FU
NCky32.DLL"
    //定义压缩函数原型
    脚本(SCRIPT):
    retcode = fcompress(ls_path, "_tmp.tmp")    //压缩文件
     choose case retcode
     ...// 检查返回值
     End choose
    ...//将压缩后的文件保存到数据库中
    fdcompress的压缩效率不高,但速度很快,还是值得使用的。
    ·bitmap图像的宽和高保存在该文件的第18和第22个字节中,不
用Funcky函数很难读出这两个字节的信息。下面一段程序是解压缩和
计算BMP图像的宽和高。
    函数声明:
    //定义从二进制数据中读取一个长整形函数原型
    FUNCTION long _blob2long(ref blob b, uint o) LIBRARY "FU
NCky32.DLL"
    //定义解压缩函数原型
    FUNCTION long fdcompress(string s,string d) LIBRARY "FUN
Cky32.DLL"
    脚本:
    ... //从数据库中将数据取出保存在文件$fgd.bmp中
    status = fdcompress("$fgd.bmp","_fgd.bmp")  //解压缩
    choose case status
    ...// 检查返回值
    End choose
    ...//将_fgd.bmp读入blob变量pic
    ll_width = _blob2long(pic,18)   //读图像宽度
    ll_height = _blob2long(pic,22)  //读图像高度
    //根据指定的宽和高计算缩放比例
    bili_width = integer(sle_width.text) / ll_width
    bili_height = integer(sle_height.text) / ll_height
    //得到显示宽度和高度
    p_width = ll_width * min(bili_width, bili_height)
    p_height = ll_height * min(bili_width, bili_height)
    由此我们可以看到Funcky函数的使用非常简单,能够轻松做到在P
owerBuilder中很难实现的操作。

    2.直接读取DBF文件
    在应用中可能会遇到直接读取DBF文件的情况,处理这类问题一般
有两种经典的方法:一是使用数据窗口读DBF文件,二是指定一个磁盘
目录作为数据区,用ODBC连接这个目录,使用时规定用户必须将DBF文
件拷贝到这个目录下。但是这两种方法都缺乏灵活性,而在Funcky中
却提供了直接读DBF文件的函数。在Funcky32.pbl中有一个dbffieldg
et()函数可以获取该DB文件的字段名称。不过根据我们"尽量不使用F
uncky32.pbl"的原则,自己手工编写一个实现该功能的代码。
    定义外部函数:
    FUNCTION long dbfOpen(string f, int o) LIBRARY "FUNCky32
..DLL"
    FUNCTION boolean dbfEof(long d) LIBRARY "FUNCky32.DLL"
    FUNCTION int dbfClose(long d) LIBRARY "FUNCky32.DLL"
    FUNCTION long dbfSkip(long d, long c) LIBRARY "FUNCky32.
DLL"
    FUNCTION uint dbfFieldSize(long d, int p) LIBRARY "FUNCk
y32.DLL"
    SUBROUTINE _dbfFieldGet(long d,int p,ref string b) LIBRA
RY "FUNCky32.DLL"
    FUNCTION int dbfFieldPos(long d,string n) LIBRARY "FUNCk
y32.DLL"
    脚本:
    //以读写和拒绝其他用户写的方式打开dbf数据库
    do while 1 = 1
     dbf = dbfopen(ls_file, 2 + 32)
     if dbf <> 0 then
          exit
     end if
    loop
    //读dbf数据
    //ii_xx_count是需要读的dbf字段的总数
    //is_dbf[]字段名称数组
    do while not dbfeof(dbf)
     for i = 1 to ii_xx_count
          p = dbffieldpos(dbf, upper(is_dbf[i])) //获取字段
的位置
          ls_tmp = space(dbffieldsize(dbf, p) + 1)
          //根据字段的大小初始化存放数据的变量
          _dbffieldget(dbf, p, ls_tmp)
          //将数据读入到ls_tmp中
     next
     dbfskip(dbf, 1)
    //使dbf操作指向下一条记录
    loop
    dbfclose(dbf)       //关闭打开的dbf文件
    这样直接读取DBF信息,给应用带来的好处是显而易见的。
    3.数据库用户管理
    对于数据库的用户管理,我们一般会采用在数据库中建立一个表,
记录用户名称、口令等信息,在用户登录时,应用程序检索这个表的信
息,同用户输入的内容核对。按照一般系统管理的规定,每一个用户的
口令,其他人在系统中是无法查到的。即使是系统管理员也只有删除
登录用户的权利,而无法获取用户的口令。但是由于系统管理员可以
读取数据库中的每一张表,他就有机会看到用户的登录口令,所以我们
应当在口令字段存入数据库前对其进行加密。Funcky提供了encrypt(
)函数和decrypt()函数就可以用来完成这一工作,这就避免了程序员
手工编写加密算法的麻烦了。
    此外,Funcky在16位Windows下还有许多底层的操作,包括中断的
调用和直接操作磁盘的函数,可用以软件加密,这里就不详述了。总之
,Funcky提供了较多的函数功能,有条件的读者可以在以后的应用中尝
试使用,相信会给PowerBuilder的开发带来更大的方便

--
※ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 192.168.1.3]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店