pb6.5学习

什么是PowerBuilder

在开始学习PowerBuilder之前,首先要弄清楚的问题是什么是PowerBuilder,它是用来干什么的,它的特点又是什么。只有知道了PowerBuilder的功能和特点所在,我们才能知道什么时候应该选用PowerBuilder作为我们的应用程序开发工具。

1.1 什么是PowerBuilder

    我们知道,数据库应用是当前计算机应用的一个非常重要的方面,而在目前的数据库应用技术中普遍采用的就是客户机/服务器体系结构,在这种体系结构中,所有的数据和数据库管理系统都在服务器上,客户机通过采用标准的SQL语句等方式来访问服务器上数据库中的数据。由于这种体系结构把数据和对数据的管理都统一放在了服务器上。就保证了数据的安全性和完整性,同时也可以充分利用服务器高性能的特点。正因为客户机/服务器体系结构的这些优点,因而得到了非常广泛的应用。

    PowerBuilder是著名的数据库应用开发工具生产厂商PowerSoft公司推出的产品(PowerSoft现已被数据库厂商Sybase所收购),它完全按照客户机/服务器体系结构研制设计,在客户机/服务器结构中,它使用在客户机中,作为数据库应用程序的开发工具而存在。由于PowerBuilder采用了面向对象和可视化技术,提供可视化的应用开发环境,使得我们利用PowerBuilder,可以方便快捷地开发出利用后台服务器中的数据和数据库管理系统的数据库应用程序。

    在当前,网络技术迅速发展,随之发展的还有OLE,OCX,跨平台等技术,而在PowerBuilder的最新版PowerBuilder 6.0中提供了对这些技术的全面支持。总之在数据库开发工具领域,PowerBuilder是其中非常优秀的一个,利用它我们可以开发出功能强大的数据库应用程序。

1.2 PowerBuilder的特点

    PowerBuilder提供了对目前流行的大多数关系数据库管理系统的支持,由于在PowerBuilder的应用程序中对数据库访问的部分一般采用国际化标准数据库查询语言SQL,使得用PowerBuilder开发的应用程序可以不做修改或者只做少量的修改就可以在不同的后台数据库管理系统上使用。也就是说用PowerBuilder开发的应用程序是独立于服务器上的数据库管理系统的。

    和大多数的WINDOWS应用程序一样,PowerBuilder也是事件驱动工作方式。在这种工作方式中,程序的运行没有固定的流程,程序中的代码也是为各种可能发生的事件编写的,当程序开始运行之后,它就可以接受来自系统,用户或者其它应用程序触发的事件,然后执行相应的事件代码。事件驱动的工作方式与面向对象技术是紧密相关的,在PowerBuilder应用程序中,接受发生的事件的往往就是程序界面中的各种可视化对象。

    PowerBuilder是一种面向对象的开发工具,各种WINDOWS应用程序中常见的窗口、菜单、控件等在PowerBuilder中都是一个个的对象。在PowerBuilder中我们还可以创建自己的用户对象。特别要指出的是PowerBuilder提供了对面向对象方法中的各种技术的全面支持,我们可以利用面向对象方法中的对象的封装性、继承性、多态性等特点使得我们开发的应用程序具有极大的可重用性和可扩展性,而这一点正是软件工程中对应用程序所提出的重要目标。

    在当前,由于网络技术的发展,许多种不同的操作系统平台在INTERNET网上同时被使用,这对开发的应用程序的跨平台性提出了更高的要求,而PowerBuilder就提供了良好的跨平台性,比如在PowerBuilder中,利用WINDOWS平台开发的各种对象可以方便地应用到UNIX平台中,因为PowerBuilder支持对象的跨平台性。这样使得把应用程序从一个平台移到另一个平台变得并不复杂。

为了给用户提供各个方面的支持,PowerBuilder具有自己的编程语言POWERSCRIPT,这个语言除了提供基本的流程控制语句,还提供了几百个函数来操纵各种对象和提供诸如DDE,OLE等方面的支持。此外我们还可以定义自己的函数,处理特定的事件。学习PowerBuilder时相当一部分的时间就是用来了解和熟悉PowerBuilder提供的各种函数。

    PowerBuilder一个很大的特点就是提出了数据窗口对象的概念。数据窗口对象也是PowerBuilder中的一种对象类型,与其它对象不同的是数据窗口对象是专门为了访问后台的数据库服务的,在数据窗口对象中我们定义了数据的来源和数据的显示风格,这样在应用程序中我们就可以把精力完全放在程序的运行流程控制上,而不用关心具体数据的来源,因为我们在数据窗口对象中已经定义好了数据的来源。如果需要使用数据库中不同的数据也只要对数据窗口对象进行修改就可以了。特别要指出的是PowerBuilder在数据窗口对象中提供了丰富的数据显示方式,可以满足各种不同的需要。

    在PowerBuilder较新的版本中提供了基础类库PFC,它为应用程序的开发提供了许多可重用的预定义类和对象,利用基本类库PFC可以快速开发出高质量重用性好的应用程序。真正发挥面向对象编程的巨大威力。

    最后要指出的是PowerBuilder有三个不同的版本,分别为DESKTOP型,PROFESSIONAL型,和ENTERPRISE型,DESKTOP型是为个人使用的桌面型应用程序,在这里可以利用PowerBuilder内置的数据库管理系统SYBASE SQL ANYWHERE来创建和使用本地数据库,为个人的应用服务;PROFESSIONAL型的PowerBuilder最重要的一点就是提供了对MICROSOFT ODBC(数据库标准连接接口)的支持,在PROFESSIONAL版本中我们就可以使用PowerBuilder的继承,多态等绝大多数特性;在ENTERPRISE版本中最重要的一点就是提供了对开发大型的数据库应用程序的全面的支持,提供了开发大型应用程序的许多辅助的工具,比如C++ CLASS BUILDER等。

1.3 PowerBuilder与数据库的连接

    数据库前端开发工具与后台数据库管理系统的连接方式是一个很重要的课题。PowerBuilder提供了两种访问后台数据库的方式,一种是通过ODBC标准接口的方式,第二种是通过专用的接口与后台的数据库相连。

    ODBC的中文名字是开放式数据库连接,它是微软公司提出的数据库连接标准,使用ODBC方式连接数据库的第一步是创建数据源,比如我们可以利用WINDOWS下控制面板中的“32 BIT ODBC”选项来创建驱动某种数据库的数据源,创建好数据源之后,我们就可以在本地计算机中利用定义好的数据源存取后台数据库中的数据了。

    我们还可以通过专用接口同后台的数据库相连,由于专用接口是针对特定的后台数据库管理系统而设计,因此这种方式存取数据的速度要比采用ODBC方式存取数据的速度要快一些,如果我们的应用程序只是针对特定类型的后台数据库,当然是采用专用接口访问后台数据更快一些。

    关于PowerBuilder的基本概念和特点就介绍到这,接下来我们就要真正进入到PowerBuilder的精彩世界了。

第二章 PowerBuilder 入门之创建新的数据库

创建一个新的数据库的过程如下:

    1) 单击工具条上的DATABASE画板按钮,利用它来创建新的数据库,单击后屏幕上弹出一个标题为SELECT TABLES的对话框(图2-2),让我们选择表,这些表是系统当前所连接的数据库中的表,因为我们现在是要创建新的数据库,所以单击对话框的CANCEL按钮关闭这个对话框,接着屏幕上显示的是一个完整的数据库画板窗口,窗口的标题显示的是系统当前所连接的数据库的名字。

