PowerBuilder应用开发系列.doc_第1页
PowerBuilder应用开发系列.doc_第2页
PowerBuilder应用开发系列.doc_第3页
PowerBuilder应用开发系列.doc_第4页
PowerBuilder应用开发系列.doc_第5页
已阅读5页,还剩243页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

此文档收集于网络,如有侵权,请联系网站删除PowerBuilder应用开发经验篇PowerBuilder应用开发系列(1)数据库的事务管理 在数据库中,所谓事务是指一组逻辑操作单元,使数据从一种状态变换到另一种状态。为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元:当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应全部视为错误,所有从起始点以后的操作应全部回退到开始状态。 对事务的操作是这样进行的:先定义开始一个事务,然后对数据作修改操作,这时如果提交(COMMIT),这些修改就永久地保存下来,如果回退(ROLLBACK),数据库管理系统将放弃您所作的所有修改而回到开始事务时的状态。此外有些数据库支持事务的存储点(savepoint)这一概念:即在一个事务进程中任意一点您都可以进行当前状态的存储,回退时只是回到你所设定的存储点,而不必退回全部的事务。如果您的事务可以分成几组对数据库的修改,那就可以设置多个存储点,根据需要您可以回退到任意一个存储点,而不使所有事务的修改数据全部丢失。 正确地管理事务可以保证数据的完整性,当您所做的工作全部完成和得到确认之前,没有任何数据物理地写进数据库。让我们来看这样一个实例,我们有这样一个银行应用系统,前台使用者作出将储户甲的一百元存款划归储户乙帐下的操作;在后台的数据库中,这两个客户的记录分储在两张表中,当使用者在屏幕上作出如上操作时,在后台需要对两张表进行修改。如果在数据库中对甲用户存款余款作减去一百元修改后,对乙用户加一百元的操作修改却失败时,前一张表也必须回到修改前的状态,否则数据库的内容不统一,甲储户白白损失一百元,信息必然是不正确的。因此进行事务管理是必须的。 传统地,我们认为一个事务包括了对一个或多个表的修改,而随着分布式数据库和数据仓库的发展,事务可能包括了对一个或多个数据库的修改。在上例中甲乙两用户就可能是异地用户,信息分储在不同地域的不同数据库中,上述的一个事务就涉及到了对不同数据库的操作。 PowerBuilder中的事务管理 作为数据库的前台开发工具Power-Builder支持事务管理的操作。在Power-Builder中有一种称作事务(transaction)的对象,这个对象是PowerBuilder应用与数据库的通讯区域。PowerBuilder在应用开始时建立一个全局的事务对象SQLCA。由于大多数的应用只用到一个数据库,所以一般开发者主要也只用SQLCA作为与唯一数据库连接的事务对象。 PowerScript中常用的事务管理的语句有四个:COMMIT,ROLLBACK,CONNECT,DISCONNECT。 当您需要应用与数据库建立连接时使用CONNECT这一操作命令,取消连接时执行DISCONNECT,这两个命令一般分别用在应用的开始和结束,也就是Appli-cation的Open和Close事件中。 当一个事务的数据库修改都成功地完成后,修改须提交给数据库,COM-MIT语句是一个旧事务结束和一个新事务开始的界线。在修改被提交前,数据库的数据并没有被真正地修改,这些修改被保留在某个工作区,只有作修改的用户才能看到这些被修改后的值,提交之后,则所有的用户就都可以看到新值了。 在事务的进程中发生某些错误,或者在操作中出于种种原因打算中止事务,须用ROLLBACK命令回退事务,如果已作的操作不用ROLLBACK命令取消,这些操作必将错误地作为下一个事务的一部分而导致数据库的混乱。 如果您使用的是多窗口的应用,却只用一个事务对象,就应格外注意ROLL-BACK和COMMIT会影响事务的逻辑一致性。在某个窗口执行的这两个指令会使其他窗口应用中所进行到一半的工作提交或回退。 在多用户系统中,修改和提交的时间越接近,提交成功的可能性就越高。因为一个事务中所有的SQL语句全部执行成功而提交却失败是完全可能发生的,例如在您的事务过程中,另一个用户修改了数据并提交,这很可能使您作出的修改无效,这时COMMIT将失败,您必须回退这一事务的全部。 事务对象的AutoCommit属性 事务对象有一个AutoCom-mit的属性可以使开发者简化对事务管理的操作,这一布尔型的属性可以用TRUE或FALSE来对其赋值。当其为真时,PowerBuilder不通过其他额外的交互就将您的SQL语句传输给后台数据库,而且执行完毕自动提交。 当然,您可以设置AutoCommit属性为假(缺省值),使用COMMIT或ROLLBACK这样的关键词提交或回退事务。在大多数应用中,一部分的数据库操作是要成组提交的,而另一些则不用。因此我们可以利用AutoCommit的特性来确定事务的起点,当我们把AutoCommit的属性设为False时,系统设定此时为事务的起点。当AutoCommit设为真时,系统自动消取这一事务。因此你可以先把AutoCommit设为真,当您需要开始一个事务时,将其置为false,此刻即为事务起始点。 PowerBuilder内部这种事务管理的最大优点是方便。您不去考虑整个事务,而只需把您所作的修改提交或滚回即可。但是方便与可控性总是矛盾的,在Power-Builder中没有存储点和嵌套事务管理的机制,即使您所使用的数据库支持这些特性,在PowerBuilder中却无法得以体现。不过在普通的应用中,存储点和嵌套事务管理并不是必须的,一般的事务管理足以够用。 用数据库的事务管理指令实现完全控制 上述的事务管理方式尽管简单方便,但是在某些应用中,我们也的确需要利用所用的数据库系统的嵌套事务和存储点的特性,而PowerBuilder内部的事务管理没有提供这样的功能,您必须自己设计。 自己进行事务管理的方式是直接使用数据库本身的事务指令。当您使用自己的管理方式时,就应使Power-Builder停止管理事务,即设置Auto-Commit为TRUE,系统内部就不会自动建构事务处理的命令了。实现人工事务管理的方式是采用EXECUTE IMMEDIATE这条PowerBuilder指令来执行任意的数据库操作。你所需做的是将数据库指令编辑成一个字符串,您可以执行任何的数据定义语句如建表、建主键、存储过程等,例如您可以用 EXECUTE IMMEDIATE BEGIN TRANSACTION trans-name 这样的指令开始一个事务。采用这种方法,只要您所用的数据库支持嵌套事务和存储点等事务管理,我们通过PowerBuilder开发出的应用也就同样可以实现。 在PowerBuilder中提供的事务管理的方法是多种多样的,只要您灵活运用,就一定能设计出优秀的数据库应用来。PowerBuilder应用开发系列(2)调用Windows的动态链接库 许多熟练使用C的程序员在使用PowerBuilder时都希望自己以前在C上做的工作可以被PowerBuilder引用,这是完全可以的。在PowerBuilder中你可以通过外部引用函数的形式来调用动态连接库中的函数。 PowerBuilder调用DLL程序使用规则 PowerBuilder可以支持任何一种非PowerScript编写,并存储在动态链接库中的外部函数或过程的调用。但外部函数的参数必须是符合Pascal规则的(即参数压栈顺序从前至后)。 在函数调用前,因先作函数声明,PowerBuilder支持以下两种外部函数类型: 全局函数:可以在应用的任意位置调用; 局部外部函数:在window,menu,user object或用户自定义函数等对象中定义。 外部函数声明的语法是: AccessFUNCTION ReturnDataType Function-Name(REFDataTypel Arg1,.,DataTypeN ArgN)LIBRARY LibName 外部过程声明的语法是: AccessSUBROUTION Subroutine(REFDataType1 Arg1,.,DataTypeN ArgN) 如果您使用的是局部外部函数的声明,您还可以指定对象的访问权限:Public,Private,Protected。对局部函数权限访问的限制同对对象的实例变量的限制相同。您可以指定对象名加函数名的方式调用外部函数: object.function(arguments) 如在window的w_emp上调用局部外部函数Recog(),就可这样使用: w_emp.Recog() 如何在PowerBuilder与DLL之间传递参数 在PowerBuilder的script中调用DLL中的函数,缺省情况下是通过传值法来传递参数(passed by value),也就是说PowerBuilder将对要传递的参数做一份拷贝,然后通过堆栈将这份拷贝传递给函数。如果你希望DLL中的函数可以改变调用参数的原值,就可以通过参考传值法(passed by reference)来传递参数,即在参数类型前面加REF关键字来声明该参数将要用参考传值法。 在使用DLL时有一些基本规则 在MS Windows中,一个DLL在被装入内存后,只会有一个实例,不会因为多个程序使用同一个DLL而在内存中产生多个DLL拷贝。每个DLL只有一个最大为64K的数据段。缺省情况下,PowerBuilder都是使用传值法来传递参数。当你在函数应用说明时使用了REF关键字,PowerBuilder将传递一个32位的地址指针(段地址+偏移量)给被调用的函数,而不是只传递偏移量,这才能保证DLL中的函数能得到PowerBuilder中数据的正确地址。在PowerBuilder中使用的数据类型与C语言支持的数据类型不尽相同,C中不支持的数据类型应在调用前先行转换。 对于结构,要在C和PowerBuilder中做相等的说明。 PowerBuilder不支持函数指针的传递,因此在PowerBuilder中不能使用回调函数(callback funcion)。如果DLL的参数需要空指针(NULL),你可以向函数传递一个值为0的长整型。 Windows中使用的有些数据类型C中并不支持,但一般在C的预编译器中用TYPEDEF作预定义,同PowerBuilder接口也应当作适当转换。 使用DLL的常见错误和需要注意的地方 1.导致保护性错(general protection fault) 在Windows中,如果你企图访问不是属于你的应用程序的内存将导致保护性错。导致保护性错的原因可能有以下几点: a.向DLL中的函数传递了不正确的参数。这种错误是比较难调试的,因为PowerBuilder的调试器不能跟踪到C程序中。你可以通过在C中使用MessageBox函数显示调用参数的方法来检查参数传递的正确性。更全面的方法是使用Windows的调试版本(带有调试信息的Windows环境)和功能更强的调试器(Soft-ice for windows或CodeView等); b.C中对数组的访问超出了PowerBuilder中申请的边界。在C中是不作数组边界检查的,这可能是导致保护性错的最常见的原因; c.使用了已经释放的内存指针。你最好把已经释放的内存指针置为NULL,以便在使用前进行判断。 2.使用远指针 在C中,所有的静态变量和全局变量都是在程序的数据堆中分配的,其他变量都是在栈中分配的。DLL可以有自己的数据段,但是它没有堆栈段,使用的是调用程序的堆栈。这就意味着寄存器DS指向的是DLL数据段,SS指向PowerBuilder应用程序的堆栈。而一般的Windows应用程序中,DS和SS是相同的,你可以使用近指针,但在调用DLL中引用远堆的变量必须使用32位的远指针。如果使用任何与内存寻址有关的C函数,都要使用C中的far版本。例如字符串拷贝函数,应该用_fstrcpy而不要用strcpy。 3.注意静态变量的使用 无论有多少实例调用同一个DLL,在内存中只有一份DLL代码。由于Windows是多任务的环境,因此DLL中的静态变量可能由于其他实例对此DLL的调用而改变。 4.不要试图共享文件句柄 在Windows环境下,不可能在应用程序和DLL间共享文件句柄。每个应用有各自的文件句柄表,如果两个应用通过一个DLL来访问同一个文件,它们必须分别打开这个文件。 5.及时释放使用过的资源 如果你的DLL中使用了GDI对象,一定要及时释放它们,否则会使Windows因申请GDI资源失败而死机;例如你建立了一个逻辑字体或逻辑笔,在使用完后,要用DeleteObject来删除它。 6.为使PowerBuilder应用在Windows环境下正常运行,DLL应放在下列目录之中: 当前目录 Windows目录 Windows System目录 在DOS的路径中包括的目录PowerBuilder应用开发系列(4)并发控制 并发能力是指多用户在同一时间对相同数据同时访问的能力。一般的关系型数据库都具有并发控制的能力,但是这种并发功能也会对数据的一致性带来危险。试想若有两个用户都试图访问某个银行用户的记录并同时要求修改该用户的存款余额时,情况将会怎样呢?我们可以对PowerBuilder中的DataWindow进行设置来进行并发控制。所谓并发控制就是指在用户数据修改的过程中保证该数据不被覆盖或改变的方式,在下面的例子中我们将看到如何设置DataWindow来控制开发访问。为了说明问题,我们举这样一个简单的银行系统中的例子,某用户的存款状况如右: 我们假设事情的经过是这样的:公司的某员工在银行前台取款2,000元,银行出纳查询用户的存款信息显示银行存款余额20,000元;正在这时,另一银行帐户转帐支票支付该帐户5,000元,机器查询也得到当前用户存款20,000元,这时银行的出纳员看到用户存款超过了取款额,就支付了客户2,000元并将用户存款改为18,000元,然后银行的另一名操作员根据支票,将汇入的5,000元加上,把用户的余额改为25,000元,那么数据库管理系统是否可以接受这些修改呢? 在DataWindows的设计中,我们选择菜单Rows|Update,会出现Specify Update Characteristics的设置窗口,在这个窗口中我们设置Update语句中Where子句的生成,以此来进行开发控制。在这里有三个选项,我们分别看一看在本例中这三个选项的结果: (1)Key Columns:生成的Where子句中只比较表中的主键列的值与最初查询时是否相同来确定要修改的记录。在上述的例子中,转帐支票的操作将覆盖出纳员作出的修改,这样银行损失两千元。 (2)Key and Updateable Columns:生成的Where子句比较表中主键列和可修改列的值与最初查询时否是相同。在上例中两次查询出的结果都是有两万余额,当第一个人修改余额时,余额仍是二万元,所以修改成立,而支票转帐操作时余额已不是二万,所以该列不匹配,修改失败。 (3)Key and Modified Columns:Where子句比较主键和将要修改的列,在本例中,结果与Key and Updateable Columns的选择相同,因为余额已改变,不再与最初的查询相同,因此仍然不能修改。 让我们作另外一个假设,我们把银行后台作支票转帐操作改为冻结用户存款,即把状态字段的值改为冻结,而且事件发生的次序如下表,那么表中的次序4前台出纳的修改能不能成立呢: 1.Key Columns:Where子句只比较主键值,显然出纳员的修改是允许的。 2.Key and Updateable Columns:生成的Where子句包括比较所有可修改的列,因此出纳修改时Statue字段为冻结与出纳查询时的tive不符,修改失败,同时显示错误信息。 3.Key and Modified Columns:Where子句的比较包括主键和要修改的列,由于本列中修改列仍为20,000元没有变化,所以出纳的修改可以成立。 在本例中,我们可以看到Key and Updateable Columns的选项最严格,可以避免出现状态列发生改变时余额作修改的错误,但是这也会禁止我们作一些本当允许的并发修改,如出纳修改存款余额,而业务员修改用户的联系地址等。因此我们应当根据实际情况,选择适当的Update设置。 根据我们使用数据库的不同,我们还有一些其他的控制并发访问和修改的选择方案,如对数据加锁。锁是一个用户避免其他用户对指定行作修改的操作。在结束一个事务如执行commit,rollback,disconnect等语句时自动将锁释放。如果您使用的DBMS支持锁的操作,在Power-Builder的DataWindow设计时,Select语句可在from子句中加上with holdlock:即在data Window的SQL Window中,在表窗口的标题处点击右鼠标,弹出菜单的最后一个选项即为Holdlock。选择该项,生成的SQL语句将在re-trievel()函数执行后将所查询的数据加锁,以避免其他用户的修改访问,直至commit,rollback等事件发生后解锁。这种方式带来的问题是,当用户查询完数据后可能离开计算机长时间不用,这段时间内其他用户均无法修改数据。此外有些DBMS如Sybase等不支持行级锁,也就是说当你对某一行查询时更多的行都被上了锁,这就更增加了并发处理的局限性。另一个值得注意的问题是在多窗口应用中某一个窗口的事务提交将会导致使用一事务中其他数据窗口的查询行解锁,这时修改将可能发生错误。某些DBMS系统支持一个称作时间戳(timestamp)的数据项来控制并发性。每张表中都有一个时间戳的数据列,当Insert语句或Update语句对数据行作修改时该列自动被修改为当前时间。当你要作修改时,where子句可检查时间戳列在查询时和修改时两个值是否相符,以此来确保您作出的修改不会覆盖别人的修改,因此这种确认方式与key and Updateable Columns选项相同。即使两个用户对同一行的不同列作修改,后一个修改者也将失败。在常用的关系型数据库中Sybase和Microsoft的SQL Server支持时间戳的使用。而在PowerBuilder中,不管用户后台连接何种数据库,只要表中带有timestamp的列名且数据类型为datetime,PB将自动忽略Update characteristics的选项,而在where子句中生成主键和时间戳列的比较。 如果您所用的数据库不支持时间戳但支持触发器,您也可以在表中增加一列整数型的列。当有对表中某种记录作修改时,该列自动加1。下列使用的是Watcom数据库,对Shipper表增加Updcnt字段并作两个触发器,这样任何用户或进程试图修改某行记录时,该字段均可发生变化。 对INSERT触发器的编写如下: DROP TRIGGER INSSHIPPER CREATE TRIGGER SHIPPER BEFORE INSERT ON SHIPPER REFERENCING NEW AS Newvalue FOR EACH ROW BEGIN SET newvalue.UpdCnt=newvalue.UpdCnt+1; END 同理可编写UPDATE触发器。 在您的PowerBuilder应用之中,除表的主键外,必须再加上这一列作为检测列加入Update语句中的Where子句中,这样再作Update操作时,后台数据库会比较修改时与用户作Retrieve操作时数据是否相等,以确认是否能作修改。在DataWindows中在Specify Update Characteris-tics的对话框的右下角的Unique key column(s)中加上Updcnt一项,同时注意where clause中选择Key columns,这样PowerBuilder在构造where子句时就会认为Updcnt亦是表的主键,而成为检测项。 当数据窗口的Update函数被调用后,触发器将修改过记录中的Updcnt列表为新值,为保证下一次修改能够有效,您应当立即作Retrieve()以使DataWindow缓冲区中Updcnt的值与数据库相同。显然修改后立即查询的代价要比其他任何一种并 发控制的代价要小得多。PowerBuilder应用开发系列(5) DataWindow的打印输出 在PowerBuilder应用程序的开发中,各种报表的打印功能是必不可少的。Power-Builder4.0提供了大量与打印机进行通信的内部函数,用于各种打印输出。运用这些函数,您不仅可以打印常见的DataWindow对象,还可以打印字符串、位图、图形对象,甚至是全屏。 DataWindow的两种打印方法: 在PowerBuilder中我们可以有两种方法打印DataW-indows。一种最简单的方法就是直接地将DataWindow提交给打印机,另一种方法是将大量的DataWindow(或混合其他的对象)放在一起作为一个单一的打印作业提交输出。 法一:不指定打印作业,而发送一个单一的DataW-indow。将报表传给打印机输出的最简单的方式是使用DataWindow对象的Print()函数,您只需简单指明您打印的DataWindow控件的名字就可以得到该DataWindow生成的报表了。例: dw_data.print(cancel dialog) Print()函数不需要任何参数,但是它有一个可选参数,可以控制PowerBuilder是否显示Print Cancel对话框窗口(缺省为自动出现,如图1所示)。Cancel dialog参数是一个布尔型变量,其缺省值为真。 一 Print:HP LaserJet HP on LPT1: Preparing page 1 of 2 Cancel 图1:除非特别指定,否则将在打印时缺省出现Print Cancel对话框。Print()函数还有一些格式可控制打印正文字符串,但是它们要求首先打开一个打印作业。这些格式将在后面解释。 法二:集成多个DataWindow作为一个打印作业。您可以将提交打印的多个DataWindow作为一个单一的打印指令。为实现这一功能必须打开一个所谓打印作业(Print job),即发送给打印机一个单一工作单元,其中可以包含多个子任务。在PowerBuilder中一个打印作业由它的作业代号唯一指定。我们使用PrintOpen(job name)函数打开一个作业,并得到打印作业号。PrintOpen()函数有一个可选参数,就是打印作业名称,这个作业名字将作为Windows 3.x的Print Manager作业集中的名字。当您使用PrintOpen()函数时,系统将另起一页开始打印。当然在打印作业中,您还可以使用其他函数换页,比如将在后面讲述的PrintPage()函数。 在您打开了一个作业号后,就可以在这个作业内使用下列函数继续其他各种各样的打印项目。 1)在打印作业中加入字符串: 我们也可以使用另外一个与Print()函数略微不同的函数来打印字符串: PrintText(print_job_number,string,x,y,font_number) 这个函数将包含在string参数中的正文字符串当作一个对象进行打印。这个打印的字符串在由X,Y参数(以千分之一寸为单位)指定的坐标处开始。font_number参数是一个可选参数,缺省使用当前字型,否则font_number的值可以从0到8,0是打印机缺省的字型,1-8是使用后面讲述的PrintDefineFont()函数定义的字型。这个函数不像其他指定坐标的函数,它将改变打印光标的位置。这个函数的返回值是打印光标的新X坐标,但它不改变Y坐标。 在打印作业中打印对象 下面的这些函数可以使您在打开的打印作业中打印不同的对象。这些函数中的任一个指定X、Y坐标的函数都不会改变当前打印光标位置。 objectname.Print(print_job_number,x,y ,width,height) 这个函数可以将任何一个object_name指定的对象放在print_job_number定义的打印作业中打印,这个对象可以是一个窗口也可以是一个DragObject类的继承类(包括了所有的窗口控件)。X、Y参数指定了一页中的坐标,您可以指出所打印对象出现的位置(以千分之一寸为单位)。Width和Height参数是可选的参数,用来指明你所需的打印对象的宽和高(仍以千分之一寸为单位)。如果缺省,PowerBuilder将使用对象本身的尺寸打印。 PrintBitmap(print_job_number,bitmap,x,y,width,height) 这个函数将在由X,Y参数(千分之一寸为单位)指定的打印区域上打印一个位图。bitmap参数是一个包含要打印位图的文件名的字符串(例:BRUSH.BMP)。Width和Height参数指定位图显示的宽和高,这个参数并不是可选的。输入0值,意味着位图按它本身的值打印。 PrintDataWindow(print_job_number,datawindowcontrol) 这个函数将一个DataWindow控件的内容作为这个指定的打印作业的一部分来打印。由于Power-Builder使用在DataWindow对象中定义的字型,Print-DefineFont()和PrintSet-Font()函数不对其产生影响。Powersoft建议如用PrintDataWindow,那么在这个打印作业中就不需要使用其它函数。因为这个函数将使用整张纸,每一次调用PrintDataWidnow,您打印的下一项都将另起一页。 PrintLine(Print_job_number,X1,Y1,X2,Y2,thickness) 这个函数将打印一指定宽度的线。这条线将在由X1,Y1参数(以千分之一寸为单位)指定的坐标处开始,在由X2,Y2参数(也以千分之一寸为单位)指定的坐标处结束。thickness参数是一个整型变量,它指定了这条线的宽度,以千分之一寸为单位。 PrintOval(print_job_number,x,y,width,height,thickness) 这个函数打印一个椭圆(如果宽度和高度相同则形成一个圆)它的轮廓线的宽度由thickness指定。椭圆都由一个想象的边框包围,X,Y参数指定了这个界框的左上角的位置(千分之一寸为单位),width,heigh为这个边框的高和宽。 PrintRect(print_job_number,x,y,width,height,thickness) 除了它是打印一个矩形外,这个函数与PrintOval()函数完全一样。 PrintRoundRect(print_job_number,x,y,width,height,thickness) 除了它是打印一个圆角矩形外,这个函数与PrintO-val()函数完全一样。PowerBuilder应用开发系列(6)DataWindow的打印输出(续) 打印控制函数 PowerBuilder提供了一组打印控制函数来控制要交给打印机打印的对象。第一个函数PrintOpen()在这章的前面我们已介绍过了,其它还有: PrintCancel(print_job_number) 这个函数将中止打印作业号所打印的作业,不发送任何内容给打印机。 datawindowcontrol.PrintCancel() 这个函数与上一函数的区别是:这个函数取消的是用Datawindowcontrol.Print()提交的作业。 PrintClose(print_job_number) 这个函数将关闭指定的打印作业并且把它发给打印机(或者假脱机程序)。为了避免挂起打印作业,所有打开的打印作业都应在应用的结束前被关闭或取消。 PrintDefineFont(print_job_number,fontnumber,facename,height,weight,font-pitch,fontfamily,italic,underline) 你可以用这个函数定义字型。Power-Builder允许在一个打印作业中使用八种字型,用这个函数可定义其中的任一个。这个字型所属的打印作业号由Print_job_number参数指定,font_number参数是这个打印作业所采用的字型号(1-8)。其余的参数描述了字型如何显示,是否斜体字、粗体和下划线等。facename参数是一个包含了你所定义的字体名字的字符串(例:courier 100CPI)。height参数是你所需的以千分之一寸为单位的字体的高度(例:250将是一个18点阵courier 10 CPI字体),height参数也可使用一负值来表示点阵数指定点尺寸(例:-18是18点阵)。weight参数值是您所要的字型的笔画权值(例:400是平常正文,700是粗体)。fontpitch参数是一个枚举数据类型,它指定了字体的间距(Default!,Fixed!或variable!);fontfamily参数也是一个枚举类型,指定了字体系列(AnyFont!,Decorative!,Mod-ern!,Roman!,Script!,Swiss!)。这两种参数只在基于Windows的操作系统中使用,在Macintosh等机器中不能使用。italic参数是一个布尔型变量,指定字体是斜体(True)或非斜体(False),underline参数也是一个布尔值,用法同上。 PrintOpen() 这个函数已在这章的开始讲述过了,它定义一个打印作业以便将所有的打印项成组发送给打印机。它的返回值是唯一的打印作业ID,如果返回值为负,则意味着产生错误。 PrintPage(print_job_number) 这个函数将指定的打印作业的当前页传送给打印机(或假脱机程序),并另起一页用于之后的打印集。 PrintSend(print_job_number,string,zero_character) 这个函数在打印作业中发送一个特定的字符串给打印机。这个字符串一般是一个包含转义字符的命令串用来启动或操作打印机。这些打印机的控制代码因打印机的不同而不同,您应查询您的打印机手册来得到正确的代码。 这个与打印机进行通信的字符串应是一个ASCII码集,并以ASCII码0来结束。如果你需要发送ASCII码0,你可以用另外的一个字符来替代0,给定的这个替代字符的ASCII值由可选参数zero-character来指定。这个函数一般用于改变纸的定向(Landscape或por-trait)或者改变打印用的纸盘等。 PrintSetFont(print_job_number,fontnumber) 这个函数设置当前打印机字体,它是你使用PrintDefineFont()函数中定义的八个字体中的一个。 PrintSetSpacing(print_job_number,spacing) 这个函数使用Spacing参数来决定正文行之间的行距。这个值乘以当前字体高得到行距,缺省值是1.2。 PrintSetup() 这个函数调用Windows的Print Setup对话框,实际显示的Setup窗口依赖于你所安装的打印机驱动程序。 PrintWidth(print_job_number,string) 这个函数的sting参数返回字符串的宽度(以千分之一寸为单位)。返回值的大小是依赖于当前选择的字体。 PrintX(print_job_number) 这个函数返回当前打印光标的X坐标(水平)值。 PrintY(print_job_number) 这个函数返回当前打印光标的Y坐标(垂直)值。 除非特别说明,上述函数的返回值1意味着成功,-1意味着失败。 DataWindow控件的打印属性 使用modify函数,我们可以改变DataWindow的打印属性。在打印DataW-indow之前,我们可以调用如图所示的窗口,从而得到我们想让用户设置的参数。这个窗口在PowerBuilder Enterprise的实例库中,您也可以在直接调用它前对其显示界面进行汉化和作适当修改。 例如,我们使用下面语句来改变我们想打印的份数。 dw_data.Modify(DataWindow.Print.Copies=3) 你可以使用PowerBuilder Enterprise打包软件DWSYN40.EXE-DataWindow语法生成器来建立Modify语句。 下面所列的可以修改的参数全部以DataWindow.print为前缀,后接这个属性。 Collate=Yes or No(缺省为no,不作校对) 这个属性用来指示是否要对打印进行校对。校对通常较慢,因为整个打印过程必须反复几次以得到一个校对后的结果。 Color=1(彩色)or 2(单色) 这个属性指示传送给打印输出的是彩色(如果你有一台彩色打印机)还是单色。 Columns=an integer(缺省为1) 这个属性用来指示DataWindow以报纸风格打印在一页上的栏的数量。 Columns.Width=an integer 这个属性指示以报纸风格打印的栏的宽度(基于为DataWindow指定的单位)。 Copies=an integer 这个属性指示你所需的打印的数量。 DocumentName=a string 这个属性可以让你为文件设置一个名字。这个名字在DataWindow传送给打印机时在打印序列中出现。 Duplex=1(单一)or 2(水平)or 3(垂直) 这个属性指示打印输出的方向。 Filename=filename string 这个属性仅当把DataWindow输出为一个文件时才有用。这个属性包含的字符串是将在磁盘中存储的文件的名字。 Margin.Bottom=an integer 这个属性为一整型指示页面下部空白的宽度(用DataWindow指定的单位) Margin.Left=an integer 功能与Margin.Botton相同,但指示的是左侧空白宽度。 Margin.Right=an integer 功能与Mangin.Bottom相同,但指示的是右侧空白宽度。 Margin.Top=an integer 功能与Mangin.Bottom相同,但指示的是顶端空白宽度。 Orientation=0(打印机的缺省设置)或2(横向打印)或3(纵向打印)这个属性用来指示打印定向。你可以使用打印机缺省设置,或者设置成Landscape或Portrait模式,覆盖缺省的打印设置。 Page.Range=page range string 这个属性为一字符串指明你要打印的页数。在字符串中的数字用逗号分隔,或者数字之间用由一横线分隔表示一范围或两者同时使用,例如:1,2,3,6-12,空字符串表示要打印所有的页。 Page.RangeInclude=0(全部打印)或1(打印奇数页)或2(打印偶数页) 这个属性用来指示在Page.Range指示的范围中哪些页要打印。你可以先选择打印偶数页,然后将纸放入打印机中,再选择奇数页打印。这一功能像在打印书时那样,需在纸的两面打印时非常有用。 Paper.Size=an integer 这一属性用来指示打印纸的尺寸。可接受的值如下: 0-缺省 1-Letter 8 1/2 x 11 in 2-LetterSmall 8 1/2 x 11 in 3-Tabloid 17 x 11 inches 4-Ledger 17 x 11 in 5-Legal 8 1/2 x 14 in 6-Statement 5 1/2 x 8 1/2 in 7-Executive 7 1/4 x 10 1/2 in 8-A3 297 x 420 mm 9-A4 210 x 297 mm 10-A4 Small 210 x 297 mm 11-A5 148 x 210 mm 12-B4 250 x 354 13-B5 182 x 257 mm 14-Folio 8 1/2 x 13 in 15-Quarto 215 x 275 mm 16-10 x 14 in 17-11 x 17 in 18-Note 8 1/2 x 11 in 19-Envelope #9 3 7/8 x 8 7/8 20-Envelope #10 4 1/8 x 9 1/2 21-Envelope #11 4 1/2 x 10 3/8 22-Envelope #12 4 x 11 1/276 23-Envelope #14 5 x 11 1/2 24-C size sheet 25-D size sheet 26-E size sheet 27-Envelope DL 110 x 220 mm 28-Envelope C5 162 x 229 mm 29-Envelope C3 324 x 458 mm 30-Envelope C4 229 x 324 mm 31-Envelope C6 114 x 162 mm 32-Envelope C65 114 x 229 mm 33-Envelope B4 250 x 353 mm 34-Envelope B5 176 x 250 mm 35-Envelope B6 176 x 125 mm 36-Envelope 110 x 230 mm 37-Envelope Monarch 3.875 x 7.5 in 38-6 3/4 Envelope 3 5/8 x 6 1/2 in 39-US Std Fanfold 14 7/8 x 11 in 40-German Std Fanfold 8 1/2 x 12 in 41-German Legal Fanfold 8 1/2 x 13 in Paper.Source=an integer 这一属性是一个整型值,指明纸的来源。可接受的值如下: 0-Default 1-Upper 2-Lower 3-Middle 4-Manual 5-Envelope 6-Envelope manual 7-Auto 8-Tractor 9-Smallfmt 10-Largefmt 11-Large capacity 14-Cassette Preview=Yes(进入打印预览状态)或No(缺省-退出打印预览状态) 这个属性允许您的DataWindow进入和退出打印预览状态。这种状态可以所见即所得地看到用户即将打印的结果。 Preview.Rulers=Yes(显示标尺)或No(缺省-不显示标尺) 这个属性是指Print Preview状态下,是否要在DataWindow对象上显示标尺。 Preview.Zoom=an integer 这个属性是Print Preview状态下,为预览的DataWindow指定一个放缩因子。缺省值为100%(Preview.zoom=100%) Prompt=Yes(缺省-显示提示)或No(无提示) 这个属性可以控制PowerBuilder显示一个允许用户在作业打印前取消打印作业的提示。 Quality=0(缺省)or 1(高)or 2(适中)or 3(低)or 4(草稿) 这个属性可以选择打印输出的质量。 Scale=an integer 这个属性指定打印输出放大或缩小的比例。 制作一个屏幕打印:如何打印全屏 PowerBuilder 4.0的一个新特征是可以把屏幕图像提交打印作业,在纸上的任一点打印屏幕。我们使用PrintScreen()函数实现这一功能。 PrintScreen()的语法如下: PrintScreen(print_job_number,x,y,width,height) 执行这一函数,在指定的打印作业中将当前屏在由X,Y参数(千分之一寸为单位)指定的坐标处打印。width和height参数指示你所要的打印屏幕的宽和高。最后这两个参数是可选的,如果缺省,屏幕将按初始的宽度和度打印。PowerBuilder应用开发系列(7)利用SetActionCode函数控制DataWindow DataWindow控件的一些事件有一个动作码操纵这个事件之后的缺省动作。在Pow-erBuilder 4.0中我们可以使用SetAction-Code函数,来设置这个动作码的值以控制在这些事件发生后的处理过程。(在PowerBuilder 5.0中,由于事件可以有返回数值,所以采用返回一个整型数值来取代SetActionCode函数,比如使用return 1取代SetActionCode(1),但基本的使用规则两者是相同的。)DataWindow控件中下列事件使用动作码: CLICKED DBERROR ITEMCHANGED ITEMERROR PRINTPAGE RETRIEVEROW RETRIEVESTART UPDATESTART 有效的动作码值和应当的处理过程随事件的不同而不同。 Clicked Event 无论何时,当用户在DataWindow控件上点击时,CLICKED事件被触发。如果点击在一个有效的行上,那么DataWindow将自动把此行作为当前行。如果你不想换行,就可以使用SetActionCode来停止。 0 进行换行和CLICKED事件。(缺省) 1 停止处理CLICKED事件。 例如:下面一段代码只允许用户点击在自己的用户号上。 /Clicked Event /Well assume there is an instance va

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论