PB11第11章自定义函数和结构(精)
- 格式:ppt
- 大小:902.50 KB
- 文档页数:26
pb的基本函数1、Open 两种格式:一个是带参数的还有一个是不带参数的不带参数的是不确定具体的数据类型的2、Opensheet() opensheet(指定窗口名,{指定要打开的窗口的类型},指定要放置的工作表的框架窗口名,所打开的窗口是在第几个菜单下生产默认值为倒数第二个,打开方式arrangeopen。
) 打开方式分为三种:cascade、layered、original。
Cascade:向右下方偏移。
默认值如果缺少的话Layered:最大化Original:与cascade相同。
只是打开的时候与原来的一样大3、Close4、Setfocus() 将焦点设置到指定控件上Objectname.setfocus() 如果objectname是列表框的话则控件将指向列表框的第一列表项上。
5、SelectText()返回该控件所选的文本。
返回值为long Singlelineeditname.selecttext(start,length)6、GetColumn()和GetColumnname()两个都没有返回值:第一个是返回当前列的列好,第二个则是返回当前列名7、Update()8、DeleteRow()Dwcontrol.deleteRow(row) row表示要删除的行数,当该值为0时则表示删除该行1、insert row 在数据窗口控件指定行前面插入一行dwcontrol.insertrow(row) scrolltorow():使新插入的行成为当前行。
2、ScrollT oRow() 使用方法:rtename .scrolltorow(row)Rtename超文本编辑框的名称。
如果row的值为0的话则就回滚到第一行,如果row的值大于超文本的行数则回滚到最后一行3、selectedColumn()返回插入点后第一个字符的位置rtename.selectedcolumn()4、setcloumn5、print() 以当前字体在打开的打印作业中打印一行或多行文本print(printjobnumber,{tabl},string{,tab2})tab1为文本开始打印的位置,以千分之一英寸为单位。
POWERBUILDER教程第一章概述1.1特点1.事件驱动在事件驱动方式中,程序的运行没有固定的流程,程序的代码也是为各种可能发生的事件编写,当程序开始运行后,它可以接受来自系统、用户或其他应用程序触发的事件,然后执行事件代码。
建立窗口、控件和其他应用部件时都含有一组预定义的事件。
例如:clicked(单击),用户也可以定义自己的事件。
2.面向对象Windows应用程序中常见的窗口、菜单、控件在powerbuilder中都是一个个对象。
同时,也可以创建自己的用户对象。
每个对象都有自身的特征和行为(属性、事件和函数)。
Powerbuilder提供了基础类库PFC,它为应用程序开发提供了许多可重用的预定义类和对象,利用基本类库PFC可以快速开发高质量、重用好的应用程序。
3.Powerscript语言Powerbuilder中,所有的处理逻辑都是用powerscript语言编写,powerscript是PowerBuilder是专用语言。
4.强大的数据库窗口对象数据窗口对象是PowerBuilder中的一种对象类型,是专门为访问后台的数据库服务的,在数据窗口对象中可以定义数据的来源和数据的显示风格,这样在应用程序就可以把精力完全放在程序的流程控制上,而不用关心具体数据的来源。
如果需要使用数据库中不同的数据,也只要对数据窗口对象进行修改就可以。
5.其他特点支持internet、支持分布式应用、支持多平台、支持大多数关系型数据库(Sybase、MS SQLSERVER、ORACLE等等以及ODBC等其他数据源)等等1.2安装略注:升级至7.0111.3开发环境IDE1 菜单栏图标第一章库文件工具栏图标第二章对象编辑工具栏图标第三章库文件编辑区第四章对象编辑区第五章Datawindow编辑器1.4 预备知识一个PowerBuilder应用程序一般由若干个窗口组成,每个窗口有若干个控件(如按钮、菜单、文本等),每个对象或控件都有若干个事件(如按钮的单击或双击等),每个事件将对应一段程序。
编程规范(PB)1简介1.1简介这个文档描述了用于编写稳定、可靠的PowerBuilder应用程序的一些标准、约定和准则。
他们基于合理的,经过证实的一些使代码容易理解、维护和增强的软件工程的原则。
另外,遵循这些标准,你作为一个PowerBuilder程序员的生产力将有一个显著的提高。
一些经验证明,花时间在项目的开始写出高质量的代码,可以使在后来的开发过程中容易修改它,从而事半功倍。
最后,遵循这一系列编码规范,可以使一个开发团队更好地保持一致性,最终必将极大地提高团队的生产力。
1.2最初的准则和最终的准则当你无法找到一些你需要的原则或准则时,或者它们很明显地不适用,或者其它的一些情况下,请使用常识,按照一些基本的原理去作。
这个原则凌驾于其他原则。
2命名规范2.1一般性约定1.使用英文或汉语拼音的全称去准确地描述各种对象、变量例如,ls_UserName (用户名) ,ldc_GrandTotal(总计)等等。
尽管x1,y1这样的名称很容易拼写,因为它们很短,但是他们不可能明确地提示名称的含义,将导致代码难以理解、维护和改进。
2.使用大小写混合的方式命名3.以合适的方式使用缩写例如ll_RownNmber,简写为ll_RowNum是可以理解的,但是li_ReturnCode简写为li_rc就不一定被别人看懂,所以应该以尽量保守的态度使用缩写,在更多的时候使用全称,或者建立常用缩写的对照表。
4.避免太长的名称,尽量限制在15个字母以内长名称虽然很容易懂,但特别长将导致拼写时经常出错。
5.不要在第一个字母和最后一个字母使用下划线6.保持命名的一致性。
相关的东西应给以相关的名字,以说明他们的关系和差异2.2具体约定2.2.1对象命名规范<前缀>_名称注:名称为英文,新建对象必须加注释(菜单对象可例外)。
一般情况下,菜单对象的名称与其所属窗口的名称一致。
例子:w_master , m_master , d_cig_cdu_tvs is the TreeView visual user objectu_dw is the DataWindow visual user objectn_cst_dwsrv is the custom class user object for DataWindow servicesn_tr is the transaction standard class user object and is in the extension level2.2.2变量范围命名规范<范围><数据类型>_变量名范围:对于标准数据类型:例子:as_unitcode 表示事件或函数的输入参数,string类型idc_val 表示实例变量,decimal 类型li_row 表示局部变量,integer 类型gd_firstday 表示全局变量,date类型对于常用参照数据类型(reference variables):例子:datastore lds_unitDataWindowChild ldwc_cigwindow lw_code注:1) 尽量避免使用全局变量。
PB的小技巧1.如何使DataWindow中的数据只能追加新记录而不能修改。
利用Column 的Protect 属性可以很方便的做到这一点,方法如下:将每一列的Protect 属性设置为:If( IsRowNew(), 0, 1) )在PowerScript 中可以动态修改Protect 属性:dw_1.Modify("column_name_here.Protect='1~tIf(IsRowNew(),0,1)'")2. 允许从空的非字符字段跳离string ss = this.dwDescribe(this.GetColumnName()+".coltype")//s = this.dwDescribe("#"+String(this.GetColumn())+".coltype")CHOOSE CASE sCASE "number"IF Trim(this.GetText()) = "" THENint null_numSetNull(null_num)this.SetItem(this.GetRow(),this.GetColumn(),null_num)this.SetActionCode(3)END IFCASE "date"IF Trim(this.GetText()) = "" THENdate null_dateSetNull(null_date)this.SetItem(this.GetRow(),this.GetColumn(),null_date)this.SetActionCode(3)END IFCASE "time"IF Trim(this.GetText()) = "" THENtime null_timeSetNull(null_time)this.SetItem(this.GetRow(),this.GetColumn(),null_time)this.SetActionCode(3)END IFCASE "datetime"IF Trim(this.GetText()) = "" THENdate null_datetimeSetNull(null_datetime)this.SetItem(this.GetRow(),this.GetColumn(),null_datetime)this.SetActionCode(3)END IFEND CHOOSE3. 当我们为Datawindow的每一行显示行号时可以简单的放一个表达式为GetRow() -- 计算列。
PB笔记1、Datastore用法方法一:参照已存的DWstring ls_yhzllong ll_row,ll_row_countdatastore ds_yhzl//声明Datastore变量ds_yhzl = create datastore//将Datastore实例化ds_yhzl.dataobject = "dw_yhzl"//为datastore分配数据窗口对象ds_yhzl.settransobject(sqlca)//指定连接实例ds_yhzl.retrieve()//提取数据destroy ds_yhzl -----释放datastore方法二:自定义sqla.调用自定义函数gf_create_ds:datastore ds4s_cmdtxt=' select distinct pk_org from nc_zz_htdd_head where vdef19 ="'+is_dhhbm+'" and pk_org <>"0001A310000000002TDE" and LEN(pk_org)>3'ds4=uf_create_ds(ds4,s_cmdtxt)if ds4.rowcount()=0 thenmessagebox('提示:','因子公司客户未下单,所以不需操作此功能!')return 0end ifdestroy ds4b.直接定义string ls_syntaxstring ls_err//保存错误string ls_style = 'style(type=grid)'//数据窗口风格,具体查看SyntaxFromSQL函数的pb帮助string s_sqls_sql=’select….’Datastore dsls_syntax = SQLCA.SyntaxFromSQL( s_sql , ls_style , ls_err )if ls_err <> '' thenmessagebox( '出错' , '创建DATAStore出错!' + ls_err )return 0elseds = create datastoreds.create( ls_syntax , ls_err )if ls_err <> '' thenmessagebox( '出错','初始化DATAStore出错!' + ls_err )return 0elseds.SetTransObject( sqlca )ds.retrieve()end ifend if2.自动触发button按钮cb_1.TriggerEvent("Clicked")cb_1是你要触发的空间的名字,Clicked是你要触发那个事件窗口对象名称.控件名称.triggerevent(事件名称)关于事件名称:1.如果事件名称是控件自带的,如按钮的Clicked事件triggerevent(Clicked!)2.如果事件名称是用户为控件定义的,如你自己定义了一个abc事件triggerevent("abc")3.tab切换页时判断是否有数据未保存Tab的selectionchanging事件if dw_1.ModifiedCount() > 0 or dw_1.DeletedCount() > 0 thenmessagebox('提示','尚有操作未保存,请先进行保存操作!',Exclamation!)return 1end ifModifiedCount()和DeletedCount()就是用来检测有没有修改行和被删除行的。
《Rubu基础教程第五版》第⼗⼀章笔记块块(block)就是在调⽤⽅法时能与参数⼀期传递的多个处理的集合。
对象.⽅法名(参数列表) do |块变量|希望循环的处理end或者对象.⽅法名(参数列表) do { |块变量| 希望循环的处理}块的开头是块变量,块变量就是在执⾏块时,从⽅法传进来的参数12 3 4 5 6 7 8 9 10 11 12 13>> ary =("a".."c").to_a=> ["a", "b", "c"]>> ary.each{|obj| p obj}"a""b""c"=> ["a", "b", "c"]>> ary.each_with_index{|obj, index| p [obj, index]} ["a", 0]["b", 1]["c", 2]=> ["a", "b", "c"]>>块的使⽤⽅法在ruby中,我们常常使⽤块来实现循环。
在接收块的⽅法中,实现了循环处理的⽅法称为迭代器(iterator)。
each⽅法就是⼀个典型的迭代器,相当于Python中的iter1 2 3 4>> hash.each {|name| p name} [:a, "b"]=> {:a=>"b"}>>下⾯演⽰了each对hash的操作1 2 3 4 5 6 7sum=0outcome ={"参加费"=>1000, "挂号费"=>1000, "联欢费"=>4000} outcome.each do |pair|sum+=pair[1]endputs "合计: #{sum}"1 2 3 4 5 6 7sum=0outcome ={"参加费"=>1000, "挂号费"=>1000, "联欢费"=>4000} outcome.each do |item, price|sum+=priceendputs "合计: #{sum}"逐⾏读取⽂件1file=File.open("file_each.rb")23 4 5 6file.each_line do |line| print lineendfile.close隐藏常规处理这个有点像Python中的 with open as1 2 3 4 5File.open("file_open.rb") do |file| # 类型Python中的with open file.each_line do |line|print lineendend这个代码普通写法如下1 2 3 4 5 6 7 8file=File.open("file_open_no_block.rb") beginfile.each_line do |line|print lineendensurefile.closeend替换部分算法通过块的设置,指定sort规则Array#sort⽅法没有指定块时,会使⽤<=>运算符对各个元素进⾏⽐较,并根据⽐较后的结果进⾏排序。