图2-2

    2) 单击FILE菜单,选择其中的CREATE DATABASE菜单项,屏幕上弹出了CREATE LOCAL DATABASE对话框,利用这个对话框我们就可以创建本地数据库。首先单击BROWSE按钮弹出一个对话框,用于选择数据库存放的目录和数据库的名字,这里不妨设定D:\DATABASE目录为数据库的存放路径。我们要创建的是一个通讯录管理程序,所以在对话框的文件名一栏中给它起名为TELEBOOK,然后单击保存按钮关闭BROWSE命令所弹出的对话框。注意到现在的对话框的DATABASE NAME一栏中显示的就是我们刚刚设置的数据库的完整路径(图2-3)。对话框中还有很重要的USER ID、PASSWORD等项,它们是用来设置访问此数据库所需要的帐号、口令等信息,以防止对数据库的非法访问,维护数据库的安全性。

    3)单击OK按钮,PowerBuilder的本地数据库管理系统就会自动生成SQL语句,在指定的目录D:\DATABASE下生成一个名为TELEBOOK的本地数据库,并以文件名TELEBOOK.DB保存在磁盘上。观察一下数据库窗口的标题,可以发现系统已经自动把新创建的TELEBOOK数据库作为系统当前所连接的数据库(图2-4)。

图2-3

图2-4

对于一个表来说,一般总需要定义关键字,关键字所在字段的值对于表中不同的记录一定是不相同的,关键字是维护数据库的完整性和正确性的重要手段。

   定义表MYTELEBOOK的关键字的过程如下:

   1) 单击工具条上的PROPERTIES按钮,系统弹出一个对话框用来选择和设置表的各种属性,在对话框中单击PRIMARY KEY标签,来为表定义关键字,单击对话框下部所显示的表的NUMBER字段,可以发现NUMBER字段出现在对话框上部的KEY COLUMNS一栏中(图2-9),表示字段NUMBER已经成为关键字的组成部分,这里仅选择NUMBER字段作为表的关键字,单击OK按钮关闭对话框,MYTELEBOOK的关键字已经成功地设置为NUMBER字段。

图2-9

   2) 单击工具条上的CLOSE按钮,系统弹出一个对话框询问是否保存对表的修改,选择“是”后对话框和CREATE TABLE窗口都被关闭,一个标题为MYTELEBOOK的表出现在DATABASE窗口中,注意到有一个上面画有钥匙图形的小图标指向NUMBER字段,表明NUMBER是当前这个表的关键字段。

数据库是一个容器,其中存放的是一个个的表。接下来我们就来为刚建的TELEBOOK数据库创建表,创建表的过程如下:

   1) 单击工具条上的CREATE TABLE画板按钮,就弹出了标题为CREATE TABLE的对话框(图2-5),利用这个窗口我们就可以生成定义一张表所需要的各项信息。

图2-5

   2) 一个表是由很多的字段组成的,接下来开始定义表的各个字段了。注意COLUMN NAME一项,它是用来输入表的字段的名字。这里输入第一个字段的名字为NUMBER,代表一个人在通讯录中的编号。单击DATA TYPE一栏的下拉箭头,从中选择当前字段的数据类型,不妨把NUMBER字段设置为INTEGER整型。这时WIDTH和DEC两项是灰色的,这表示对于整型字段,数据宽度和小数点后的数据宽度两项是不可操作的。单击NULL一栏的下拉列表框,弹出YES 和NO两项,是用来选择当前的字段是否可以取空值,也就是在以后的实际记录中这一个字段是否可以不往里面输入数据,因为通讯录中的每一条记录都必须有一个编号,所以在NULL项中选择NO,表示这个字段不能取空值。注意到对话框的下部还有很多项用来设置当前字段的扩展信息,要指出的是,对于具体的某个字段,只要对确实需要定义和修改的属性进行修改,其它的属性采用系统所给定的缺省值就可以了。此外有些属性我们等到表建立好以后再重新定义。注意扩展属性中的HEADER项,系统已经设置了缺省值NUMBER,这里把它修改为“编号”,同样地把LABEL项中的缺省值修改为“编号”,上面定义的这两项是设置这个表将来通过数据窗口等途径显示出来时的字段题头和标签。这样就定义好了NUMBER字段的一些基本属性(图2-6)。

   3) 单击窗口上部中NUMBER字段的最后一项DEFAULT激活它,然后按TAB键,窗口中又出现一行让我们定义表的第二个字段的有关属性,这里定义第二个字段的字段名为NAME,代表记录中一个人的名字,数据类型选择为CHAR字符型。最大宽度WIDTH不妨设置为20,显然这个字段也应该是

图(2-6)

   非空的,然后把这个字段的题头和标签都设定为“名字”。

   4) 用类似的方法接着定义第三个字段的名字为HOME-ADDRESS,代表家庭地址。它的数据类型为CHAR型,宽度为50,因为在通讯录中可能暂时不知道某个人的家庭地址,所以这个字段可以是空的,即NULL栏选择为YES,字段的题头和标签都定义为“家庭地址”。接着定义第四个字段的名字为POSTCODE,代表邮政编码,它的数据类型设为NUMERIC,即数值型,宽度为6,DEC一栏为数值的小数点后的位数,这里设为0,NULL设项为YES,题头和标签设置为“邮政编码”,第五个字段的名字定义为WORK-ADDRESS,代表工作单位的地址,数据类型也为CHAR型,宽度为50,NULL项为YES,题头和标签设置为“工作单位”,第六个字段的名字设定为TELEPHONE,代表电话号码,数据类型设置为CHAR 型,数据宽度为15,NULL项为YES,题头和标签定为“电话号码”,最后一个字段给它起名为STATUS,代表一个人的目前状况,这个字段的值可能会因为人的不同,有时很长,有时很短,有时甚至可以为空值,所以定义它的数据类型为VARCHAR型,即变宽字符型,它的最大长度设置为256,NULL项为YES,题头和标签设为“目前状况”,这样我们就完成了对一个表的基本结构的设置工作(图2-7)。

图2-7

   5)下一步把表起个名字保存起来,单击工具条上的SAVE CHANGES按钮,系统弹出一个对话框让我们输入表的名字(图2-8),在TABLE NAME一栏中给它起名为MYTELEBOOK,单击OK按钮关闭对话框。注意到这时窗口的标题已经从UNTITLED变成了MYTELEBOOK,表示名为MYTELEBOOK的表已经成功地创建了。

图2-8

通过上面的操作我们已经成功地创建了数据库TELEBOOK和数据库中的一张表MYTELEBOOK,并且定义了表的字段的基本属性和一些字段的扩展属性。这时候的表还只是一个有了结构的空表,接下来要做的事情是往这个刚创建的表中加入一些数据,也就是记录,以后应用程序操作的对象一般都是表中的数据。

   往一个表中加入数据有两种基本的方法,先介绍第一种方法,添加记录的过程如下:

   1) 单击工具条上的DATA MANIPULATION(GRID)画板按钮,系统弹出了DATA MANIPULATION窗口,注意到在窗口的上部显示的就是记录的格式,但每个字段不是用字段本身的名字,而是用字段扩展属性中的HEADER项,也就是题头来代表这个字段,这样做的好处是记录格式看起来比较直观清楚。通过DATA MANIPULATION窗口就可以输入数据到表中。

   2) 单击工具条上的INSER ROW按钮,窗口上出现一个空行用来输入一条记录,回忆前面我们定义了NUMBER字段的有效性检查规则,要求数据必须在1和1000之间,试着在编号栏中输入2000,然后用鼠标单击其它的字段,这时系统会弹出一个对话框告诉我们刚才输入到编号栏中的数据没有通过有效性检查(图2-14),单击确定后系统把输入焦点仍旧放在编号栏中让我们重新输入一个有效的数据。

