HITSY 版 (精华区)
发信人: lyfe (修身养性), 信区: HITSY
标 题: PB实用技巧9则(转载)
发信站: 哈工大紫丁香 (2002年04月06日13:16:48 星期六), 站内信件
【 以下文字转载自 Database 讨论区 】
【 原文由 superbug 所发表 】
发信人: jorling (神秘男孩), 信区: PowerBuilder
发信站: 北国开心天地 (Mon Oct 18 21:14:55 1999), 转信
1.PowerBuilder中如何同串口通讯
在应用中,有时需要通过COM口和外设通讯。用C编写相应的动态连接库(DLL)函数,然后在PowerBuilder中调用固然是一个好办法。可是,如果不熟悉C和Windows API的调用,就显得有些困难了。PowerBuilder支持MS
的OCX控件,这样,我们可以利用VB4附带的MSCOMM32.OCX来实现同COM口的通讯。实现方法如下,先在窗口上加入OLE控件,选择MSCOMM32。编程举例如下:
ole_comm1.Object.CommPort = 1 // ole_comm1是OLE控件的名称,CommPort是端口。
ole_comm1.Object.Settings = "2400,N,8,1" //设置通讯协议
ole_comm1.Object.InputLen = 0 //初始化Input
ole_comm1.Object.PortOpen = True //打开COM口
ole_comm1.Object.Output = "a" //向COM口发送字符
Do
Yield() //一直等待,直到InBuffer有数据
LOOP Until ole_comm1.Object.InBufferCount >= 1
ls_Output = ole_comm1.Object.Input //取数据
--------------------------------------------------------------------------------
2.客户机从服务器取得系统时间
PowerBuilder中有函数today()和函数time()分别返回当前机器的日期和时间。可是如果用户在使用的这台机器上任意的修改系统的日期和时间,那么在在应用系统中用today()和time()函数就得不到正确的当前日期和时间了。在客户服务器结构中,有一台机器是用做数据库服务器的,一般
用户很难在上面修改时间,我们就可以在需要当前日期和时间的地方从服务器上取得时间。方法如下:以Sybase(或MS SQL Server)数据库为例,定义函数uf_getdate()返回datetime变量。
datetime d_today
select getdate() into :d_today from tablename;
return d_today
就可以得到服务器的系统时间了,其中getdate()是Sybase(或MS SQL Server)的系统函数,得到当前时间,返回datetime变量。在其他数据库上也应该有类似的函数。
--------------------------------------------------------------------------------
3.小写金额转换成大写金额
在很多如打印发票的地方需要打印金额的中文大写,PowerBuilder没有提供这样一个数字转换成金额大写的函数。我就自己编了一个,在实际使用中效果良好。程序源代码如下:
int i,lendec,lenint
string numstr,a,b,c,d,bbak
numstr=string(aje,"#0.00")
lenint=len(mid(numstr,1,pos(numstr,'.') - 1))
if right(numstr,2)='00' then
lendec=0
else
lendec=2
end if
string dxint[13],dxdec[2],sz[13]
string dxstr="万仟佰拾亿仟佰拾万仟佰拾元"
string szstr="零壹贰叁肆伍陆柒捌玖"
for i=1 to 13
dxint[i]=mid(dxstr,26 - i*2+1,2)
if i<11 then
sz[i]=mid(szstr,i*2 - 1,2)
else
sz[i]=" "
end if
next
dxdec[1]="角"
dxdec[2]="分"
dxstr=" "
for i = 1 to lenint
a = mid(mid(numstr,1,lenint),i,1)
b = sz[integer(a)+1]
c = dxint[lenint - i +1]
if dxstr<>" " then
d = mid(dxstr,len(dxstr) - 1 ,2)
else
d = " "
end if
if b="零" and (d="零" or b=bbak or c="元" or c="万" or c="亿") then b=""
if a="0" and c<>"元" and c<>"万" and c<>"亿" then c=""
if (c="元" or c="万" or c="亿") and d="零" and a="0" then
dxstr=mid(dxstr,1,len(dxstr) - 2)
d = mid(dxstr,len(dxstr) - 1,2)
if (c="元" and d="万" or c="万"and d="亿") then c=""
end if
dxstr=dxstr + b + c
bbak = b
next
for i=1 to lendec
a = mid (mid(numstr,lenint+2,lendec),i,1)
if a="0" and dxdec[i]="分" then
b=""
else
b=sz[integer(a) + 1]
end if
if a<>"0" then
dxstr=dxstr+b+dxdec[i]
else
dxstr=dxstr+b
end if
next
if lendec=0 then dxstr=dxstr+"整"
return dxstr
--------------------------------------------------------------------------------
4.数据窗口中protect属性的用处
在数据窗口中如果要使其中一列的属性为只读,也就是不允许用户修改,那么只需简单地将这一列的Table Order
设置成0就可。然而,在有些情况下需要对这一列的某些行修改,而某些行不能修改,这就要用到这一列的protect属性了。打开列的属性中的Expressions,在protect中输入条件判别式。例如:允许用户修改新增加的记录,而检索出来的记录则不允许修改。条件判别式可以写成如下:
if(isRowNew(),0,1)
--------------------------------------------------------------------------------
5.进展条的使用
在很多Windows的应用程序中,当执行到一个要花费时间很长的任务时,往往会出现一个进展条,以表示当前任务执行到的位置,用图形形象地表示出来。在PowerBuilder中虽然没有这样的控件,可是在PowerBuilder所带的例子中有一用户对象uo_progress_bar能够完成所需要求。将用户对
象拷贝到用户的应用所在的库,将它放置在用户的界面中需要出现的地方。然后在任务进展的时候,用对象的uf_set_position()函数指示当前任务的进展情况。
--------------------------------------------------------------------------------
6.Yield()函数的做用
Yield()是一个不常用到的PowerBuilder函数。可是,在一个大的循环过程中,如果用户想在执行到一半时通过单击按钮或菜单来退出的话,就一定要用到Yield()函数了,否则程序只会在执行完成整个循环后才会响应按钮或菜单的Click事件。将Yield()函数放在循环体的中间。那么在循环
执行的过程中发现有新的事件消息在消息队列中就回立即去响应。
--------------------------------------------------------------------------------
7.PB5.0新增加的事件的参数
在PowerBuilder的5.0版本中,有很多对象的事件中都增加了参数,灵活地使用这些参数可以大大减少编程序的工作量,现举最常用到的例子说明。例如,在数据窗口的itemchenged事件中,以前如果需要得到改变的行的行号,列名和改变的内容,需要用到getrow()等函数来取得。而现在则
可以通过事件所带的参数row,dwo,data直接取到了,既提高了运行速度,又减少了编程的工作。
--------------------------------------------------------------------------------
8.设置对象的缺省属性
在用户界面的设计中,每添加一个对象如按钮,文本框等,PowerBuilder都会用缺省的字体,大小,颜色等属性来定义对象。如果这不是我们所需要的属性,那么就需要逐个地去修改属性。可以通过将缺省的属性修改为所需要的来简化这一操作。打开应用画笔,在属性中可以将缺省的字体
,大小,颜色等属性改成所需要的缺省属性。
--------------------------------------------------------------------------------
9.PoweBuilder中的2000年问题
随着2000年的越来越临近,大大小小的计算机报刊上充满了关于2000年问题的报道。那么用PowerBuilder编写的程序有没有2000年问题呢,试一试就知道了。做一个输入框,输入"00-1-1",然后将输入的字符串用date()函数转换成日期型,发现转换的结果是2000年1月1日。同时也就证明了P
owerBuilder没有2000年问题。那么,我们是不是就可以高枕无忧了呢,不是。原来,PowerBuilder将2位数的年份00转换成了2000年,49转换成了2049,而50却成了1950年。问题就出来了,到了2050年,如果输入的还是两位数的年份50,那么计算机将解释为1950。原来,PowerBuilder的200
0年问题还是存在的,只是把时间向后推迟了50年而已。事实上,只要有2位数的年份输入,就一定回有2000年问题出现。现在起到2050年只有50多年时间了,要解决PowerBuilder中的2000年问题可要抓紧噢。:)
--
※ 修改:.nrlilo 于 Nov 3 20:43:01 修改本文.[FROM: bbs.hit.edu.cn]
--
※ 转寄:.北国开心天地 bbs.ndc.neu.edu.cn.[FROM: bbs.hit.edu.cn]
--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: nrlilo.bbs@bbs.ndc.n]
--
※ 转载:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: 202.118.226.245]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.552毫秒