PBII第3章(3-4)

上传人:小**** 文档编号:243147705 上传时间:2024-09-16 格式:PPT 页数:63 大小:334KB
返回 下载 相关 举报
PBII第3章(3-4)_第1页
第1页 / 共63页
PBII第3章(3-4)_第2页
第2页 / 共63页
PBII第3章(3-4)_第3页
第3页 / 共63页
点击查看更多>>
资源描述
单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,第,3,章,数据窗口技术,第,3,章,数据窗口技术,本章主要内容,数据窗口对象基础,数据窗口对象的设计,操纵数据窗口,数据窗口控件扩展,子数据窗口,动态数据窗口,数据存储对象,数据窗口的打印,2,3,操纵数据窗口,数据窗口控件是应用程序在窗口中展示数据窗口对象的惟一途径,数据窗口控件与数据窗口对象的结合构成了应用程序访问和操纵数据库的主要手段。,3,3.1,获取数据窗口信息,数据窗口对象中可以放置控件,其中有很多的控件外观类似于窗口中的控件。不同的是,对这里的控件一般不能编写脚本。即使可以和用户进行交互的控件,其功能也是,PowerBuilder,预先设置好的,大部分控件在运行时只是引用或者修改它们的属性。引用它们的属性有两种方法,或者通过使用函数,Describe,,,或者使用数据窗口控件的相关属性。不管使用哪种引用方法,都应该清楚属性描述的语法规则。,3.1.1,对列的引用,在属性描述时,经常要对列进行引用。引用列的方法有两种,或者使用列名,或者使用列号。应尽量避免使用列号,因为列号是和创建数据窗口时选择列的顺序相对应的。在以后的修改中很有可能取消某些列或者调整列的选择顺序,或者改变,4,数据源,这时就很容易出现错误,更糟糕的是这时很有可能没有错误信息,张冠李戴了。,下面是一个使用列号进行属性描述的语句:,dw_1.Describe(#5.coltype),这种语法可以和函数,GetColumn,搭配使用,用来检索当前列号。下面是一个显示数据窗口中所有列个数的例程:,Int,li_count,li_count,= Integer(dw_1.Describe &,(“,datawindow.column.count,”) /,列个数,3.1,获取数据窗口信息,5,3.1.2,获取列名称(,Name,属性),使用,Name,属性可以获取列的名称。可以使用列号或者列名称来标识一个列,但使用列号不太安全,所以用获取列名比较好一些。语法如下:,直接引用:,dw_control.Object.objectname.Name,在函数,Describe,中:,objectname.Name,其中,,objectname,是要获取名称的控件标识,因为在数据窗口对象中有很多控件有多种标识方法。例如,下面可以获取列,(,创建,ID),号为,1,的列的名称:,dw_1.Describe(#1.name),3.1,获取数据窗口信息,6,3.1,.3,获取列的类型(,Coltype,属性),列的,ColType,属性是一个非常有用的属性,使用该属性可以在程序运行时获取列的类型。但是不能在运行时修改该属性。下面是它的语法:,直接引用:,dw_control.Object.objectname.ColType,在,Describe,函数中:,objectname.ColType,不管使用哪种方式,对同一个列获得的类型都相同。需要注意的是,不同的,DBMS,数据类型的描述可能不一样,请读者具体测试并正确使用。对于,SQL Server 2000,,转换后列类型有,Char(n,),、,DateTime,、,Decimal (n),、,Long,、,Number,、,Real,、,Timestamp,及,Ulong,共,8,种,其中的,n,代表字符的长度或者小数后的精度。,3.1,获取数据窗口信息,7,需要说明的是,计算域也有对应的数据类型,(,同样用,ColType,属性,),,任何数值型计算域的类型都是,number,。,下面是使用实例:,ls_coltype,= dw_1.Object.emp_id.ColType,ls_coltype,= dw_1.Describe(emp_id.ColType),在实际的编程中,获取列的类型后,紧接着使用,CHOOSE CASE,语句针对不同的类型进行相关的处理。,表,3-4,给出了,SQL Server 2000,支持数据类型在,DataWindow,中的转换结果。,3.1,获取数据窗口信息,8,3.1,获取数据窗口信息,9,注意,:,timestamp,可以按字符数据处理,占用,18,个字符宽度;,real,支持,7,位浮点精度,对于数据窗口,不能使用,GetItem,系列函数得到其准确值,甚至不能输入准确值,而对于列合计同样不会获得准确值。比如某列的实际值为,7.38541(,或,6.93521),,获得值及合计值均为,7.385409832000732(,或,6.935210227966309),。建议一般情况下不采用,real,类型,如果需要的话,请设置编辑和显示格式为:,0.000000E+00,。,下面是一个显示数据窗口中所有列的数据类型的例程:,Int,li_count,li_index,li_count,= Integer(dw_1.Object.datawindow.column.count) For,li_index,= 1 To,li_count,MessageBox(String(li_index),dw_1.describe(# &,+,String(li_index,) + .,coltype,),Next,3.1,获取数据窗口信息,10,3.2,数据窗口控件的,常用函数,PowerBuilder,为数据窗口控件提供了大量的对象函数,灵活使用这些函数,可以极大地加快应用的开发进度,提高程序的运行效率。这里选择一些比较常用的函数。,3.2.1,检索函数,Retrieve,函数从数据库中检索数据,并将其显示到数据窗口中。使用时可根据检索要求来确定指不指定检索参数(参数在数据窗口对象设计时确定)。语法格式如下:,dwcontrol.Retrieve,(arg1,arg2,),该函数执行成功时,返回所检索到的数据的行数;若执行失败则返回,-1,;若任何参数的值为,NULL,,,则函数返回,NULL,。,11,使用,Retrieve,函数检索出数据之后,系统将自动执行数据窗口的过滤条件,不满足过滤条件的数据行将被立即移动到过滤缓冲区中,函数返回的数值不包括移动到过滤缓冲区中的行数。一般情况下,执行,Retrieve,函数后,数据窗口中原有的数据被丢弃,并用新的数据来取代。,3.2.2,数据过滤,在程序的运行过程中可以动态定义和改变数据窗口的过滤条件。完成动态数据过滤,首先需要使用,SetFilter,函数指定过滤条件,然后再使用,Filter,函数实施过滤操作。,使用,SetFilter,函数语法格式如下:,dwcontrol.SetFilter,(,format,),3.2,数据窗口控件的常用函数,12,format,为,String,类型,其值用作过滤条件的逻辑表达式。表达式中可以使用列名或列号,使用列号时须在列号前加上,#,符号。如果,format,为空字符串,则表示去掉过滤条件。,该函数执行成功时,返回,1,;若执行失败则返回,-1,;若任何参数的值为,NULL,,则函数返回,NULL,。,执行,SetFilter,函数后,新的过滤条件将取代原有的过滤条件(若原来有的话)。此时数据窗口并没有真正实施数据过滤,还需执行函数,Filter,。语法格式为:,dwcontrol.Filter,( ),例如,先设数据窗口控件,dw_emp,所关联的数据窗口对象的第,4,列为字段,sex,,则下面的两种过滤方式的效果是相同的:,dw_emp.SetFiler,(#4 = ,男, ),dw_emp.Filer,( ),3.2,数据窗口控件的常用函数,13,或者,String,ls_filter,ls_filter,= #4 = ,男, ,dw_emp.SetFiler,(,ls_filter,),dw_emp.Filer,( ),3.2.3,数据排序,实现数据窗口的动态排序,首先要使用,SetSort,函数设置排序方式,再使用,Sort,函数实施排序操作。与设置过滤的方法类似,使用,SetSort,函数的语法为:,dwcontrol.SetSort,(,format,),例如:,dw_employee.SetSort(#1 A, #5 D),3.2,数据窗口控件的常用函数,14,dw_employee.SetSort,&,(,emp_status,Asc,emp_salary,Desc,),使用,Sort,函数的语法为:,dwcontrol.Sort,( ),需要注意的是,,Sort,是按,PowerBuilder,的规则进行排序,要区别于,SQL,语句中的,Ordr,By,子句,后者上按所用,DBMS,的规则进行排序。,3.2.4,获取和设置有关数据项的值,数据窗口控件有一组,GetItem,簇函数,用于得到数据窗口中指定行、指定列以及指定数据类型的数据项的值。这些函数包括:,3.2,数据窗口控件的,常用函数,15,dwcontrol.GetItemDate,(,row,column,),dwcontrol.GetItemDateTime,(,row,column,),dwcontrol.GetItemDecimal,(,row,column,),dwcontrol.GetItemNumber,(,row,column,),dwcontrol.GetItemString,(,row,column,),dwcontrol.GetItemTime,(,row,column,),row,为长整型,用于指明数据所在的行,column,指明数据所在的列,可以使用一个整数标明该列的列号,也可以使用字符串指明该列的名称。需要注意的是,计算域对应的“列”没有列号,必须使用列名。,设置数据项的值使用函数,SetItem,,该函数给数据窗口的指定数据项赋值,此值直接放置到数据窗口的主缓冲区中而不通过校验规则。语法格式如下:,3.2,数据窗口控件的常用函数,16,dwcontrol.SetItem,(,row,column,value,),其中,,row,column,的意义同前,,value,为给指定数据项所要设置的值,其数据类型必须与指定列的数据类型相同。该函数执行成功时,返回,1,;若执行失败则返回,-1,。,3.2.5,数据共享,在主数据窗口控件与从数据窗口控件之间共享数据。这种共享并不共享显示格式,只是共享数据,包括主缓冲区、删除缓冲区以及过滤缓冲区中的数据,同时也共享排序顺序。,语法,dwprimary.ShareData,( dwsecondary ),其中,dwprimary,用作主数据窗口的数据窗口控件名。主数据窗口拥,3.2,数据窗口控件的常用函数,17,有数据,当删除该数据窗口时,数据也同时消失。,dwprimary,可以是某个子数据窗口。,dwsecondary,用作从数据窗口的数据窗口控件名。该数据窗口控件与主数据窗口控件共享数据。从数据窗口不能是交叉表,(Crosstab),风格的数据窗口,但可以是子数据窗口。,返回值,Integer,。函数执行成功时返回,1,,发生错误时函数返回,-1,。如果任何参数的值为,NULL,,则,ShareData,(),函数返回,NULL,。,使用,ShareData,(),函数时,要求主数据窗口控件与从数据窗口控件中的数据窗口对象的列必须相同,但各自使用的,SELECT,语句可以不一样。,例如,在使用下述,SELECT,语句的数据窗口对象之间可以共享数据:,3.2,数据窗口控件的常用函数,18,SELECT,dept_id,from dept,SELECT,dept_id,from dept where,dept_id,= 200,SELECT,dept_id,from employee,由于从数据窗口并不检索数据,因此该数据窗口的,SELECT,语句中,WHERE,子句并不起作用。两个数据窗口中的数据均由主数据窗口的,WHERE,子句确定。,如果有多个从数据窗口需要共享主数据窗口的数据,那么对每一个从数据窗口调用主数据窗口的,ShareData,(),对象函数。,主数据窗口与从数据窗口共享数据后,无论应用程序调用主数据窗口的对象函数修改数据,还是调用从数据窗口的对象函数修改数据,,PowerBuilder,都将针对主数据窗口完成修改,并且将修改反映到所有从数据窗口中。例如,当应用程序调用从数据窗口的下述对象函数时,,PowerBuilder,都将针对主数据,3.2,数据窗口控件的常用函数,19,窗口完成操作。这些函数包括:,DeleteRow,()Filter(),GetSQLSelect,(),ImportFile,(),ImportString,(),ImportClipboard,(),InsertRow,(),ReselectRow,()Reset(),Retrieve(),SetFilter,(),SetSort,(),SetSQLSelect,()Sort()Update(),要终止数据窗口之间的数据共享,那么调用,ShareDataOff,(),函数。当调用主数据窗口的,ShareDataOff,(),函数时,终止所有从数据窗口与该主数据窗口之间的数据共享。当调用从数据窗口的,ShareDataOff,(),函数时,终止该从数据窗口与主数据窗口之间的数据共享,终止了数据共享后,从数据窗口中的数据将消失。,语法,dwcontrol.ShareDataOff,(),3.2,数据窗口控件的常用函数,20,其中,dwcontrol,数据窗口控件名,返回值,Integer,。函数执行成功时返回,1,,发生错误时函数返回,-1,。如果任何参数的值为,NULL,,则,ShareDataOff,(),函数返回,NULL,。,示例 下面的代码在三个数据控件之间共享数据,之后终止其中一个从数据窗口的共享关系:,dw_corp.SetTransObject(SQLCA,),dw_corp.Retrieve,(),dw_corp.ShareData(dw_emp,),dw_corp.ShareData(dw_dept,),. /,其他处理,3.2,数据窗口控件的常用函数,21,dw_emp.ShareDataOff,(),其中,dw_corp,为主数据窗口,dw_emp,和,dw_dept,为从数据窗口。,3.2.6,从外部复制数据,PowerBuilder,提供了,3,个相关函数,用于支持数据窗口从外部复制数据,这,3,个函数分别为,ImportClipboard,(,剪切板,),、,ImportFile,(,文件,),和,ImportString,(,字符串,),。另外,还可以使用,OLE,自动化服务和数据窗口对象的表达式从,Excel,表导入数据。这里介绍其中的两个函数和,OLE,方法。,1.,ImportFile,( ),函数,功能:把文件中的数据复制到数据窗口控件中。文件中的数据可以是以,Tab,字符作为分隔符的文本,也可以是,dBase II,、,III,格式的数据。,3.2,数据窗口控件的常用函数,22,语法:,dwcontrol.ImportFile(filename,startrow,endrow,startcolumn,endcolumn,dwstartcolumn,),注意,由于排版原因,这里把该函数写成了两行,代码中该函数应该写为一行或加分行符后写作多行。,其中参数:,dwcontrol,:数据窗口控件名。,filename,:,String,类型,其值是要复制数据的文件的文件名,文件的内容必须是以,Tab,字符作为分隔符的文本文件,或者是,dBase II,、,III,格式的文件,(DBF,文件,),。指定文件名时,需要指定文件的全名,其中包括扩展名部分。如果,filename,参数的值为,NULL,,,ImportFile,(),函数会自动显示一个打开文件对话框,用户可以在该对话框中选择或输入文件名。,3.2,数据窗口控件的常用函数,23,startrow,:可选参数,指定希望复制的数据起始行的行号。如果数据的第一行包含了各列的列标题,而你希望跳过列标题,那么把,startrow,参数的值设置为,2,。,startrow,参数的缺省值为,1,。,endrow,可选参数,指定希望复制数据终止行的行号。缺省值为起始行之后最后一行。,startcolumn,可选参数,指定希望复制的数据起始列的列号,缺省值为,1,。,endcolumn,可选参数,指定希望复制的数据终止列的列号,缺省值为起始列之后最后一列。,dwstartcolumn,可选参数,指定数据窗口中接收文件中数据的第一列的列号,缺省值为,1,3.2,数据窗口控件的常用函数,24,返回值:,Long,。函数执行成功时返回从文件中移入到数据窗口中数据的行数;发生错误时,函数返回,0,或负数,(,具体含义,略,),。,用法:要装入数据的文件应该按行方式组织数据。如果文件中包含了列标题或行标签,可以通过设置,ImportFile,(),函数的参数来跳过它们。数据窗口对象列的数据类型和次序必须与文件中列的类型和次序匹配。,如果希望让用户自己选择文件名,那么把,filename,参数设置为,NULL,字符串,执行,ImportFile,(),函数时,,PowerBuilder,会自动显示,Select Import File,对话框,用户可从中选择所需的文件。,如果插入数据时发生数据项类型不匹配之类的错误,则,ImportFile,(),函数会触发数据窗口控件的,ItemError,事件。,3.2,数据窗口控件的常用函数,25,2.,ImportString,( ),函数,功能:把字符串中的数据复制到数据窗口控件中,字符串使用,Tab,字符分隔各数据项。,语法:,dwcontrol.ImportString(string,startrow,endrow,startcolumn,endcolumn,dwstartcolumn, ),注意,由于排版原因,把该函数写成了两行,代码中该函数应该写为一行或加分行符后写作多行。,其中参数:,dwcontrol,:数据窗口控件名。,string,:,String,类型,指定要复制数据的字串。字符串中行之间使用回车换行字符,(,rn,),分隔,列之间使用,Tab,字符,(t),分隔。,3.2,数据窗口控件的常用函数,26,startrow,:可选参数,指定希望复制的数据起始行的行号。如果数据的第一行包含了各列的列标题,而你希望跳过列标题,那么把,startrow,参数的值设置为,2,。,startrow,参数的缺省值为,1,。,endrow,:可选参数,指定希望复制数据终止行的行号,缺省值为起始行之后最后一行。,startcolumn,:可选参数,指定希望复制的数据起始列的列号,缺省值为,1,。,endcolumn,:可选参数,指定希望复制的数据终止列的列号,缺省值为起始列之后最后一列。,dwstartcolumn,:可选参数,指定数据窗口中接收字符串中数据的第一列的列号,缺省值为,1,。,3.2,数据窗口控件的常用函数,27,返回值:,Long,。函数执行成功时返回从字符串中移入到数据窗口中数据的行数;发生错误时,函数返回下述值之一:,􀁺􀀃,-1 ,函数参数中指定的,startrow,值大于字符串中数据行的总行数;,􀁺􀀃,-3 ,参数无效;,􀁺􀀃,-4 ,输入无效;,􀁺􀀃,-9 ,由于数据不满足有效性规则,,PowerBuilder,或用户取消了数据装入过程。,如果任何参数的值为,NULL,,则,ImportString,(),函数返回,NULL,。,用法:,ImportString,(),函数操作的字符串必须使用,Tab,字符分隔各列,使用回车换行字符,(,rn,),分隔各行。假设某个字符串由四个列,那么其中一行的样式应该为:,3.2,数据窗口控件的常用函数,28,第一列数据,t,第二列数据,t,第三列数据,t,第四列数据,如果要装入一个数据项中的数据由多行组成,那么在构成参数,string,时必须用符号,把组成一个数据项的多行括起来,注意不要使用单引号,( ),。例如下面的字符串在每行的第二列定义了多行数据:,ls_s,= &,1tMickeyrnMinniernGoofy ,rn, + &,2tSusanrnMaryrnMarie ,rn, + &,3tChrisrnBenrnMike ,rn, + &,4tMottrnBarberrnPicard ,如果插入数据时发生数据项类型不匹配之类的错误,则,ImportFile,(),函数会触发数据窗口控件的,ItemError,事件。,3.2,数据窗口控件的常用函数,29,示例 下面的代码将库文件,d:pbdwTemp.pbl,中的所有对象呈现在数据窗口,dw_list,中。,String,ls_entries,ls_entries,=,LibraryDirectoryEx,( ,d:pbdwTemp.pbl,DirAll,!),dw_list.SetRedraw(FALSE,),dw_list.Reset,( ),dw_list.ImportString(ls_Entries,),dw_list.SetRedraw(TRUE,),关于函数,LibraryDirectoryEx,( ),:,用于得到应用库中一系列对象的信息列表。内容包括:对象名称、最近修改日期和时间、对象的注释以及对象的类型。函数执行成功时返回一个字符串,每个对象占用一行,行中各信息之,3.2,数据窗口控件的常用函数,30,间使用,Tab,字符,(t),分隔,行中信息格式为:,对象名,t,修改日期,/,时间,t,注释,t,对象类型,n,3.,从,Excel,表导入数据,/,使用,OLE,自动化服务,将,Excel,表的内容导入到数据窗口中。,Integer,li_value,li_Ret,String,filepath, filename,OLEObject,xlApp,xlsub,Long,ll_j,ll_k,ll_r,ll_c,ll_c_d,Any,a_dat,dw_1.Reset(),li_value,=,GetFileOpenName,(,打开文件,filepath, &,filename, Excel, + Excel Files (*.,xls,),*.,xls, ),3.2,数据窗口控件的常用函数,31,If,li_value, 1 Then Return,xlApp,= CREATE,OLEObject,/,创建,OLE,对象,li_Ret,=,xlApp.ConnectToNewObject,&,( “,excel.application,” ) /,连接,Excel,If,li_Ret, 0 Then,DESTROY,xlApp,MessageBox,(,系统提示,连接,Excel,出错,!),Return,End If,xlApp.Workbooks.Open(filepath,),xlsub,= xlApp.application.workbooks(1).worksheets(1),/,得,Excel,到表中到有效行列数,3.2,数据窗口控件的常用函数,32,ll_r,= xlApp.application.workbooks(1).worksheets(1).,UsedRange.Rows.Count,ll_c,= xlApp.application.workbooks(1).worksheets(1).,UsedRange.Columns.Count,ll_c_d,= Long(dw_1.,Object.DataWindow.Column.Count,),ll_c,=,Min(ll_c,ll_c_d,) /,取较小者,确保正常运行,/,如果有列标题,则从第,2,行开始读取数据,For,ll_j,= 1 To,ll_r,ll_row,= dw_1.insertrow(0),For,ll_k,= 1 to,ll_c,a_dat,=,xlsub.cellsll_j,ll_k.value,dw_1.SetItem(ll_j,ll_k,a_dat,),3.2,数据窗口控件的常用函数,33,Next,Next,xlApp.DisplayAlerts,= False,xlApp.Quit,(),xlApp.DisConnectObject,(),DESTROY,xlApp,3.2.7,数据导出,同样地,,PowerBuilder,提供了将数据窗口的内容保存到文件的函数。通过编程,也可以使用,OLE,自动化服务和数据窗口对象的表达式将数据保存到,Excel,表中。,1.,SaveAs,( ),函数,功能:将数据窗口控件的内容以指定格式保存到文件中。,3.2,数据窗口控件的常用函数,34,语法:,dwcontrol.SaveAs,( filename,saveastype,colheading, ),其中参数,dwcontrol,:,数据窗口控件名,filename,:,可选参数,,String,类型,其值是用于保存数据窗口内容的文件的文件名。如果省略了,filename,参数或,filename,参数的值为空字符串,,程序运行时,,PowerBuilder,将显示一个对话框让用户输入或选择文件名。,saveastype,:,可选参数,,SaveAsType,枚举数据类型,用于指定以何种方式保存数据窗口中的数据,有效取值为:,Text! ,以每行用回车符结束,列之间使用,Tab,字符分隔的格式保存,(,缺省值,),;,3.2,数据窗口控件的常用函数,35,Excel! ,保存为,Microsoft Excel,格式;,PDF! ,保存为,Portable Document Format (PDF),格式;,CSV! ,以逗号分隔的形式保存数据;,colheading,:可选参数,,boolean,类型,指示是否在文件的开头加上数据窗口列的标题。缺省值为,TRUE,,表示加列标题。该参数指定为,FALSE,时表示不加列标题。需要注意的是,对保存为,dBASE,文件格式来说,总是要加上列标题的。,返回值:,Integer,。函数执行成功时返回,1,,发生错误时返回,-1,,如果任何参数的值为,NULL,,则,SaveAs,(),函数返回,NULL,。,用法:如果调用,SaveAs,(),函数时未指定任何参数,那么,PowerBuilder,将显示一个,SaveAs,对话框,让用户指定要保存的文件名以及文件格式。,3.2,数据窗口控件的常用函数,36,示例 把数据窗口,dw_equipmt,中的内容保存到文件,G:inventory,sales.XLS,中,文件格式为带列标题的,Excel,格式。,dw_equipmt.SaveAs(G:inventorysales.XLS, Excel!, TRUE),2.,SaveAsAscii,( ),函数,功能:将数据窗口的内容保存到一个,ASCII,码文件中。,语法:,dwcontrol.SaveAsAscii(String,filename, String,separatorcharacter,String,quotecharacter, String,lineending,),其中参数,dwcontrol,:数据窗口控件的名称。,filename,:文件名指定要保存到哪个文件中。,3.2,数据窗口控件的常用函数,37,separatorcharacter,:可选参数,指定分隔数据窗口中各列数据的分隔符,省略该参数时,缺省的分隔符为,Tab,字符。,quotecharacter,:可选参数,指定用于将值括起来的字符,省略该参数时,缺省的括号字符为双引号。,lineending,:可选参数,指定放置到每一行末尾的值,省略该参数时将回车换行,(,rn,),字符放置到每一行的末尾。,返回值:函数执行成功时返回,1,,发生错误时返回,-1,。,用法:虽然,SaveAs,(),函数也能够将数据窗口的内容保存为文本文件。但应用程序难以控制所使用的分隔符;而,SaveAsAscii,(),函数则为程序员提供了更多的选择,让我们能够针对数据状况和未来的数据使用方法,以最适合的分隔符分隔方式,保存数据窗口中的数据。,3.2,数据窗口控件的常用函数,38,示例 下面的语句将,dw_sales,数据窗口中的数据保存到文本文件,C:Q3Sales.txt,中。文本文件中,各列数据之间使用感叹号,( ! ),分隔,数据值使用单引号,( ),括起来,每行的结尾使用缺省的行结尾符,(,rn,),。,dw_sales.SaveAsAscii(C:Q3Sales.TXT,!,),3.,将数据保存到,Excel,表,/,使用,OLE,自动化服务将数据窗口内容保存到,Excel,表中,带汉字列标题。,Integer,filevalue,li_Ret,String,filepath, filename,OLEObject,xlApp,xlSub,Long,ll_j,ll_c,ll_r_count,ll_i,String,p_label, /,列标题名,在适当时机赋值,3.2,数据窗口控件的常用函数,39,Any,ls_dat,String,ls_path,filevalue,=,GetFileSaveName,(,保存文件,filepath, &,filename, Excel, + Excel Files (*.,xls,),*.,xls, ),If,filevalue,= 1 Then,If,FileExists,(,filepath,) Then,If,MessageBox,(,确认选择,文件已存在, &,+ ,覆盖吗,?,Question!,YesNo,! ) 1 Then,RETURN,End If,End If,3.2,数据窗口控件的常用函数,40,/,创建,OLE,对象,连接,Excel,xlApp,= CREATE,OLEObject,li_Ret,=,xlApp.ConnectToNewObject,( ,Excel.Application, ),If,li_Ret, 0 Then,MessageBox,(,系统提示,连接,Excel,出错,!),RETURN,End If,xlApp.Application.Workbooks.Add,(),xlSub,= xlApp.Application.ActiveWorkbook.Worksheets1,/,添加列标题,ll_c,=,UpperBound(p_label,),For,ll_j,= 1 To,ll_c,xlSub.cells1,ll_j =,p_labelll_j,Next,3.2,数据窗口控件的常用函数,41,ll_r_count,= dw_1.rowcount() /,添加数据内容,For,ll_i,= 1 To,ll_r_count,For,ll_j,= 1 To,ll_c,ls_dat,= dw_1.Object.Datall_i,ll_j,xlSub.cellsll_i,+ 1,ll_j, =,ls_dat,Next,Next,xlApp.ActiveSheet.Columns(A:Z).AutoFit,xlApp.Application.DisplayAlerts,= False,xlApp.Application.Workbooks1.SaveAs(filepath),xlApp.quit,(),xlApp.DisConnectObject,(),DESTROY,xlApp,End If,3.2,数据窗口控件的常用函数,42,3.2.8,数据行的滚动,以代码的的形式可以控制数据行的滚动,并达到精确定位。这些函数包括:,dwcontrol.Scroll,(,number,),;,dwcontrol.ScrollToRow,(,row,),dwcontrol.ScrollNextRow,(),;,dwcontrol.ScrollPriorRow,(),dwcontrol.ScrollNextPage,(),;,dwcontrol.ScrollPriorPage,(),这些函数均可改变数据窗口的当前行,但不改变当前列。并且,系统不会自动高亮显示新的当前行。若想指示到当前行,可使用,SelectRow,函数或,SetRowFocusIndicator,函数。此外,这几个函数中除了,Scroll,函数外,均可能触发数据窗口控件的,ItemFocusChanged,、,RowFocusChanged,、,ItemChanged,、,ItemError,等函数。,3.2,数据窗口控件的常用函数,返回,43,4,数据窗口控件扩展,虽然在数据窗口中用回车键切换列焦点是,Windows,界面设计所不提倡的,但在实际应用时对很多有长期,DOS,操作经验的用户的强烈要求不能不考虑,这些用户总是习惯于使用回车键。因此有必要考虑用回车键代替,Tab,键。,另一方面,熟悉,Windows,的用户一定对资源管理器不陌生,当目录或文件很多时,当然想到使用排序来尽快定位目标:只要用鼠标在资源管理器上端的名称、大小、类型或修改时间中的任一项单击,它就会以此项按升序或降序排序。同样地,在,PowerBuilder,中,对于数据窗口,如果数据较多,也可以采用这种办法来排序,以尽快查找记录。,本节就这两个方面对数据窗口的性能进行改善。考虑到通用性,我们以,datawindow,创建标准可视用户对象,并命名为,u_datawindow_s,。,44,可以采用两种方法将,Tab,键用回车代替。,(,1,)创建一用户事件来响应数据窗口的,pbm_dwnprocessenter,事件,在该事件中加入下面程序:,Send(Handle(This,256,9,Long(0,0) /,发送处理,Tab,键的信息。,RETURN 1 /,忽略,Enter,键的处理,(,2,)创建一用户事件来响应数据窗口的,pbm,_,dwnkey,事件,并使用,Windows,的,API,函数,keybd_event,。,例如,下面的脚本在相应数据窗口的,pbm_dwnprocessenter,用户事件中编写,用来检查数据窗口中录入数据的各种情况,并执行相应的程序。,(,1,)当返回负值时,4.1,用回车键代替,Tab,45,肯定某列存在错误,这时既不处理,Enter,键也不处理,Tab,键。,(,2,)当返回非负值时, 如果是最后的行列则应该在按回车键时插入一行,并使光标定位到新行的第一列上。, 如果不是最后行列则应该发送,Tab,信息,屏蔽,Enter,键的处理。,脚本如下:,If,This.AcceptText,() 0 Then,/,如果不能正确接受用户的输入信息,RETURN 1 /,则不进行按键处理,直接返回,End If,4.1,用回车键代替,Tab,46,/,如果是最后一列,If,This.GetColumn,() = &,Long(This.Object.Datawindow.Column.Count,) Then,If,This.GetRow,() =,This.RowCount,() Then,/,并且是在最后一行,This.InsertRow(0) /,则增加新行,This.ScrollToRow(This.GetRow,() + 1),/,并且使之成为当前行,This.SetColumn(1) /,并将第一列设置为当前列,Return 1 /,然后返回,End If,End If,4.1,用回车键代替,Tab,47,Send(Handle(This),256,9,Long(0,0),/,发送处理,Tab,键的消息,Return 1/,忽略回车键的处理,同上面的用户需求,使用,Windows,的,API,函数,keybd_event,。,先声明局部外部函数:,/,控制按键操作,Subroutine,keybd_event(uint,bVk,uint,bScan,long,&,dwFlags, long,dwExtraInfo,) library user32.dll,创建一用户事件来响应数据窗口的,pbm,_,dwnkey,事件,在该事件中加入下面程序:,Integer VK_TAB = 09 /Tab,键码,Integer VK_SHIFT = 16 /Shift,键码,4.1,用回车键代替,Tab,48,If key=,KeyEnter,! Then /,如果是回车键,If,this.AcceptText,() 0 Then,ls_temp,=,Mid(ls_mc,ll_pos,+ 1),ls_type,=,This.Describe(ls_temp+.type,),ls_band,=,This.Describe(ls_temp+.band,),If Left(ls_type,2) = co AND &,ls_band,= detail Then,/,column,compute,(for Computed Field),ll_k,+,is_obj_namell_k, =,ls_temp,End If,ls_mc,=,Left(ls_mc,ll_pos,- 1),Else /,最后一个,4.2,用单击列标题排序,56,ls_type,=,This.Describe(ls_mc+.type,),ls_band,=,This.Describe(ls_mc+.band,),If Left(ls_type,2) = co AND &,ls_band,=detail Then,ll_k,+,is_obj_namell_k, =,ls_mc,End If,Exit,End If,Loop,For,ll_j,= 1 to,UpperBound(is_obj_name,),il_obj_xll_j, = &,Long(This.Describe(is_obj_namell_j+.X,),Next,4.2,用单击列标题排序,57,自定义函数:,of_find_obj,/,功能:依据排序图片位置获得获得对象(列或计算域),/,参数:无,/,返回值:对象名称,String,ls_name,ls_temp,Int,li_pic_x,ll_j,li_width,li_pic_x,=,Integer(This.Describe(p_sort.x,),For,ll_j,= 1 To,UpperBound(il_obj_x,),ls_temp,=,is_obj_namell_j,li_width,=,Integer(This.Describe(ls_temp+.width,),If,li_pic_x,il_obj_xll_j, AND &,li_pic_x,li_hh,Then Return /,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!