图2-14

   3) 输入编号为1,然后用TAB切换到姓名字段,输入姓名为“冯飞”,家庭地址输入为“南京市凤凰西街220号”,邮政编码输入为“210019”,工作单位输入为“南京市新街口百货商场”,电话号码输入为025-7984684,目前状况输入为“目前在复习英语,准备参加托福考试”,这样我们就输入了一条完整的记录到表中。

   4)再次单击工具条上的INSERT ROW按钮,窗口上又出现一条空记录用来输入数据,用类似的方法依次输入记录的各个字段的值依次为“2”,“李明”,“杭州市浙江大学200号信箱”,“310027”,“浙江大学数学系高等数学教研室”,“0571-7996453”,“担任数学系副主任和总支副书记”,输好第二条记录后用同样的方法再输入第三条记录各项依次为“3”,“张玲”,“宁波市大榭开发区”,“330020”,“宁波市大榭开发区土地管理局”,“0574-5433216”,“担任土地管理局局长”,这样我们就完成了三条记录的录入工作,要注意的是此时输入的记录并没有真正存放到磁盘上去,而是暂时放在缓冲区中,单击工具条上的SAVE CHANGES按钮,这样就把刚才输入的记录真正存放到了磁盘上相应的表中(图2-15)。

接下来介绍另外的一种数据输入方法,输入数据的过程如下:

   1) 单击工具条上的DB ADMINISTRATION画板按钮,弹出一个标题为DATABASE ADMINISTRATION的可编辑窗口,在这个窗口中可以输入SQL语句来往表中添加记录,不妨在其中输入一条标准的SQL语句为“INSERT INTO MYTELEBOOK VALUES(4,‘王晓’,‘安徽天长市建设东路30号’,239300,‘安徽天长市水泥厂’,‘05507545450’,‘担任水泥厂厂长’);”(图2-16)。

   2) 单击工具栏上的EXECUTE按钮,系统没有给出任何的反应,这表示INSERT语句已经提交给数据库管理系统并被成功地执行,如果输入的SQL语句有错的话,比如我们把上面INSERT语句括号中应该是整数的NUMBER项用一个字符串代替,然后单击工具条上的EXECUTE按钮,系统会弹出对话框提醒我们刚才输入的SQL语句有错,应该修改后再重新提交(图2-17)。

关闭DATABASE ADMINISTRATION窗口,单击工具条上的DATA MANIPULATION(GRID)画板按钮,弹出的窗口中的有一条记录就是刚才用SQL语句输入的记录(图2-18)。

图2-15

图2-16

图2-17

图2-18

   到目前为止,我们成功地创建了一个数据库和它的一个表,表中有四条记录,当然你可以用本节介绍的方法往表中添加更多的记录。接下来将创建POWRBUILDER应用程序不可缺少的组成部分——应用对象。

窗口在WINDOWS应用程序中是一个极为重要的概念,它提供了应用程序同用户之间交互的非常直观的界面,目前许多的WINDOWS下的开发工具都提供了可视化开发窗口对象的方法,使得开发一个窗口对象变得非常容易,PowerBuilder也不例外,下面就开始创建这里的应用程序中要用到的两个窗口。

首先来创建第一个窗口对象,创建一个窗口的一般步骤如下:

   单击工具条上的WINDOW画板按钮,系统弹出一个题为SELECT WINDOW的对话框,用来选择当前对象库中已存在的窗口对象(图2-22)。

图2-22

   单击对话框的NEW按钮来创建一个新的窗口对象。单击后屏幕上弹出一个题为WINDOW的窗口,接下来就可以往这个窗口中添加需要的控件了。

   单击PAINTERBAR工具条上的控件画板按钮,系统弹出一个方框,其中包含有各种各样的可用控件(图2-23),选中其中的一个,在窗口上单击,就可以把选中的控件放到窗口中。这里首先从方框中选择STATICTEXT控件,然后在窗口中单击,就会发现一个静态文本框空间就出现在窗口中,再次单击工具条上的控件画板按钮把第二个静态文本框控件放到窗口中,用类似的方法把一个SINGLE LINE EDIT控件,也就是单行编辑框放到窗口中,最后再把一个COMMAND BUTTON控件,也就是命令按钮放到窗口中。

图2-23

   为了使窗口更美观一点,可以对已放入窗口中的控件调整位置和改变一些特性,单击第一个静态文本框选中它,然后放到合适的地方,在上面单击右键,在弹出的菜单中选择PROPERTIES菜单项,系统弹出一个对话框用来设置这个控件的属性(图2-24),NAME栏显示的是控件的名字,这个名字是用在以后编写的脚本中,系统已经设置了一个缺省的名字,这里不作修改,接下来的TEXT一栏是用来设置显示在静态文本框中的文本,这里把它改为“个人通讯录管理系统”,设好后单击OK按钮,用类似的方法把调整另外一个静态编辑框的位置,并把上面的文字改为“请输入你的使用口令:”,然后激活单行编辑框,调整好它的位置后把鼠标放在它的右边框上等鼠标变成水平双箭头形状的时候单击并拖动鼠标,把编辑框拉长一些;最后调整命令按钮的位置并把上面的标题修改为“OK”。用鼠标右键单击窗口中没有控件的空白区域,然后在弹出的菜单中选择PROPERTIES菜单项,在弹出的对话框中把TITLE一栏改为“个人通讯录”,然后单击“OK”按钮关闭对话框。

图2-24

   单击工具条上的PREVIEW按钮可以预览设计好的窗口(图2-25),窗口的标题就是我们刚在窗口的TITLE属性中输入的值。关闭预览窗口,这样我们就定义好了第一个窗口对象,需要给它起一个名字,单击FILE菜单的SAVE菜单项,弹出一个题为SAVE WINDOW的对话框,在WINDOWS一栏中给窗口起一个名字为TELEPHONE-WINDOW1,这个明字将用于以后的程序中,输好后单击OK按钮,可以发现窗口的标题已变成刚输入的名字,到此为止第一个窗口就设计好了。

图2-25

用对象是PowerBuilder应用程序的基础,通过它可以设置有关应用程序的全局信息,例如应用程序的名字,程序使用的图标,程序中文本的字体,应用程序所在的对象库等各种信息。在以后将详细介绍如何设置应用程序的这类信息。要记住的很重要的一点是应用对象是PowerBuilder应用程序执行时的入口点。下面我们就开始创建一个新的应用对象。

   1)单击工具条上的APPLICATION画板按钮,系统弹出一个标题为APPLICATION的窗口,每次启动PowerBuilder后系统都会自动打开前一次的应用对象。下面我们将要创建一个新的应用对象。

   2) 打开FILE菜单,单击其中的NEW菜单项,屏幕上弹出一个名为SELECT NEW APPLICATION LIBRARY的对话框,用于设置把应用对象保存到哪个库文件中。应用程序对象库实际上是一个特殊格式的文件,用于存放应用程序所用到的各种对象。应用程序本身作为一个对象自然要放到对象库中。这里我们创建一个新的对象库,首先设置对象库的存放路径为D:\DATABASE,在文件名一栏中输入对象库的名字为TELEPHONE-BOOK(图2-19),然后单击保存按钮。

图2-19

   3)系统又弹出一个名为SAVE APPLICATION的对话框,用于给应用对象自身起一个名字,为方便记忆,同样给它起名为TELEPHONE-BOOK,对话框下部的注解栏用于输入有关这个应用对象的一些信息,以后重新打开这个应用对象时可以有一个大概的了解。

   4)单击OK按钮,系统就创建了一个名为TELEPHONE-BOOK的应用对象和它所在的名为TELEPHONE-BOOK.PBL的对象库。系统弹出一个对话框询问是否需要由PowerBuilder为我们生成一个应用程序的模板(图2-20),所谓应用程序的模板就是应用程序基本框架,这个框架中含有一些应用程序可能用到的基本对象,利用这个框架可以更好更快地开发应用程序。当然也可以不用这个模板而直接编写应用程序,这里选择“否”不让系统生成应用程序的基本框架,而是由我们自己一步步创建应用程序,以使你对PowerBuilder应用程序的开发过程有一个更深刻的了解。

