2.6 建立应用程序
到目前为止,本程序中用到的对象都定义好了,但程序还不能运行,因为我们还没有为程序编写代码,这种代码在PowerBuilder中被称为脚本,PowerBuilder是一种基于面向对象的事件驱动机制开发工具,所以脚本也是针对对象的事件来编写,接下来就为应用程序编写脚本。
PowerBuilder应用程序的特点是从应用对象开始执行程序,所以我们首先要做的是为应用对象的打开事件编写代码,单击POWERBAR工具条上的APPLICATION画板按钮打开应用对象,然后单击PAINTERBAR工具条上的SCRIPT画板按钮,系统弹出SCRIPT对话框用来为应用对象编写脚本,从SELECT EVENT下拉列表框中选择OPEN事件,然后在工作区中输入如下脚本(图2-35):
SQLCA.DBMS=PROFILESTRING("PB.INI","DATABASE","DBMS","")
SQLCA.DBPRAM=PROFILESTRING("PB.INI","DATABSE","DBPRAM","")
OPEN(TELEPHONE-WINDOW1)
图2-35
解释这段脚本前要先介绍事务对象的概念,这里的SQLCA就是一个系统自动提供的缺省事物对象变量,SQLCA是一个全局变量,可以用在所有的窗口对象中。事物对象的作用是为联结数据库提供有关的信息,以便可以从数据库中获取需要的数据。这段脚本所做的工作是在应用对象启动后首先从POWERBUIDER中存放与数据库有关信息的文件PB.INI中取得需要的值放入事物对象变量中,然后打开TELEPHONE-WINDOW1窗口,以便用户从登录窗口输入正确的密码后可以进入到个人通讯录管理系统。这里就为应用对象编写这三行代码。
单击POWERBAR工具条上的WINDOW画板按钮,选择打开TELEPHONE-WINDOW1,我们开始为它编写脚本,右键单击窗口上的OK按钮,首先在菜单中选择PROPERTIES菜单项来修改OK控件的一个属性,在弹出的对话框中有一个DEFAULT复选框,我们选中它(图2-36),这样在以后程序运行的时候按回车键的效果和单击OK控件就一样了,单击OK关闭对话框,然后再次右键单击窗口上的OK按钮,在菜单中选择SCRIPT菜单项开始为这个命令按钮的单击事件编写脚本,观察窗口的标题确定目前选择的是命令按钮的CLICK事件后在工作区中输入以下的脚本:
if upper(trim(sle_1.text))="mypassword" then
open (telephone_window2)
close(telephone_window1)
else
sle_1.setfocus()
end if
这段脚本所做的工作是当用户在打开的登录窗口中单击OK按钮的时候判断单行编辑框中的字符串在去掉前后的空格符和整个转换成大写字符后是否为字符串“MYPASSWORD”,如果是的就打开我们在前面定义的第二个,也就是用来对个人通讯录数据库进行操作的窗口,然后再关闭登录窗口, 如果输入的字符串与设定的字符串“MYPASSWORD”不符的话就表示用户不能对通讯录数据库进行访问,就把输入焦点切换到编辑框让用户重新输入正确的口令,这里我们把口令设成了“MYPASSWORD”,在实际应用中你可以换成一个自己的口令,这样可以保证自己的数据库的安全性。
图2-36
[1] [2] 下一页
接下来我们为第二个建立的窗口,也就是真正对数据库进行操作的窗口编写脚本,这里的脚本是真正完成对数据库中数据的修改。首先要为窗口的打开事件编写脚本,也就是在窗口打开后需要干什么事。用类似打开第一个窗口的方法打开第二个窗口,用鼠标右击窗口中的空白区域,在弹出的菜单中选中SCRIPT菜单项,系统弹出一个用来为窗口本身所有可能的事件编写脚本的窗口,选中窗口的打开事件后在窗口的工作区中输入如下脚本:
CONNECT;
DW-1.SETTRANSOBJECT(SQLCA)
DW-1.RETRIEVE()
DW-2.SETTRANSOBJECT(SQLCA)
脚本的第一条语句的意思是用刚才介绍的系统缺省的事物对象SQLCA联结数据库。第二行脚本的意思是告诉数据窗口控件DW-1中的数据窗口对象利用事物对象SQLCA来取得数据库的有关信息。而第三条语句的意思是让数据窗口控件中的数据窗口对象,要利用创建该数据窗口对象时的SELECT语句来获得数据显示在相应的数据窗口控件中。第四行语句的作用和第二行语句的作用是类似的,是告诉数据窗口控件DW-2所联结的数据窗口对象从系统缺省的事物对象SQLCA中获取有关数据库的信息。这样我们就为对数据库进行操作的窗口的打开事件编好了脚本,要指出的是可以发现这里的脚本都是做一些窗口被打开后必须做的事情,即初始化工作。
接下来我们为窗口中的控件编写脚本,首先为数据窗口控件DW-1的鼠标单击事件编写脚本,脚本要达到的目的是当用鼠标单击数据窗口控件DW-1中显示出来的某条记录时,关于这条记录的详细信息将显示在数据窗口控件DW-2中。鼠标右击数据窗口控件DW-1,在弹出的菜单中选择SCRIPT菜单项,系统弹出编写脚本的窗口,从SELECT EVENT下拉列表框中选择事件为CLICKED,然后在工作区中输入如下脚本:
int recordnumber
int currentnumber
recordnumber=dw_1.getclickedrow()
if recordnumber=0 then
messagebox( "this is a message","not valid row, please close this dialog and click a valid row in dw_1")
else
correntnumber=dw_1.getitemnumber(recordnumber,1)
dw_2.retrieve(currentnumber)
end if
这是一段很重要的脚本,深刻理解这段脚本对你以后的编程会有很大的帮助的。脚本的前两行是定义了两个整型的变量,第三行脚本的意思获取被用户用鼠标单击的那行记录的行号,也就是第几个记录,并把这个值放在变量RECORDNUMBER中,如果用户虽然单击了数据窗口控件DW-1,但单击的是没有数据的地方,这时函数返回的行号就为零,表示用户单击的不是一条有效的记录。从第四条语句一直到最后是一个IF条件语句,它的作用是判断用户单击的是否是一条有效的记录行,如果不是的就弹出一个对话框告诉用户刚才单击的不是一条有效的记录行,并让用户关闭这个对话框后在数据窗口控件DW-1中单击选中一个有效的记录行。如果IF条件语句判断用户单击的是一条有效的记录行,就从这行所对应的记录中取出第一个字段NUMBER的值,并把这个值放入变量CURRENTNUMBER中,然后把变量CURRENTNUMBER作为数据窗口控件DW-2所联结的数据窗口对象TELE-DATAWINDOW2定义时的搜索参数的值,使用RETRIEVE函数把对应的记录从数据库中取出来显示在数据窗口控件DW-2中。可以看出这段脚本实现了两个数据窗口之间的简单通讯。
接下来我们为窗口中最下面的四个命令按钮分别编写脚本。首先看“插入”按钮,用和前面类似的方法打开“插入”按钮的事件编写窗口,选中CLICKED事件,开始输入下面的脚本:
dw_2.reset( )
dw_2.insertrow(0)
这段脚本只有两句,第一条语句的意思是清除数据窗口控件DW-2中的已有记录,即使得数据窗口控件中没有任何内容。第二条语句的作用是向数据窗口控件所联结的数据窗口对象中加入一条新的记录。
再为“删除”按钮编写脚本,用和前面类似的方法打开“删除”按钮的事件编写窗口,选中CLICKED事件,始输入下面的脚本:
dw_2.deleterow(0)
这段脚本就一条语句,它的作用是调用PowerBuilder提供的函数DELETEROW来删除数据窗口中的一行记录,这里函数中的参数0表