Powerbuilder 编程经验点滴
 

北 京 天 顺 公 司 软 件 部  陈 俊 明

一.数据窗口快速点击时出现错误的解决

    我在使用Powerbuilder 6.0时发现,在表单中使用一个数据窗口来对数据进行操作时,如果用鼠标对数据窗口进行连续、快速的点击,此时Windows95会弹出一个错误窗口,"Pb60.exe进行了非法操作,程序将被关闭"。后来我又发现,当数据窗口的‘clicked’事件和‘doubleclicked’事件中写入了代码时,这个错误信息并不出现。因些我想,如果在‘clicked’事件和‘doubleclicked’事件中并没有任何操作时,如何才能避免出现此错误窗口呢?首先,我猜想这可能是Powerbuilder的bug,在没有代码时,Powerbuilder并不生成相应的函数,当点击数据窗口时,Powerbuilder认为产生了一个‘clicked’或‘doubleclicked’事件,于是就去调用相应的函数,当没有代码时,此函数指针为一空指针,于是就产生了上述现象;而当这两个事件中有代码时,相应的函数被执行。由此我想,能不能在这两事件中加入一条注释,让Powerbuilder产生一个空的函数呢?事实证明,这个想法是对的。

二.BMP图象文件的读取

在程序中,有时要用到BMP图象文件,比如人事系统中人员的相片、用扫描仪扫描进去的人事档案等等。在Powerbuilder中,没有直接的方法将BMP文件读入内存并显示。但Powerbuilder支持二进制文件的读写操作,可将BMP文件整个读入BLOB类型的变量中,方法如下:

  • 取得文件名

  • 取得文件长度

  • 计算要用fileread函数读文件的次数(一次最多只能读32K数据)

  • 打开文件

  • 使用FOR循环将文件中的数据读入到BLOB变量中

  • 建立一Picture控件

  • 用SetPicture函数显示BMP图象

三.怎样读取FoxPro中Memo字段的数据

    在数据库的应用中,常遇到要将原来Foxpro数据库中的数据读入到大型数据库中的情况,对于没有Memo字段的.DBF文件,只要用Import系列函数,即可取得所要求的功能。但对于含有Memo字段的Foxpro数据库,此方法无效,出现“不能识别的文件类型”的错误信息。现将我的解决办法写下,如果您有什么更好的办法,请与我联系。

    一.Foxpro中的.DBF文件格式如下:

        1.文件头(32字节)

字节 说明 备注
1 文件类型标识 F5为有大文本字段,03为无大文本字段
2 1900年后年数
3 当前月份
4 当前日(2、3、4三个字节表示建库日期)
5-8 记录数 高字节在后
9-10 数据段开始地址 指向数据区的一个偏移地址
11-12 每记录长度 每一条记录所占用的字节数
13-32 未用

        2.字段描述结构(32字节)

字节 说明 备注
1-11 字段名 以0结尾的字符串(Z串)
12 数据类型 为C、N、F、D、L、M
13-16 未用
17 字段长度 占用的字节数
18 小数点后的长度 无小数点的数据类型,本字节不起作用
19-32 未用

        3.各种数据类型的存储方法

            C、N、F用字符串存储,不够字段长时以空格填充;L用F表示False,T表示True;D用8位字符串表示,前四位为年,中两位为月,后两位为日;M用字符串表示的十进制数,表示在.FPT文件中的第几块

    二.Foxpro中.FTP文件格式

        1.文件头(8字节)

字节 说明 备注
1-4 文件总块数
5-8 每块长度 字节数

        2.文件头(8字节)

字节 说明 备注
1-4 块标识 以1开始的序列号
5-8 有效数据长度 字节数

            块总长度(块数)计算=(有效数据长度+每块长度-1)/每块长度

    三.使用PB对FoxproR 数据库进行存取

        1.算法(文件读取)

  • 打开文件,读文件头,判断此文件是否为数据库文件(文件类型为F5或03)
  • 将此文件的字段表读入内存
  • 将此文件的所有记录读入内存
  • 关闭文件

        2.实现(使用用户对象的方法来实现DBF文件到大型数据库的数据转移)

  • 定义实例变量:DBF文件名,FPT文件名,DBF文件头结构,字段结构列表,FPT文件头结构,存放DBF字段内容的BLOB变量,存放FPT文件内容的BLOB变量,标志变量
  • 定义成员函数:

 

  1. init(String dbfFileName)
  2. init(String dbfFileName,String fptFileName)
  3. ReadDBFHead()
  4. ReadDBFFields()
  5. ReadDBFData()
  6. ReadFPTHead()
  7. ReadFPTData()
  8. GetDBFRecord(long RecordNo)
  9. GetFPTRecord(long RecordNo)