图2-20

   5)单击工具条上的LIBRARY画板按钮,可以发现创建的应用对象TELEPHONE-BOOK出现在我们刚刚创建的对象库TELEPHONE-BOOK.PBL中(图2-21)。

图2-21

在创建了两个数据窗口对象后我们来创建第二个窗口,把数据窗口对象应用到窗口中去。

    单击POWERBAR工具条上的WINDOW画板按钮,在对话框中选择NEW按钮来定义一个新的窗口。

    单击PAINTERBAR工具条上的控件画板按钮,在弹出的方框中选择DATAWINDOW控件,再在窗口中单击把它放到窗口中,这里要提醒一点的是这里的DATAWINDOW控件与前面定义的数据窗口对象是两个不同的概念,这里的DATAWINDOW控件相当于一个容器,是用来存放数据窗口对象的。这里的数据窗口控件的作用是显示出数据库中所有记录的主要信息,所以可能在一个窗口中显示不下所有的数据,在这个DATAWINDOW控件单击鼠标右键,在弹出的菜单中选择PROPERTIES菜单项,在弹出 的对话框中选中VSCROLL BAR复选框,就为数据窗口控件在以后显示数据的时候提供了一个垂直滚动条,以便可以利用滚动条看到数据窗口中的所有的记录。

    用和放入第一个数据窗口控件类似的方法在窗口中放入第二个数据窗口控件,然后再在窗口中放入四个COMMANDBUTTON控件,

    鼠标右键单击激活窗口中的第一个DATAWINDOW控件,在弹出的菜单中选择PROPERTIES菜单项,弹出DATAWINDOW对话框,系统已经自动为这个控件起名为DW-1,这里就用这个名字,单击BROWSE按钮开始为控件定义它所联结的数据窗口对象,在弹出的SELECT DATAWINDOW对话框中选择数据窗口为TELE-DATAWINDOW1,然后单击OK按钮,可以发现在DATAWINDOW对话框的DATAWINDOW OBJECT NAME一栏中出现了刚选中的数据窗口对象(图2-33)。

图2-33

单击OK按钮,第一个数据窗口控件中显示的就是它所联结的数据窗口对象的结构。

用类似的方法为第二个数据窗口控件联结刚才定义的数据窗口对象TELE-DATAWINDOW2,联结好之后把四个命令按钮控件上的文字分别改为“插入”,“删除”,“更新”和“关闭”,而它们的名字则分别修改为“CB-INSERT”,“CB-DELETE”,“CB-UPDATE”,“CB-COLSE”。

接下来调整窗口的大小和窗口上的每个控件的位置和大小,要注意的是要使得数据窗口控件中的数据窗口对象的每一个字段都能在控件中看得到。调整好之后可以单击PAINTERBAR工具条上的PREVIEW按钮预览一下窗口的样子(图2-34)。设计好窗口以后单击PAINTERBAR工具条上的SAVE按钮,弹出SAVE WINDOW对话框用来给窗口起一个名字,给它起名为TELEPHONE-WINDOW2,确定对话框下部的对象库是TELEBOOK.PBL后单击OK 关闭对话框。这样就定义好了第二个窗口对象。

图2-34

在创建第二个窗口对象之前,我们需要先来创建两个数据窗口对象。数据窗口对象是PowerBuilder的一大特色,它为我们操作数据库中的数据提供了一种直观有效的手段,利用它可以方便地联结数据库,以自己喜欢的方式显示数据库中的数据以及修改数据库。下面就开始创建第一个数据窗口对象。

   单击工具条上的DATAWINDOW画板按钮,系统弹出一个名为SELECT DATAWINDOW的对话框,用以选择已存在的数据窗口对象或者创建新的数据窗口对象(图2-26)。

图2-26

这里来创建一个新的数据窗口,单击NEW按钮,在弹出的NEW DATAWINDOW对话框中有DATA SOURCE 和PRESENTATION STYLE两个组合框(图2-27),分别用来选择要创建的数据窗口的数据来源和显示样式,关于这些选项的含义在以后的内容中再详细介绍,这里选择数据源为QUICK SELECT,即简单查询型,数据显示样式选择GRID,即网格型。

图2-27

    单击OK按钮,系统弹出一个名为QUICK SELECT对话框用于对数据源进行配置(图2-28),在TABLES栏中选中先前创建的表MYTELEBOOK,这时在COLUMNS栏中显示出MYTELEBOOK表中的所有的字段,让我们从这些字段中选择其中的一些,这样做是考虑到用户在大多数时候可能只对表中的某些字段感兴趣,没必要在提供给用户的界面上显示出记录的所有的字段。目前创建的这个数据窗口是用来浏览通讯录的大致情况,所以只选中NUMBER,NAME TELEPHONE三个字段,选好后在对话框的下部显示出这三个字段,在每一个字段的下面又有三个选项,单击NUMBER字段下的SORT选项框,在弹出的下拉框中选择ASCENDING选项,这表示以后在数据窗口中显示数据的时候按编号字段从小到大的顺序显示记录, 以便于查看。其它的选项我们不作改动。

图2-28

    单击OK按钮,这样就为数据窗口设好了数据源,系统弹出的标题为DATAWINDOW的窗口中显示出的三个字段就是刚才选中的字段(图2-29),可以看出DATAWINDOW窗口被划分成了四个带状区域,这四个区域的大小和内容都是可以设计的,在HEADER区域中系统已经自动放好的就是我们为每个字段设定的题头,HEADER中的内容以后将显示在数据窗口中。单击左边工具条上的PREVIEW预览按钮,窗口中显示出预览的结果,数据库中的数据也自动按编号字段从小到大的顺序显示在网格中(图2-30)。

图2-29

图2-30

   接着为设计好的数据窗口对象起一个名字,双击DATAWINDOW窗口的左上角,弹出一个对话框询问是否保存设计结果,选择“是”后出现SAVE DATAWINDOW对话框,在DATAWINDOWS一栏中给设计好的数据窗口起名为TELE-DATAWINDOW1,确定在APPLICATION LIBRARIES选中的是TELEPHONE-BOOK1.PBL,然后单击OK按钮,就完成了第一个数据窗口对象的创建。

    再次单击POWERBAR工具条上的DATAWINDOW画板按钮,来创建第二个数据窗口对象,这个数据窗口用来显示在第一个数据窗口中选中的某个记录的详细信息。类似地,在弹出的对话框中选择NEW按钮,在NEW DATAWINDOW对话框中数据源选为SQL SELECT,即标准的SQL查询方式,数据显示方式这次设置为FREEFORM,即自由表格形式,它的特点是数据窗口中显示的每条记录的字段纵向排列,看起来比较清楚,选好后单击OK按钮,接下来弹出的对话框中同样选中MYTELEBOOK表后单击OPEN按钮,窗口中显示出表的所有字段,这次选中它的所有字段,可以发现在窗口下部的工作区中显示出自动生成的SQL语句,单击下部的SORT标签,单击并拖动NUMBER字段到右边的方框中,旁边出现的复选框表示已经把NUMBER字段按上升排序。单击DESIGN菜单,选中其中的RETRIEVIAL ARGUMENTS菜单项,弹出的对话框用来定义SQL 语句的搜索参数(图2-31),在NAME栏中给参数起名为NUMBER-SEARCH,TYPE就选择为NUMBER类型,然后单击OK按钮,就定义好了搜索参数。单击窗口下部的WHERE标签,单击COLUMN栏后选择NUMBER字段,OPERATOR栏就选择“=”号,VALUE栏中输入冒号加刚才定义的搜索参数NUMBER-SEARCH,然后单击PAINTERBAR工具条上的SELECT画板按钮,就定义好了数据窗口的数据源的具体格式。

