PowerBuilder编程俱乐部 柯建勋 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后,查看其语法,再反写回去即可。