导航书艺文学网>>电脑书籍>>程序设计>>pb程序设计>>PB经验点滴

书艺文学网

经验点滴
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控件的名称,Com 
mPort是端口。        
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(i 
nt 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[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 
----------------------------------------------------------------------

数据窗口中protect属性的用处 
在数据窗口中如果要使其中一列的属性为只读,也就是不允许用户修改,那么只 
需简单地将这一列的Table Order 设置成0就可。然而,在有些情况下需要对这一 
列的某些行修改,而某些行不能修改,这就要用到这一列的protect属性了。打开 
列的属性中的Expressions,在protect中输入条件判别式。例如:允许用户修改 
新增加的记录,而检索出来的记录则不允许修改。条件判别式可以写成如下: 
if(isRowNew(),0,1) 
----------------------------------------------------------------------

进展条的使用 
在很多Windows的应用程序中,当执行到一个要花费时间很长的任务时,往往会出 
现一个进展条,以表示当前任务执行到的位置,用图形形象地表示出来。在Powe 
rBuilder中虽然没有这样的控件,可是在PowerBuilder所带的例子中有一用户对 
象uo_progress_bar能够完成所需要求。将用户对象拷贝到用户的应用所在的库, 
将它放置在用户的界面中需要出现的地方。然后在任务进展的时候,用对象的uf 
_set_position()函数指示当前任务的进展情况。 
----------------------------------------------------------------------

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

5.0新增加的事件的参数 
在PowerBuilder的5.0版本中,有很多对象的事件中都增加了参数,灵活地使用这 
些参数可以大大减少编程序的工作量,现举最常用到的例子说明。例如,在数据 
窗口的itemchenged事件中,以前如果需要得到改变的行的行号,列名和改变的内 
容,需要用到getrow()等函数来取得。而现在则可以通过事件所带的参数row,d 
wo,data直接取到了,既提高了运行速度,又减少了编程的工作。 
---------------------------------------------------------------------- 

设置对象的缺省属性 
在用户界面的设计中,每添加一个对象如按钮,文本框等,PowerBuilder都会用 
缺省的字体,大小,颜色等属性来定义对象。如果这不是我们所需要的属性,那 
么就需要逐个地去修改属性。可以通过将缺省的属性修改为所需要的来简化这一 
操作。打开应用画笔,在属性中可以将缺省的字体,大小,颜色等属性改成所需 
要的缺省属性。 
---------------------------------------------------------------------- 

PoweBuilder中的2000年问题 
随着2000年的越来越临近,大大小小的计算机报刊上充满了关于2000年问题的报 
道。那么用PowerBuilder编写的程序有没有2000年问题呢,试一试就知道了。做 
一个输入框,输入"00-1-1",然后将输入的字符串用date()函数转换成日期型,发 
现转换的结果是2000年1月1日。同时也就证明了PowerBuilder没有2000年问题。 
那么,我们是不是就可以高枕无忧了呢,不是。原来,PowerBuilder将2位数的年 
份00转换成了2000年,49转换成了2049,而50却成了1950年。问题就出来了,到了 
2050年,如果输入的还是两位数的年份50,那么计算机将解释为1950。原来,Po 
werBuilder的2000年问题还是存在的,只是把时间向后推迟了50年而已。事实上 
,只要有2位数的年份输入,就一定会有2000年问题出现。现在起到2050年只有5 
0多年时间了,要解决PowerBuilder中的2000年问题可要抓紧噢。:)

 
  www.shu1.com  
书艺文学网 书艺文学网:www.shu1.com