图2-31

    单击左边PAINTER BAR工具条上的PREVIEW按钮,弹出一个对话框用来输入刚才定义的搜索参数的值(图2-32),这里不妨输入1,确定后窗口中就显示出表TELEBOOK中的NUMBER的值为1的记录。选择PAINTERBAR工具条上的EXIT按钮,弹出的对话框询问是否保存数据窗口,单击“是”后,在弹出的对话框中给数据窗口起名为“TELE-DATAWINDOW2”,确定在APPLICATION LIBRARIES选中的是TELEPHONE-BOOK1.PBL对象库,然后单击OK按钮,就完成了第二个数据窗口对象的创建。

图2-32

到目前为止,本程序中用到的对象都定义好了,但程序还不能运行,因为我们还没有为程序编写代码,这种代码在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

接下来我们为第二个建立的窗口,也就是真正对数据库进行操作的窗口编写脚本,这里的脚本是真正完成对数据库中数据的修改。首先要为窗口的打开事件编写脚本,也就是在窗口打开后需要干什么事。用类似打开第一个窗口的方法打开第二个窗口,用鼠标右击窗口中的空白区域,在弹出的菜单中选中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表示将被删除的是当前行的记录。

接着为“更新”按钮编写脚本,,打开“更新”按钮的事件编写窗口,选中CLICKED事件,开始输入下面的脚本:

if dw_2.update( )=1 then

commit;

dw_1.retrieve( )

else

rollback;

end if

这段脚本是一条完整的条件语句,首先使用UPDATE函数根据数据窗口控件DW-2所联结的数据窗口对象的变化真正地修改数据库,然后判断修改是否成功,如果成功的话就提交结果并让数据窗口控件DW-1所联结的数据窗口对象重新从数据库中取得数据,以使得数据窗口中的数据能和数据库中的数据保持一致,如果条件语句判断出修改失败的话就使用ROLLBACK语句使得数据库恢复到修改以前的状态。

最后我们来编写 “关闭”按钮的脚本,这个按钮的作用是用来关闭我们的应用程序,打开“关闭”按钮的脚本编写窗口,选中CLICKED事件,开始输入下面的脚本:

close(parent)

这段脚本的意思是关闭命令按钮所在的父窗口。

到目前为止,我们的应用程序就完成了对象的创建和应用程序脚本的编写接下来将运行这个应用程序,来验证它是否和我们需要的结果一致。

 

首先从FILE菜单中选择SAVE菜单项来保存我们上面所做的事情,然后关闭所有的窗口,从POWERBAR工具条中单击RUN按钮,系统开始运行我们的应用程序,先弹出的是“个人通讯录管理系统”的登录窗口(图2-37),编辑框是用来输入你的口令,只有口令正确后才可以进入数据操作窗口来浏览和修改你的通讯录中的数据。如果输入一个错误的口令“ERROR”,然后单击OK按钮,可以发现系统没有反应,只是把输入焦点重新切换到编辑框让你重新输入口令,输入正确的口令“MYPASSWORD”后回车,系统关闭登录窗口进入数据操作窗口(图2-38),左边的数据窗口控件中显示的就是通讯录数据库中的所有记录的主要字段的值,单击其中的某个记录,这个记录的详细信息就会显示在右边的数据窗口控件中(图2-39),如果我们单击左边数据窗口上的非记录区域,比如标题栏,可以发现系统弹出一个对话框,其中的内容告诉我们刚才单击的不是一条有效的记录行,这个对话框正是我们自己设计的对话框(图2-40)单击“确定”按钮关闭消息框,接下来我们插入一条记录,单击“插入”按钮,程序在右边的数据窗口中显示出一条新的记录用来输入记录数据,我们在新记录的各项中依次输入“5,薛明,江苏南京,210001,南京大学物理系,0255544678,目前担任系主任”,输好后单击“更新”按钮,新记录就本插入到数据库中,可以发现在左边的数据窗口中也多了一条刚输入的新记录。在左边数据窗口中鼠标单击入的新记录,然后单击“删除”按钮,这条记录就从右边的数据窗口中删除了,但此时的记录并没有真正从数据库中删除掉,再单击“更新”按钮,这条记录就真正从数据库中删除了,可以发现这时左边的数据窗口中也少了这条记录。对于数据的操作就演示到这,单击“关闭”按钮应用程序就被终止,系统又回到了POWERBUILER的开发环境下。

图2-37

图2-38

图2-39

图2-40

第三章 PowerBuilder集成环境与应用对象之定制工具条

下面首先介绍有关定制工具条的一些内容。

    鼠标右键在POWERBAR工具条上单击,系统弹出一个菜单,利用这个菜单可以设置工具条的一些属性。选中BOTTOM菜单项,工具条就被移到了窗口的底部,用类似的方法可以把工具条放在窗口的左边或者右边。

    再次在POWER BAR上单击鼠标右键,注意SHOW POWER TIPS菜单项,它如果处于选中状态,只要我们把鼠标停在某个画板按钮上不动,一会儿后就会在按钮的旁边显示一条短的语句介绍这个按钮的主要功能。如果去掉这个菜单项的选中标记,鼠标在画板按钮上停留的时候就不会显示提示了。在SHOW POWER TIPS菜单项的上面有一个名为SHOW TEXT的菜单项,选中它,可以发现在工具条的每个按钮上都出现了一小段文本,文本的内容介绍这个按钮的功能,对于初学者而言,在按钮上显示提示文本是一个不错的选择。

    观察菜单中有一个菜单项FLOATING,这个菜单项很有用,选中它,可以发现工具条变成了一个浮动在窗口上的小窗口,单击并拖动标题栏,就可以把小窗口放在任意的地方,通过这种方式你可以把工具条放在合适的地方。

    在弹出的菜单中有一个名为CUSTOMIZE的菜单项,选中它,系统弹出一个对话框,用来往当前的工具条中增加或者减少按钮(图3-2),对话框中的第一个单选按钮组合框中POWERBAR按钮被选中,表示当前是对POWERBAR类型的工具条进行定制。注意PAINTERBAR的单选按钮,代表另一种类型的工具条,主窗口左边的工具条就是一个PAINTERBAR类型的工具条。下面介绍定制POWERBAR工具条的有关操作:

    单击SELECTED PALETTE组合框中某个在CURRENT TOOLBAR组合框中没有的按钮,然后拖到CURRENT TOOLBAR组合框中,就为工具条添加了画板按钮,

    相反地,如果把按钮从CURRENT TOOLBAR组合框拖到组合框以外的地方,就从工具条中删除了这个按钮。

    除了可以在工具条中增减系统原有的画板按钮,POWRBUILDER提供了更强大的定制工具条的功能,在对话框中选中CUSTOM单选按钮,在SELECTED PALETTE组合框中出现一些图标,选中其中的一个图标并把它拖放到CURRENT TOOLBAR组合框中,系统弹出一个名为按钮TOOLBAR ITEM COMMAND的对话框,在对话框的COMMAND LINE一栏中输入一个可执行文件的名字,这里不妨利用BROWSE按钮选中WINDOWS系统自带的写字板程序WORDPAD.EXE,然后单击OK按钮,这样就为刚加入的按钮连接上一个可执行程序,单击OK按钮关闭CUSTOMIZE对话框,可以发现被定制的工具条上多了一个由我们自己添加的非系统按钮,用鼠标单击它,就可以启动它所连接的可执行程序。

