标题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后,查看其语法,再反写回去即可。