PowerBuilder编程俱乐部

Author: 柯建勋 Date: 2000年 第48期

  大家好!PowerBuilder(以下简称PB)编程俱乐部又与各位见面了。俱乐部最近申请了一个新域名:http://pb.4y4y.net,没有广告条,大家以后可以访问这里。以前的域名http://kjx.126.com、http://pb70.yeah.net仍然有效。各位可到俱乐部主页的BBS讨论区去提交或解答问题。
  一、怎样在PB中实现文件的拷贝与删除,要借助外部函数吗?
  答:可用API函数实现:
  1.拷贝文件
  函数声明:
  FUNCTION boolean CopyFileA(ref string cfrom, ref string cto, boolean flag) LIBRARY ″Kernel32.dll″
  调用:
  string ls_source, ls_des
  boolean lb_flag, lb_rtn
  lb_flag = false
  ls_source = ″c:\book.xls″ //源文件
  ls_des = ″C:\tmp\111.xls″ //目标文件
  lb_rtn = CopyFileA(ls_source, ls_des, lb_flag)
  MessageBox(″文件拷贝″, string(lb_rtn))
  2.删除文件
  函数声明:
  FUNCTION boolean DeleteFileA(ref string filename) LIBRARY ″Kernel32.dll″
  调用:
  string ls_file
  boolean lb_rtn
  ls_file = ″C:\tmp\111.xls″
  lb_rtn = DeleteFileA(ls_file)
  MessageBox(″文件删除″, string(lb_rtn))
  或者用PB本身的函数FileDelete()来删除文件。
  二、我是用SQL ANYWHERE 5.0建库的,请问实现数据备份和恢复的具体步骤和实现方法是怎样的?
  答:备份可以用SQL ANYWHERE 的dbbackup命令来完成。安装SQL ANYWHERE 5.0后,在sql anywhere5.0\win32\ 目录中可以找到dbbackup.exe。再在MS-DOS方式下用命令dbbackup/?或者在SQL ANYWHERE中的帮助下查看其命令开关。如想将C:\hello目录下的数据库文件hello.db备份到d:\backup目录下,其用法如下:
  dbbackup -c ″uid=dba;pwd=sql; dbf=c:\hello\hello.db″ d:\backup
  在PB脚本中用run函数运行:
  run(″dbbackup -c ~″uid=dba;pwd=sql; dbf=c:\hello\hello.db~″ d:\backup″)。
  恢复时将备份的文件拷回即可。
  详细用法可以查帮助。
  (此题由lysoftware、yiyi提供答案)
  三、如何在PB中实现串口编程?
  答:可以利用微软公司提供的通讯控件mscomm32.ocx来实现,使用方法如下:选择菜单Controls→OLE→Insert Control→Microsoft Communications Control,加入后我们点击其OLE Control Properties,可以设置它的基本属性如通讯端口(C)、设置参数 (S) 等,当然我们也可以在程序中设置。以下是一段脚本例子:
  String ls_data
  ole_1.object.CommPort = 1 //使用COM1端口
  ole_1.object.Settings = ″9600,N,8,1″ //设置或返回串行端的波特率、奇偶校验位、 数据位数、停止位
  ole_1.object.InputLen = 0 //初始化Input
  ole_1.object.PortOpen = True //打开端口
  ole_1.Object.Output = ″h″ //向COM口发送字符
  Do
  Yield() //等待数据
  LOOP Until ole_1.Object.InBufferCount >=1
  ls_Output = ole_1.Object.Input //取数据
  ole_1.object.PortOpen = FALSE //关闭端口
  (此题由3w提供答案)
  四、请问如何在程序中运行控制面板中的“时间/日期”程序?
  答:用以下语句即可:
  run (″rundll32.exe shell32.dll , Control_RunDLL Timedate.cpl″)
  运行其它的程序只需要修改参数Timedate.cpl即可,如启动ODBC数据源管理器可以用以下语句:
  run (″rundll32.exe shell32.dll , Control_RunDLL Odbccp32.cpl″)
  五、最近我在工作中遇到了以下问题:我的报表是动态生成的,现在希望随意修改各个带区的宽度、位置; 希望随意在报表中增加文本(标题),或对标题栏的文本进行修改;希望能够在报表中划线,改变报表的格式等。
  答:PB动态报表其实就是动态数据窗口,我个人认为使用动态数据窗口的难处就在于参数的设定,特别是要做到各项都可随意设定。刚开始做时可以手工设置datawindow对象,再在程序中用dw_1.object.datawindow.syntax语句将其结构导出来分析,以便有个参考。对于数据窗口中各项的更改可以用Modify()函数来实现,举几个例子:
  1.改变detail区的高度:dw_1.Modify(″DataWindow.detail.Height=200″)
  2.对标题栏文本的更改(文本名为dept_name_t):dw_1.modify(″dept_name_t.text = '单位名称'″)
  3.增加计算域:假设一grid型的数据窗口,其中有个字段为部门号dept_id,我们要增加一个统计部门数的计算域count(dept_id for all):
  string ls_modrow
  dw_1.Modify(″DataWindow.summary.Height=64″)
  ls_modrow = 'Create compute(band=summary font.charset=″0″ font.face=″MS Sans Serif″ font.family=″2″ font.height=″-8″ font.pitch=″2″ font.weight=″400″ background.mode=″1″ background.color=″536870912″ color=″0″ x=″9″ y=″4″ height=″52″ width=″297″ format=″[general]″ expression=″count(dept_id for all)″ alignment=″1″ border=″0″ crosstab.repeat=no )~r~n'
  dw_1.modify( ls_modrow )
  4.以下程序段让grid数据窗口中网格线不见,并在detail区增加一条线
  string ls_line
  DW_1.Modify(″DataWindow.Grid.Lines='1' ″)
  dw_1.Modify(″DataWindow.detail.Height=332″)
  ls_line = 'Create line(band=detail background.mode=″2″ background.color=″16777215″ pen.style=″0″ pen.width=″5″ pen.color=″0″ x1=″37″ y1=″320″ x2=″1458″ y2=″316″ )~r~n'
  dw_1.modify( ls_line )
  像这种数据窗口动态增加控件的方法,也可以先在数据窗口画板中手工加上去,导出sytnax后,查看其语法,再反写回去即可。