图3-2

    关于工具条的操作已经介绍了不少了,最后学习一下如何增加一个工具条,

    在工具条单击鼠标右键,弹出的菜单中POWERBAR1和PAINTERBAR1代表系统当前所打开的工具条。

   单击菜单中的NEW菜单项就可以生成一个新的工具条,单击后系统弹出一个题为NEW TOOLBAR的对话框,要求用户为要创建的工具条选一个名字,比如选PAINTERBAR2。

    系统接着弹出一个题为CUSTOMIZE的对话框,此后就可以用和前面类似的方法来定制新创建的工具条。

PowerBuilder是目前流行的客户/服务器结构下客户端应用程序的开发工具。做为一种开发工具,PowerBuilder给程序员提供了一个非常友好的图形化界面的开发环境,使得程序员可以方便地开发出访问数据库的应用程序。

  PowerBuilder是一种面向对象的开发工具,对象在PowerBuilder中是一个核心的概念,PowerBuilder中的对象都是放在对象库中,一个应用程序可 以有一个或者多个对象库,还可以使用其它应用程序的对象库中的对象,以提高软件的复用率,PowerBuilder提供了非常好的管理对象库中对象的工具。在集成环境下,画板同样是PowerBuilder中的一个很重要的概念,PowerBuilder所有的对象都可以通过画板来创建和修改。下面就进入POWRBUILDER集成环境来详细介绍集成环境。

  启动PowerBuilder后,就进入了PowerBuilder的集成开发环境。可以看出这个集成环境和其它WINDOWS应用程序的界面是类似的(图3-1)。在启动了POWRBUILDER后,系统自动打开前一次所开发的应用程序,观察主窗口的标题,接着PowerBuilder后的字符串就是系统当前打开的应用对象的名字。在菜单的下面是工具条,在POWRBUILDER中有几种不同类型的工具条,菜单下面的这个工具条被称为POWERBAR工具条,工具条上放置的图标被称为画板按钮,使用鼠标单击画板按钮可以打开相应的画板,使用画板可以完成大多数开发工作。POWRBUILDER的工具条是可以根据自己的习惯进行定制的,这里先向你介绍如何定制工具条,至于每一个画板的功能在以后的学习中再慢慢了解和认识。

图3-1

在PowerBuilder开发环境中,应用对象是一个极为重要的概念,它是整个应用程序运行时的入口点,可以说所有的开发工作都是围绕应用对象展开的,应用对象包含了被开发的应用程序的总体信息和程序中用到的其它对象的有关信息,下面就来详细介绍应用对象的有关操作。

   3.2.1 创建应用对象

   创建一个应用对象的过程如下:

   开发一个PowerBuilder应用程序的第一步就是为应用程序创建一个新的应用对象,单击POWERBAR工具条上的APPLICATION画板按钮系统打开前一次开发的应用程序的应用对象,

  选择FILE菜单的NEW菜单项,系统首先弹出一个对话框用来选择保存新建的应用对象的对象库文件的路径和名字,应用对象一定要存放在对象库中,这里既可以选择一个已有的对象库也可以创建一个新的对象库,作为一个新的应用对象,一般总是创建一个新的对象库来存放它。

    创建好对象库之后,在弹出的SAVE APPLICATION对话框中给应用对象起个名字,然后单击OK按钮,系统提示是否为应用程序创建一个应用模板,所谓应用模板就是应用程序的大致框架,如果为应用程序创建应用模板的话,系统将会为应用程序生成一些最常用的对象和一些对象最基本的事件脚本,这样可以节省程序员开发应用程序的负担,也提高了程序的可靠性。关于模板的作用,在前面的内容中已经有了介绍,但有的时候系统生成的模板与我们所期望的程序结构有很大的差异,无论是否使用应用模板,系统都会创建一个新的应用对象。

  PowerBuilder的应用程序是由窗口,菜单等许多对象组成的,而应用对象则包含了所有这些对象的总体信息,用鼠标单击POWERBAR工具条上的APPLICATION按钮,弹出的窗口中包含的就是当前正在开发的应用程序的应用对象,从这里我们可以了解应用程序的总体结构。用鼠标双击窗口中的应用对象图标,可以发现应用对象就像一个目录一样被扩展,扩展出来的内容就是应用程序所包含的第一级子对象,在有些子对象的前面还有加号,这表示这个子对象中还包含有下一级的子对象,用鼠标双击就可以打开第二级的子对象,使用这样的方法就可以了解当前所开发的应用程序中所包含的所有对象和应用程序的总体结构。

   3.2.2 设置应用对象的属性

   所谓应用对象的属性实际上是指应用程序一些总体上的属性,设置应用对象的属性的过程如下:

   单击PAINTERBAR工具条上的PROPERTIES按钮,就可以对应用对象的属性进行设置和修改。

   在弹出的APPLICATON对话框中选中ICON标签,就可以为应用程序指定图标,单击BROWSE按钮,在系统中为应用程序寻找一个合适的图标,确定后相应的图标就会预显示在对话框中,这样就为应用程序设好了图标。

   接下来为应用程序指定对象搜索路径,我们已经知道PowerBuilder应用程序中包含许多的对象,这些对象都要放在对象库中,PowerBuilder并不要求把所有的对象放在一个对象库中,而且一个应用程序可以同时引用几个对象库中的对象,这样当使用一个对象的时候就存在如何在对象库中搜索对象的问题。单击APPLICATION对话框中的LIBRARIES标签,可以在这个名为LIBRARY SEARCH PATH的编辑框中输入搜索对象库的完整路径,也可以单击BROWSE按钮,然后在系统中选中一个已存在的对象库,确定后系统就把它的路径自动放到编辑框中。应用程序在使用对象的时候系统就会按照编辑框中设置的路径依次在对象库中搜索被使用的对象,如果搜索失败将会出现系统错误。

    观察APPLICTION对话框不难发现其中一半的标签是用来设置字体的(图3-5), TEXT FONT用来设置静态文本的字体。COLUMN FONT用来设置数据窗口中从数据库中取回的数据的字体,LABEL FONT标签是用来设置字段的扩展属性LABEL的字体,HEADER FONT则是指定字段的扩展属性HEADER的字体。而对于每一个字体又包含字体,字的风格,字的大小,字的颜色,字的背景颜色等选项,要指出的是这里设置的字体都是面向整个应用程序的。

   单击APPLICATION对话框中的GENERAL标签,其中包含的是应用程序的最基本的信息,如应用对象名,对象库名,应用程序最后一次被修改的时间等信息。

图3-5

   单击VARIABLE TYPES标签,对话框中显示的是PowerBuilder为应用程序提供的缺省全局对象,每个编辑栏中的文本代表对象的名字,编辑框中的内容代表对象的类型。这里的SQLCA对象我们在前面的程序中使用过,它是事务处理类型,用来为应用程序和数据库通讯服务。SQLDA和SQLSA对象则是在进行数据库存取时使用的,ERROR对象用来记录程序运行期间的出错信息,以方便编程和调试。MESSAGE对象则是用在窗口对象之间传递信息的。

   最后介绍一下应用对象的事件。确定应用对象处于打开状态,单击PAINTERBAR工具条上的SCRIPT按钮,在SCRIPT窗口中的第一个下拉列表框中显示的就是应用级事件(图3-6)。下面介绍几个主要的也是最常用的事件,OPEN事件是在应用程序启动后发生,在这个事件的脚本中主要做程序的初始工作,如给全局变量赋值,打开窗口等,CLOSE事件是在应用程序将要关闭的时候发生,这个事件的脚本是用来处理程序关闭前的善后工作,比如和后台数据库断开连接等。如果程序中调用了IDLE函数,那么应用程序运行时用户在一定的时间里没有使用鼠标和键盘就会触发IDLE事件。IDLE事件的脚本用来处理程序长时间没有输入事件的情况,比如可以在脚本中调用屏幕保护程序。SYSTEMERROR事件发生在程序运行出现严重错误的时候,这时不加以处理的话系统会弹出警告对话框指出问题的所在,我们在这个事件中编写脚本的主要目的是防止因为程序运行错误而导致应用程序,甚至整个系统的瘫痪。

