上一篇 | 下一篇

高 级 经 验 点 滴

发布: 2008-6-26 20:40 | 作者: admin | 来源: | 查看: 0次

Yield()函数的做用

Yield()是一个不常用到的PowerBuilder函数。可是,在一个大的循环过程中,如果用户想在执行到一半时通过单击按钮或菜单来退出的话,就一定要用到Yield()函数了,否则程序只会在执行完成整个循环后才会响应按钮或菜单的Click事件。将Yield()函数放在循环体的中间。那么在循环执行的过程中发现有新的事件消息在消息队列中就回立即去响应。

PowerBuilder中如何同串口通讯

在应用中,有时需要通过COM口和外设通讯。用C编写相应的动态连接库(DLL)函数,然后在Power Builder中调用固然是一个好办法。可是,如果不熟悉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 //取数据

扩展PowerBuilder的功能

尽管PowerBuilder提供的大量函数可以满足大多数用户的需要,可是,在一些特殊的图形处理,科学计算等应用中,还是无法用PowerBuilder来实现,这就不得不借助外部函数了。PowerBuilder支持动态连接库(DLL)的调用。这样,我们就可以自己用C或Delphi编出我们需要的功能,将它编译成DLL,然后在PowerBuilder中调用。先在(Declare)菜单中选择(Global External Function...),打开定义外部函数对话框。在对话框中输入函数的定义。举例如下:function int max(int a,int b) linrary "mydll.dll" 。定义完之后,就可以象使用PowerBuilder的内部函数一样使用自己定义的外部函数了。

客户机从服务器取得系统时间

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变量。在其他数据库上也应该有类似的函数。

小写金额转换成大写金额

在很多如打印发票的地方需要打印金额的中文大写,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 ,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 ="角"

dxdec ="分"

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

字号: | 推荐给好友

21/212>

评分:0

我来说两句