本文介绍
方法和技巧都是笔者在实践中
一点积累,在此拿出来与大家一起分享。希望在阅读本文后会对您有所帮助或启发。文中如有任何不足之处还望同行们给予指教。在此,我先道声谢。
一、实现运行窗口居中 字串8
众所周知,PowerBuilder 7.0在以前
版本中提供了图形化
预览工具,可以很方便
在设计阶段实现窗口居中。但是,到了7.0似乎该项工具被取消了,也没有什么属性来设置,至少我没有找到。每当我们需要将窗口居中
时候只有一点一点地调整它
X,Y值,这一点十分让人头痛。出于无奈,只
通过编程实现。我们只在每个需要居中
窗口
Open事件中写上这些代码就会实现窗口
自动居中。
字串4
要实现窗口
自动居中,我们可以用函数Move()来实现。但是,由于我们开发出来
应用程序往往会在不同
设置环境中运行,虽然一般情况下是由我们为用户配置
,但我们总不能保证用户显示器
设置模式不会改变。所幸
是,PB为我们提供了环境对象Environment,该对象其实是一个系统结构,其中保存了PB应用程序
运行平台信息,例如,代码集,CPU类型等。其中当然会有我们需要
屏幕宽和高。为了得到该结构我们可以用函数GetEnvironment()。该函数
作用是得到关于操作系统,处理器和屏幕
系统信息。具体用法如下: 字串8
Environment my_system
Integer li_ScreenWidth, li_ScreenHeight
GetEnvironment(my_system)
// 得到屏幕
总宽度和长度
li_ScreenWidth = PixelsToUnits(my_system.ScreenWidth, XPixelsToUnits!)
li_ScreenHeight = PixelsToUnits(my_system.ScreenHeight, XPixelsToUnits!)
// 函数PixelsToUnits()
作用是将屏幕
像数转换成PowerBuilder使用
单位,因为像数通常不用于方形中,具体用法请参见函数手册。然后就可以用Move()来实现窗口居中。 字串3
This.Move((li_ScreenWidth - this.Width)/2, &
(li_ScreenHeight - this.Height)/2 ) 字串5
二、数据窗口中实现字段
组合 字串4
你有没有碰到这样
情况,我们输入了客户
详细地址资料,包括省份,城市,地址,邮编。当我们要给客户们邮寄信函时需要将他们
省份,城市,地址,邮编连成在一起打印出来。然而,这些信息是分开存储
,即存在不同
字段。这时我们就可以利用PowerBuiler提供
在数据窗口添加计算域(Compute Field)来实现字符字段
组合显示。
字串4
现在假设客户
省份,城市,地址,邮编分别存放在不同
字段中,它们是Province,City,Address,PC。我们要得到“邮编 省份 城市 地址”
格式,如:“(214001)江苏省无锡市人民路1号。",具体实现如下:
字串3
1、在需要显示
位置添加一个计算域(Compute Field)
字串2
2、在它
表达式栏中写上“ '(' PC ' )' Province City Address ”
3、单击确定完成。
很容易是不是。需要提醒大家
是,计算域只能用来显示,不能对它进行修改,因为它没有TAB属性,不能得到焦点。
字串1
三、数据窗口中
条码显示
在数据窗口中显示条码是不是很神秘?这对于没有接触过条码
人来说也许是这样。其实,它简单
不能再简单了。别忘了我们在写文稿时是如何使文稿看上去更有艺术化。没错我们会给它用上各种字体。问题不就解决了吗?条码也是种字体,只不过我们看不懂罢了。我们只要将需要用条码显示
字段
字体换上相应
条码字体就行了,比如,常用
3 of 9条码字库等。这些字体大多数是免费
,可以到网上去下载,然后安装就行了。
字串6
四、数据窗口
自动刷新技术
在我们编写诸如像库存,销售等应用系统时,总希望程序能动态
自动刷新库存量或销售量,比如说每隔1秒刷新一次。要实现这样
功能只要我们利用数据窗口
时间间隔属性(Timer Interval),当该值为0时数据窗口不进行刷新,如果要使数据窗口以每一秒钟
频率刷新
话,只要将该值设为1000,即1000毫秒。 字串3
我们还可以为应用程序添加闪烁报警
功能。就拿库存量来说吧,最常用
是当某货物
库存量达到一个最低库存量时程序应能自动判别,并用警告色显示,通常是红色。此时,我们只要在运用了上述
方法后再在需要闪烁
字段上,比如,库存量,在它
颜色属性中写上相应
语句。下面这段代码实现“当某一物品
库存量小于20
时候,程序以红色闪烁显示警告”
if ( Store_Num < 20, &
if mod( Second(Now()), 2) <> 0, & // 每秒一次,偶数显示红色,奇数显示白色,即底色
RGB(255, 255, 255), RGB(255, 0, 0) )五、数据窗口中实现自动折行 字串5
有时为了界面
考虑需要将一些长字段折行显示,但又不能确保在所有情况下都会出现长字段。比如,我们要求当客户地址超过50个字符时将它分两行显示,对于没满50个字符
客户仍然按照正常格式显示。
具体如下:
1、在数据窗口中选择要自动折行
列Address。
2、选择位置属性(Position)并选中Autosize Height选项 字串3
3、 选择编辑属性(Edit)并去掉Auto Horz Scroll选项 字串4
4、选择数据窗口中细目带
属性Autosize Height选项。注意,是当你拖动细目栏时出现
属性。
字串1
字串6
设置完毕后在左下角预览窗口中将显示图例
结果。
字串8
在进行列自动折行显示
时候,还要注意一点,系统判断自动折行
断点是以空格或标点符号为依据
,如果我们输入一长串字符且中间没有任何标点符号或空隔
话,即使该字符串再长也无济于事。因此,我们一定要提醒用户在录入时适当
加入一些空格或回车。
六、数据窗口中记录颜色
隔层显示
字串2
相信你一定见过这样
显示,第一行记录
背景色是浅黄色,第二行记录
背景色是白色,第三行又是浅黄色,第四行又是白色……,依次类推。 字串3
要想让显示
数据达到上述效果,我们首先要知道
是这些数据存放在数据窗口中
什么地方。很显然,数据窗口中
所有数据是在细目带中列出
,因此只要在细目带中设置一些数据属性就会影响到这个细目带中
所有内容。具体实现如下: 字串8
1、打开数据窗口,单击细目带(Detail),注意是点击有“Detail”字
一栏,不是它存放数据
地方。点击它鼠标会出现上下小箭头。
字串1
2、选择常规属性,单击颜色属性(Color)旁边
一个带有红色图标
小按钮。 字串9
3、在表达式一栏中输入 字串1
if ( Mod( GetRow(), 2) = 0, RGB(255, 255, 200), RGB(255, 255, 255))
字串9
// RGB(255, 255, 200),浅黄色
OK,预栏一下,效果不错,大功告成。 字串8
七、实现数据窗口
动态排序
在用到Windows
资源管理器
时候,当我们需要按照文件
类型或名称排序
时候只要用鼠标点击一下相应
标题栏,系统会按照升序或降序交替排序,这完全取决于用户鼠标点击
奇偶数。如此方便
操作何不用到我们
数据窗口中——实现按某列
动态排序。
字串8
为了实现上述功能,程序首先需要用到一个全局变量(相对于PB来说可以用窗体变量),用它来控制连续两次点击之间
排序方向。因为字段
排序方向只有升序和降序两种,所以我们可以用一个Boolean型。本例中是Boolean ib_flag。接着在数据窗口控件
Clicked事件中写上如下代码
/*****************************程序代码******************************/
String ls_column, ls_sort
ls_column = this.GetObjectAtPointer() // 得到鼠标按下位置
对象名
ls_column = left(ls_column, len(ls_column) - 2) // 得到列标题名字
if not Lower(right(ls_column, 2)) = "_t" then return
// 如果不是缺省
列标题,即以“_t”结尾或鼠标根本没有点在列标题上则退出
ls_column = left(ls_column, len(ls_column) - 2) // 去掉列标题末尾
“_t”,得到有效
列标题名
// 进行升序和降序
切换
if ib_flag then
ls_sort = ls_column " A" // 升序
else
ls_sort = ls_column " D" // 降序
end if
ib_flag = not ib_flag // 为下一次排序准备
ls_sort = ls_sort
this.setsort(ls_sort)
this.sort()
/*****************************结束******************************/ 注:这里所叙述
数据窗口中列
动态排序是以系统默认
列标题名为前提,即在标题栏中列标题名字是以“_t”结尾。
字串3
字串9
八、设置系统时间
在开发具有数据服务器
应用软件时,有时为了使所有计算机
时间都保持相同,或者接近相同,主要是为了避免数据录入时出现
时间差异,通常我们会在客户机每次使用应用软件前将本地时间设置成跟服务器相同。从而确保输入
数据在时间上具有较高
正确性。即,要实现系统时间
设置。下面就讲述一下实现
过程。 字串2
本程序是通过调用外部函数SetSystemTime()实现系统时间
设置,该函数返回布尔型。查阅一下有关参考手册就会发现该函数需要一个表示系统时间结构(Struct)
数据类型作为参数。此结构
定义如下: 字串8
struct _SYSTEMTIME {
INT iYear;
INT iMonth;
INT iDayOfWeek;
INT iDay;
INT iHour;
INT iMinute;
INT iSecond;
INT iMilliseconds; // 毫秒
} str_SystemTime; 要在程序中使用外部函数首先需要要进行外部函数声明,可以根据函数
使用范围放在全局外部函数声明区或局部外部函数区声明。具体声明如下:
字串9
Function Boolean SetSystemTime(str_SystemTime str_MyTime) Library "Kernel32.dll"
字串9
声明之后就可以使用了。下面代码实现将系统日期设置成“2000年8月10日” 字串5
/*****************************程序代码******************************/
str_SystemTime str_MyTime
// 给结构赋值
str_MyTime.iYear = 2000 // 2000年
str_MyTime.imonth = 8 / /8月
str_MyTime.iDay = 10 // 10日
// 设置系统日期
if SetSystemTime(ref str_MyTime)then
Beep(1)
MessageBox("提示","系统日期设置成功!")
else
Beep(1)
MessageBox("提示","系统日期设置失败!")
end if
/*****************************结束******************************/ 注意,如果只有日期没有时间
话系统会将时间设置成默认
上午8点整。设置系统
时间方法和设置日期类似,只要将结构中
时、分、秒分别设置成想要
就行了。具体实现请读者自己完成。
字串6
至此,本文所讲述
八个技巧到此结束。
![我要研发网[www.51dev.com]](/templets/images/toplogo.gif)