图3-6

  关于应用对象就介绍到这,接下来一节要介绍的是有关数据库方面的知识。即使你对数据库有了一定的了解也建议你学习一下,因为其中涉及到PowerBuilder是如何处理数据库的。

 

    上面介绍了如何定制和使用工具条,接下来再介绍集成环境中的其它一些内容。

   在集成环境的菜单中有一个几乎每一个标准的WINDOWS多文档接口应用程序都有的菜单项WINDOW,当你的程序打开的窗口太多的时候,就可以使用WINDOW菜单中的菜单项来排列你的窗口,在WINDOW菜单中选VERTICAL菜单项,打开的窗口就纵向排列在主窗口中(图3-3),选择HORIZONTAL菜单项,打开的窗口就水平排列在主窗口中,选择LAYGER菜单项则一次只能看到一个窗口,选择CASCADE菜单项则打开的窗口按级联的方式显示在主窗口中。当程序中打开的窗口比较多的时候WINDOW菜单是经常用到的。

图3-3

   目前的WINDOWS应用程序几乎都支持弹出式菜单,刚才在定制工具条时使用的菜单就是弹出式菜单,弹出式菜单提供了一个对象最常用的操作命令,非常有用,比如使用POWERBAR工具条上的WINDOW按钮来创建一个新的窗口,在窗口的空白区域单击鼠标右键,弹出的菜单有两个菜单项,SCRIPT菜单项是用来为窗口的各种事件编写脚本,PROPERTIES菜单项则是用来设置窗口的标题、位置、类型等许多窗口的基本属性的,在使用PowerBuilder开发应用程序的过程中使用弹出式菜单是非常频繁的,特别是在对一个对象不知该如何操作的时候,使用弹出式菜单是一个简便的方法

  最后介绍一下PowerBuilder自带的一个文本编辑工具,在键盘上按SHIFT+F6,系统弹出一个题为FILE OPEN的对话框,用来选择一个文本型文件,如果不想选择文件的话,单击“取消”按钮,这时就可以使用名为FILE EDITOR的窗口进行文本编辑了(图3-4),在使用PowerBuilder的过程中,经常要对一些文本文件进行编辑,如扩展名为INI的系统文件,SQL命令文件等所以文本编辑器还是比较常用的。

图3-4

 

   第四章 PowerBuilder数据库管理

下面的过程说明了对数据库进行操作的一般步骤:

    单击POWERBAR工具条上的DATABASE画板按钮,系统在打开DATABASE窗口的同时弹出SELECT TABLES对话框,用来选择将要被打开的表,列表框中的表是系统当前所连接的数据库中所有的表,选中其中的某个表,比如选择刚才创建的MYTELEBOOK表,然后单击OPEN按钮,相应的表就出现在数据库画板中,然后就可以对这个表进行各种需要的操作了。

   对于后台数据库而言,创建和管理数据库是数据库管理员的事,PowerBuilder不需要干预。但是对于由PowerBuilder自身创建的本地数据库而言,PowerBuilder则提供了全面的数据库操作支持。单击FILE菜单的CREATE DATABASE菜单项后,弹出CREATE LOCAL DATABASE对话框,在这个对话框中选定数据库的存放目录为D:\DATABASE,设定数据库名字为MYDATABASE,然后单击OK按钮,系统就为我们创建了一个新的数据库,同时自动把这个数据库设为系统当前连接的数据库。如果要删除一个数据库,只要在FILE菜单中选择DELETE DATABASE菜单项,然后在弹出的对话框中选择要删除的数据库就可以了。

  从FILE菜单中选中CONNECT菜单项,系统弹出一个子菜单(图4-1),其中的菜单项被分成了两部分,上面部分中的菜单项代表了系统可以连接的数据库描述的名字,数据库描述是用来定义和存放与某个特定的数据库或者数据源相连时所需要的各种参数的,它将在程序进行数据库相连时被使用,为连接工作提供所需要的各种参数。加了选中标记的表示系统当前所连接的数据库来自这个数据库描述。如果我们单击其它的数据库描述,系统将会把这个描述中的数据库设置成当前数据库。CONNECT菜单的下面部分的两个菜单项是非常重要的,它们用于配置数据库的信息。选中PROMPT菜单项,系统弹出名为DBMS的对话框,让用户选择数据库管理系统,列表框中列出的是当前PowerBuilder支持的所有类型的数据库管理系统。这里选择ODBC类型,它最常用,也最具有通用性。选好后单击OK按钮,弹出一个对话框让我们选择数据源(图4-2),也就是数据库的名字,这里显示的数据库都是可以使用ODBC方式访问的数据库,也就是我们刚才选中的ODBC类型的数据库。选择我们以前创建的TELEBOOK数据库,然后单击OK按钮,系统就连接到被选中的数据库并打开SELECT TABLES对话框用来选择数据库中的表,从这里开始就可以对当前的数据库进行你需要的操作。关闭SELECT TABLES对话框,单击FILE菜单,然后选中CONNECT菜单项,可以发现这是它的子菜单中没有一个处于选中状态,也就是说没有一个数据库描述被选中,这是因为此时我们没有利用数据库描述来间接连接数据库,而是采用交互的方法直接选中了一个实际的数据库并打开它。

图4-1

图4-2

   接下来选中CONNECT菜单的SETUP菜单项,弹出名为DATABASE PROFILES对话框(图4-3),这个对话框用来配置数据库描述,对话框中列出的是系统当前已有的数据库描述的名字,选中其中的某一个,比如这里选中先前创建的TELEBOOK数据库描述,然后单击EDIT按钮,系统弹出DATABASE PROFILE SETUP对话框(图4-4),利用这个对话框就可以对数据库描述进行编辑和修改,看一下对话框中比较重要的几项,PROFILE NAME栏用来给当前的数据库描述起一个名字,DATASOURCE一栏是非常重要的,其中包含当前的数据库描述所对应的数据库的名字,它决定了将来选中这个数据库描述启动的是哪个真正的数据库。设好数据库描述后单击OK按钮,又回到了DATABASE PROFILES对话框,这次单击NEW按钮,在弹出的对话框中设置数据库描述,即取名为TEMP,列表框中显示的是系统已存在的数据库,比如从中选择TELEBOOK,然后单击OK按钮,就为新建的数据库描述TEMP定义好了所连接的实际数据库。从这里可以看出,几个不同的数据库描述,比如这里的TELEBOOK和TEMP,可以指向同一个数据库,这样为数据库的共享提供了便利。如果要删除一个数据库描述也是非常方便的,在DATABASE PROFILES对话框中选中要删除的数据库描述,然后单击DELETE按钮,就删除了这个数据库描述,以后就不可以用这个数据库描述来连接数据库,关闭对话框后观察FILE菜单的CONNECT菜单项的子菜单,可以发现已经没有了刚才被删除的数据库描述。有一点要注意的是,删除一个数据库描述对它原来所连接的数据库本身是不会有任何影响的,它依然可以被其它的数据库描述所连接。

图4-3

图4-4

 

上面主要讨论了对数据库的操作,接下来就来介绍表的操作。

    单击POWERBAR工具条上的TABLE画板按钮,就可以开始对系统当前所连接的数据库中的表进行操作了,系统当前弹出的是名为OPEN TABLE的对话框,利用它可以打开一个已有的表,在对话框的底部有两个复选框,第一个被选中时将把所有的系统表格都显示在对话框中,第二个复选框被选中时表示选中的表将以只读的方式打开,这样可以保证表不被随意地修改。

    单击OPEN TABLE对话框中的NEW按钮,在弹出的CREATE TABLE对话框中就可以定义表的各种信息,因为在前面我们介绍过如何创建一个表,这里就不再举例子,只说明一下对话框中所有栏目的含义,以便于你在定义表时知道该如何使用这些选项。在对话框的上部分是用来定义表的基本信息,其中COLUMN NAME用来定义字段名,DATA TYPE定义字段的数据类型,WIDTH定义字段的数据宽度,DEC用来定义当字段为数值型时的小数位数,NULL栏用来定义这个字段是否可以取空值,也就是是否可以不取值,DEFAULT栏用来定义这个字段的缺省属性,一般情况下就设为NONE,在对话框的下部是用来定义字段的扩展属性,其中FORMAT栏用来定义字段的显示风格,EDIT用来定义字段的编辑风格,VALIDATION一栏用来定义字段值的有效性检查规则,JUSTIFY定义字段的对齐方式,分左对齐,右对齐,居中对齐三种方式。HEIGHT和WIDTH分别用来定义字段显示时字段显示的高度和宽度。INITIAL则是用来定义字段的初始值,也就是在我们创建一条新记录时系统会自动给这个字段赋的初值。HEADER和LABEL栏分别用来定义字段的题头和标签,它们一般用在显示数据的时候标明是哪一个字段的值,最后一项COMMENT栏是用来输入有关这个字段的辅助信息,以便于以后查看方便。要指出的是这里的有些项,比如EDIT,FORMAT等只能从下拉列表框中选择,如果没有合适的选项,就需要在定义好表之后再为相应的字段创建新的编辑风格,显示风格等。

   把先前创建的表MYTELEBOOK打开到DATABASE画板中,在表的标题上单击鼠标右键,系统弹出一个菜单(图4-5),菜单的第一项CLOSE是用来关闭这个表。菜单的第二项ALTER TABLE用来对表的定义作出一些修改,选中这个菜单项后系统会弹出ALTER TABLE窗口用来对表的一些属性作修改,在ALTER TABLE窗口中有一些属性,如字段的类型等是灰色显示的,这表示这些属性是不能修改的,否则会影响表中的已有数据和产生其它负面影响。所以系统不允许修改。弹出的菜单的第三项是PROPERTIES菜单项,用来设置表的总体属性。选中这个菜单项,从弹出的对话框的标签可以看出在这里可以定义表的主键,对表的注解,还有表中显示的数据的字体等。弹出菜单的第四项是NEW,它又有两个子菜单项,选中INDEX子菜单项,弹出CREATE INDEX对话框,在这里可以定义表的索引字段和索引的名字,定义索引的好处是可以加快从表中搜索数据的速度,NEW菜单的第二个子菜单项FOREIGN KEY 是用来定义表的外部码,所谓外部码就是当前表的一些字段的组合,这些字段的组合同时又是另一个表的主键。弹出的菜单的第五项DROP TABLE的作用是删除表,建议不要轻易删除一个表,因为删除后就不能恢复了。弹出的菜单的第六项EDIT DATA用来对表中的数据进行操作,例如往表中增加记录等。菜单的第七项是有关数据管道的内容,放在以后介绍。菜单的最后一项PRINT DEFINITION被选中后将在打印机上打印出当前表的定义,打印的格式类似表定义时的格式。

图4-5

   用鼠标右键单击表的任一字段,弹出的菜单包含DEFINITION和PROPERTIES两个菜单项,DEFINITION菜单项的作用是在弹出的ALTER TABLE窗口中对选中的字段修改它的某些被允许修改的属性,当然你也可以利用这个窗口修改其它字段的某些属性。选中PORPERTIES菜单项后系统弹出名为COLUMN的对话框,利用这个对话框可以为字段添加注释,改变题头和标签,定义字段的显示风格,编辑风格,有效性检查规则等,在定义字段的某些属性——如显示风格时——如果没有所需要的选项,这时就可以利用单击NEW按钮来创建一个新的选项,如新的显示风格等。

上面介绍了对数据库中的表的操作,下面要介绍的是数据库中一个很重要的对象--视图的有关操作。视图并不是真正的表,也没有自己的数据。它的数据可以来自一个或多个数据库中的表和视图。使用视图的好处在于隐藏数据库中表的真正结构,只向用户提供需要的并且有访问权限的字段,这样既方便了用户,同时也可以保证数据库中表的安全性。接下来就来创建基于我们以前创建的表MYTELEBOOK的视图,虽然这里创建的视图是基于一个表的,比较简单,但还是能说明对视图的基本操作。

   首先确定当前系统连接的数据库为先前创建的TELEBOOK,然后单击PAINTERBAR工具条上的CREATE VIEW画板,系统在打开名为VIEW的窗口之后,又弹出一个名为SELECT TABLES的对话框,用来选择要创建的视图所基于的表和视图。

   选择一个以前创建的表MYTELEBOOK,然后单击OPEN按钮,系统关闭对话框并回到打开的VIEW窗口(图4-6),在这个窗口中就可以定义具体的视图了。观察VIEW窗口,其中的表正是刚才选中的用来创建视图的表MYTELEBOOK。前面已经说了,视图是逻辑上的表,它的字段来自创建它的表和视图,比如单击表MYTELEBOOK上的NUMBER字段,它就出现在窗口上部的SELECTION LIST栏中,表示这个字段已经被选中作为视图的一个字段,用类似的方法可以选择其它的表中的字段加到视图中。

图4-6

   要注意的是视图的字段可以是表中的若干字段通过运算后得到的结果,我们叫它计算字段,下面就来为视图定义一个计算字段,单击窗口下部的COMPUTE标签,在COMPUTED COLUMNS栏中输入计算字段的计算表达式,这里不妨输入“HOME-ADDRESS+STRING(POSTCODE)”,输入的内容的意思是使用STRING函数把数值型的邮政编码字段POSTCODE转换为字符串类型后与同样是字符串类型的家庭地址字段HOME-ADDRESS的值相连,作为计算字段的值。然后我们在ALIAS栏中给这个新建的计算字段起个字段名为ADDRESS 。事实上创建一个视图就是使用SQL语言的SELECT语句从表中过滤出有效的字段和记录作为视图的数据。

   使用窗口的下部的SORT,WHERE,GROUP,HAVING等标准的SELECT查询语句的语法标签可以设置查询条件。这里就不再为视图添加查询条件了,单击SYNTAX标签,标签下面的工作区中列出的就是系统按照刚才的要求自动生成的创建视图所需要的SQL语句。

   单击PAINTERBAR工具条上的RETURN画板,弹出SAVE VIEW DEFINITION对话框,为新创建的视图起个名字,这里不妨给它起名为MYTELEVIEW,然后单击CREATE按钮,本地数据库管理系统SYBASE SQL ANYWHERE就根据SQL语句自动生成视图MYTELEVIEW,创建好的视图显示在数据库窗口中,它有四个字段直接来自表MYTELEBOOK,而字段ADDRESS则来自得到的计算字段。这样一个数据库中的视图就创建好了。

   对程序员而言,操作数据库中的表和视图没有多大的区别,但由于视图中并没有数据,它的数据完全来自于它所基于的表和视图。所以对视图的操作最终将是对视图所基于的表的操作,由于一个表可以创建出多个视图,另外也由于要保持数据库中的数据的安全性和数据完整性,所以对视图的操作有一些限制,在刚创建的视图MYTELEVIEW的标题上单击鼠标右键,系统弹出一个菜单,其中的菜单项就是我们可以对视图可以进行的一些操作,我们可以删除,关闭视图,也可以对视图中的数据进行操作等。但与表不同的是,我们不可以重新定义一个视图的字段,如果确实需要的话,只能再重新创建一个视图。此外视图也没有表所具有的索引和外部码。事实上这些东西对于视图而言也是没有意义的。

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/huang714/article/details/90166871
6.5
今日推荐