38个powerbuilder操作技巧

上传人:jin****ng 文档编号:93166280 上传时间:2022-05-19 格式:DOC 页数:4 大小:75.50KB
返回 下载 相关 举报
38个powerbuilder操作技巧_第1页
第1页 / 共4页
38个powerbuilder操作技巧_第2页
第2页 / 共4页
38个powerbuilder操作技巧_第3页
第3页 / 共4页
亲,该文档总共4页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1使DataWindow列只能追加不能修改如何使DataWindow中的数据只能追加新记录而不能修改,利用Column的Protect属性可以很方便的做到这一点,方法如下:将每一列的Protect属性设置为:lf(lsRowNew(),0,1)在PowerScript中可以动态修改Protect属性:dw_1.Modify(column_name_here.Protect=1tlf(lsRowNew(),0,1)这样,DataWindow中只有新追加的记录可修改,而其他记录是只读的。2如何在DataWindow中实现列的自动折行我们在PowerBuilder应用程序的开发过程中,使用DataWindow时,经常会遇到某列的数据太长,不能同时全部显示的情况.若采用自动水平滚动,操作起来又不够简便.下面介绍一种方法,实现列数据多行显示,即实现列数据的自动折行.具体步骤如下:1) 在DataWindowPainter中打开此DataWindow.2) 在需设定自动折行的列上双击鼠标,弹开此列的属性窗口.3) 选择Position标签,选中AutosizeHeight多选框.4) 选择Edit标签,不选中AutoHorzScroll多选框.5) 单击OK按钮,保存所做的修改.点中DetailBand(即写有Detail的灰色长带),单击鼠标右键,选择Properties.菜单项.6) 选中AutosizeHeight多选框.7) 单击OK按钮,保存所做的修改.8) 保存此DataWindow.注意:连在一起的汉字(中间没有标点或空格分隔),系统将认为是一个单词,不会自动进行折行.3在数据窗口中实现动画要实现动画,必须要有定时器,在数据窗口中已经有了一个定时器,双击数据窗口将弹出的对话框,在TimerInterval中定义大于零的值就有定时器(可以精确到毫秒),有了这个定时器就可以实现动画了。比如要改变某字段的背景颜色,可设ackgound.color=RGB(lnteger(Right(string(now(),hhmmssf),1)*256/10,lnteger(Right(string(now(),hhmmssf),1)*256/10,0)当然,您不仅可以改变背景颜色,而且可以改变字体等等任何属性,使他可以动起来!4使数据窗口中的被选中行具有更好的外观大家都知道,在选择数据窗口中的某一行时,如果使用pb提供的选择函数SelectRow(),那么的外观真是不能恭维,单调而古板的蓝色背景,可能和您的漂亮而生动的应用程序格格不入。有没有办法改变呢?当然有啰,请听我慢慢道来。改变某一行的背景比较简单,改变每一列的背景属性(backgroundcolor)即可,可要根据鼠标选择情况自动改变,并可以返回被选中的行可能还需要一定的技巧。下面分单行选择和多行选择分辨说明。单行选择单行选择比较简单,我们只要将所有字段的背景色的表达式改为:if(GetRow()=CurrentRow(),RGB(255,126,0),RGB(0,0,0)其中第一个颜色为被选中的颜色,第二个颜色未被选中的颜色。然后用GetRow()代替GetSelectedRow()函数来得到被选中的行。多行选择多行选择比较复杂,如果单纯依靠改变数据窗口的属性没法实现,我们必须使用数据窗口属性和代码结合起来才能实现首先,改变数据窗口的SQL语句,增加一个计算字段:0asflag,Select语句改为:Selectcol1,col2,1asflagfromtablenamewhere.,当返回数据窗口painter时,您就会发现多了一个字段flag,我们就是利用这个字段保存行被选中的信息。其次,修改各个字段的背景颜色属性,设置为:if(flag=1,RGB(255,126,0),RGB(255,255,255)第三:在数据窗口控件中,增加对clicked事件的处理,代码如下:ifrow1thenreturn/setredraw(false)ifthis.object.flagrow=1then/如果该行被选中,撤销选择,否则选中该行this.Object.flagrow=0elsethis.Object.flagrow=1endifsetredraw(true)您还可以定制本选中行的字体,文本属性等等。原理相同,不再赘述。5将日期型字段初始化为当天的日期使用ColumnSpecifications对话框来设置数据的初始值是一个比较好又比较通用的方法。为了将日期型字段初始化为当天的日期,只要设置初始化值为today,而不是today()即可。同样设置初始值为NUll,可以使用null,而不是null()。6在DataWindow中调整列顺序在Gird风格的DataWindow中,列的排列顺序是按照你选择Column的顺序排列的,并且不能改变.要改变列的顺序则必须重新制作DataWindow.最近我发现一个办法可以改变列的顺序:在DataWindow画板中打开要修改的DataWindow,然后按Preview按钮切换到预览模式下,选择要移动的列标题并拖动到预定位置,然后返回DataWindow画板,存盘即可.2, 7Retrieve时不清除原有Datawindow数据当你调用Retrieve函数PowerBuilder自动清除原有DataWindow然后Retrieve数据。在DatawindowRetrievestart事件中,使用Return这样PowerBuilder不会清除原有数据而是追加新数据。8美化DataWindow的显示效果使DataWindow的单双行显示颜色不同,不仅仅可以使你的应用程序更显专业性,并使数据的可读性增强。先调出你需要改动的DataWindow,在Detailband按下右键选择Properties,选择Tab页中的expression_rs,在color属性中输入下面内容:(注意是在Detail明细显示段按右键,而不是在Column上)IF(MOD(GETROW(),2)=0,RGB(192,192,192),RGB(255,255,255)马上Preview一下,看一看效果如何。9用Line建立漂亮的GridDataWindow的技巧虽然PowerBuilder有Grid风格的DataWindow,但不够灵活,如果想打印一张边框粗线条或双线,内框为细线条的表格直接使用Grid风格的DataWindow就不能实现。因此许多人都用Tabular风格的DataWindow,然后自己用Line来实现Grid。在调整线条位置是一个即伤脑筋又伤眼睛的事件,而一旦需要调整行高,所有工作都得重来,试一试用下面方法,会大大减轻你的工作量:在verticallines,改变它的属性,在expression_rsTab上,y1行上输入0,y2行上输入rowheight()-1在horizontallines,设置y1和y2=rowheight()-5这样PowerBuilder会自动调整线的坐标,你只需要设置横线的长度和x1,x2的坐标即可。马上Preview一下,看一看效果!你再也不需要因为行的高度发生改变而重新调整线条位置。10如何创建一个报表,如下形式QuantityRunningTotal5,0005,0002,5007,5003,00010,50012,00022,500对于RunningTotal列,我们可使用计算列:CumulativeSum(Quantityforall),即可达到逐渐递增求和的功能。11数据窗口的数据送缓冲区之前确认的四个步骤判断数据类型是否正确。如不正确则触发ItemError事件。判断数据是否符合有效性规则。如不符合有效性规则,同样触发ItemError事件。判断是否有数据被改动。判断数据是否通过ItemChanged事件,如果数据和ItemChanged相斥,将触发ItemError事件。12如何在DataWindow中用数据类型为Datetime的列为条件进行查找1 当要查找的日期条件是一常数时使用如下表达式:ls_Find=datetime_col=DateTime(1/1/1999)2 当要查找的日期条件是一个变量时使用如下的表达式:ls_Find=datetime_col=DateTime(+ls_Date+)3当要查找的日期条件是一个DateTime数据类型时使用如下表达式:ls_Find=datetime_col=DateTime(+String(ldt_DateTime)+)13设置数据窗口Boolean型属性的三种方法PowerBuilder提供了三种方法设置数据窗口的布尔型属性,分别是True/False,1/0,Yes/No。例如:=0=Falsedw_1.Object.address.Visible=No-PowerBuilder在处理上以字符串的形式保存属性,而不考虑属性值是布尔型、长整型或是字符型。为了进一步理解,可以导出一个数据窗口并查看它的原码,可以发现即使是列的颜色属性它也是使用带双引号的数字来表达。14如何在DataWindow中快速删除多行在开发过程中可能经常有要进行多行删除的操作,一般都使用循环语句进行操作:FORll_RowOn=1TOdw_1.RowCount()dw_1.DeleteRow(ll_RowOn)NEXT一个快速的删除方法是把要删除的行从主缓冲区中移到删除缓冲区中。例如,删除缓冲区中所有的行:dw_1.RowsMove(dw_1,1,dw_1.RowCount,Primary!,dw_1,1,Delete!)不过不要忘了过滤的行在不同的缓冲区中。15如何在DataWindow的SQL语法中不使用SELECTDISTINCT实现删除重复的行起先对你要显示唯一值的列进行排序:cityA,然后增加如下过滤字符串:citycity-1orGetRow()=116如何在分组形式的DataWindow中分别显示各组的行号当我们为Datawindow的每一行显示行号时,可以简单的放一个表达式为GetRow()计算列。但是对于分组的Datawindow,要分别显示各组的行号,则应使用表达式为GetRow()-First(GetRow()forGroup1)+1的计算列。17如何改变列的字体颜色,提醒用户此列已做修改在列的Color属性中,输入如下表达式IF(column_namecolumn_name.Original,RGB(255,0,0),RGB(0,0,0)。在这个条件中,如果此列已改变,则显示红色字体,否则显示黑色字体。这个表达式主要用column_namecolumn_name.Original比较当前列的值和原始列的值是否相同来达到判断的目的。18在数据窗口中移走行,但不是去做过滤或删除操作RowsDiscard()函数可做到这一点,它在数据窗口中执行移除工作,但被移走的行它不可被删除或做任何修改性的保存。19如何在多行显示的DataWindow中的FooterBand中显示当前数据的首行和最后行的行号我们先看两个计算列的表达式:IF(GetRow()=First(GetRow()FORPage),1,0)/1为当前页的第一行IF(GetRow()1ANDGetRow()=Last(GetRow()FORPage),1,0)/1为当前页的最后一行由上面可知,在FooterBand中设置如下计算列表达式:Rows+String(First(GetRow()FORPage)+to+String(Last(GetRow()FORPage)+aredisplayed。即可达到这项功能。20使可编辑的数据窗口只读有时,你可能需要将一个用于编程的数据窗口用作显示目的,可以有以下几种方法来实现这一要求:1. 建立两个数据窗口,一个用于编辑,一个用于显示将数据窗口中的全部对象的taborder设置为0.2. 也可以将数据窗口中的列的protect属性设为On或Off,但你不能使用protect属性进行编辑操作数据窗口有一个将datawindow设为只读的属性(readonly),使用它最方便。21数据窗口检查重复行dw_1.SetSort(user_idA)dw_1.Sort()dw_1.SetFilter(user_id=user_id-1)dw_1.Filter()ifdw_1.RowCount()0thenMessagebox(注意,用户编码重复.)endifdw_1.SetFilter()dw_1.Filter()22如何在分组形式的DataWindow中分别显示各组的行号-当我们为Datawindow的每一行显示行号时,可以简单的放一个表达式为GetRow()-计算列。但是对于分组的Datawindow,要分别显示各组的行号,则应使用表达式为GetRow()-First(GetRow()forGroup1)+1的计算列。23如何能让数据窗口的某几列在其他列横拉时固定不动/功能说明:用于冻结左边的滚动栏/变更记录:变更或版本更新的时候/intiifpane=1theni=integer(this.object.datawindow.horizontalscrollposition2)ifi0thenthis.object.datawindow.horizontalScrollPosition=0endifelsei=integer(this.Object.DataWindow.HorizontalScrollSplit)ifiscrollposthenthis.object.datawindow.horizontalScrollPosition2=iendifendif24在数据窗口中如果要使其中一列的属性为只读,也就是不允许用户修改,那么只需简单地将这一列的TableOrder设置成0就可。然而,在有些情况下需要对这一列的某些行修改,而某些行不能修改,这就要用到这一列的protect属性了。打开列的属性中的expression_rs,在protect中输入条件判别式。例如:允许用户修改新增加的记录,而检索出来的记录则不允许修改。条件判别式可以写成如下:if(isRowNew(),0,1)在PowerScript中可以动态修改Protect属性:dw_1.Modify(column_name_here.Protect=1tlf(lsRowNew(),0,1)这样,DataWindow中只有新追加的记录可修改,而其他记录是只读的。25控制DATAWINDOW每页显示的行数1、在Datawindow中增加一个计算域,起名为:ceil_page,此计算域必须放在Detail段中,expression中输入ceiling(getrow()/25)25表示每页打印25行,也可以是一个参数。2、分组,选择菜单RowsCreateGroup,选择ceil_page按ceil_page分组,并选中NewPageOnGroupBreak(意思是新组开始时换页)。3、将此计算域设为隐藏(在属性页中的expression页中在visible属性中写0)。4、补空行:在窗口的open事件中写如下代码:longli_count,li_ili_count=dw_1.retrieve()ifmod(li_count,25)0thenforli_i=1to25-mod(li_count,25)dw_1.insertrow(0)nextendif26数据窗口的closeQuery事件:提示保存数据dw_1.AcceptText()IFdw_1.ModifiedCount()+dw_1.DeletedCount()0THENCHOOSECASEMessageBoX操作提示,数据已经发生变化,是否保存?,Question!,YesNoCancel!,1)CASE1cb_save.TriggerEvent(clicked!)CASE2Return0/不做任何操作直接关闭窗口CASE3Return1不会运行CloseEvent,维持原来的情况ENDCHOOSEENDIF27Getchild函数主要被用来得到一个数据窗口的子数据窗口该函数在两种情况下可以使用,1、取出数据窗口对象的下拉式数据窗口;2、取出复合风格(composite)数据窗口对象里所嵌入的子数据窗口对象。语法:integerdwcontrol.GetChild(stringname,REFDataWindowChilddwchildvariable)例子1这段程序取出一个composite数据窗口对象的两个子数据窗口,并对他们进行过滤,和排序的操作。Stringls_filterDataWindowChilddwc_czrw,dwc_czx定义子数据窗口变量dw_dy.Settransobject(sqlca)dw_dy.Retrieve()dw_dy.GetChild(dw_2,dwc_czrw)dw_dy.Getchild(dw_1,dwc_czx)ls_filter=czrw_bh=+dw_3.GetltemString(dw_3.GetRow(),czrw_bh)+/过滤条件dwc_czrw.SetFilter(ls_filter)dwc_czrw.Filter()ls_filter=czx_rwbh=+dw_3.GetItemString(dw_3.GetRow(),czrw_bh)+dwc_czx.SetSort(czx_sxA)dwc_czx.Sort()dwc_czx.SetFilter(ls_filter)dwc_czx.filter()当然也可以通过数据共享(ShareData)等方式操作子数据窗口中的数据。访问复合数据窗口对象.方法:dw_dy.object.dw_1.object.对象例子2下拉数据窗口动态过滤在数据窗口dw_1的ItemFocusChanged事件中写入如下脚本:IntegerrtncodeStringls_nowFld,ls_deptid,ls_sqlDataWindowChildfld_childrtncode=dw_1.GetChild(Unit_id,fld_child)/获得Unit_id字段名下拉数据窗口的句柄Ifrtncode=-1ThenMessageBox(错误!,不是下拉数据窗口r)fld_child.SetTransObject(SQLCA)/设置事务对象ls_sql=Lower(fld_child.GetSQLSelect()/获得DDDWSQL语句/去除Sql语句中的Where条件子句,如原Sql语句中须有Where条件子句,此处则需进行较/复杂的处理,应视具体情况而定。ifPos(ls_sql,where)0thenls_sql=Left(ls_sql,Pos(ls_sql,where)/重新设置Sql语句中的Where条件子句ls_deptid=dw_1.Object.dept_idGetRow()/取得当前dept_id选定值ls_sql=ls_sql+Wheredept_id=+Trim(ls_deptid)+/重新设置Sql语句fld_child.SetSQLSelect(ls_sql)fld_child.Retrieve()/取得满足条件的数据28从数据窗口中获取数据单条:假设我们要读取dept_id字段的第一笔数据,可以用下列方式表示:li_id=dw_1.object.dept_id1假设我们要读取第一行中第二个字段的数据,可以用下列方式表示:ls_name=dw_1.object.DATA1,2假设我们要读取dept_id字段的所有数据,可以用下列方式表示:li_array=假设我们要读取过滤缓冲区(filterbuffer)内dept_id字段的第一笔数据,可以用下列方式表示:li_id=dw_1.object.dept_id.Filter1-假设我们要读取从第二笔数据的第一个字段到第三笔数据的二个字段之间的数据,表示:lstr_array=dw_1.object.DATA2,1,3,2假设我们要读取整个第二笔的数据,可以用下列方式表示:lstr_dept=dw_1.object.DATA2使用GetItemX()函数x为stringnumber等lstr_name=dw_1.getitemstring(li_count,emp_name)li_count为哪一条多条:stringls_name数据的读取一般格式:数据窗口控件.Retrieve()返回个数,-1为错误增加数据数据窗口控件.InsertRow(行数)参数为0加到最后数据的删除数据窗口控件.Deleterow(行数)数据的过滤l数据窗口控件.SetFilter(条件字符串).数据窗口控件.Filter()用法:将主要缓冲区(PrimaryBuffer)内不符合过滤条件的数据移到过滤缓冲区(FilterBuffer)内。例子:stringls_expls_exp=dept_id=100dw_1.SetFilter(ls_exp)dw_1.Filter()排序dw_1.SetSort(dept_id)dw_1.Sort()将数据从所有的缓冲区(Buffer)中清除dw_1.ReSet()计算数据数目。例如:dw_1.Rowcount()类似:.DeletedCount().ModifiedCount().FilteredCount()数据窗口的滚动数据窗口控件.ScrollToRow(行数)29数据窗口属性改变:描述数据窗口对象本身颜色,可以表示如下:longll_colorll_color=dw_emplist.Describe(DataWindow.Color)描述数据窗口对象内标题dept_id_t的颜色,可以表示如下:longll_colorll_color=dw_emplist.Describe(dept_id_t.Color)修改数据窗口对象本身颜色,可以表示如下:dw_emplist.Modify(DataWindow.Color=255)修改数据窗口对象内标题dept_id的颜色,可以表示如下:dw_emplist.Modify(dept_id_t.Color=255)假设当我们希望在程序运行阶段才给予下行条件:薪水超过50000时显示红色,低于50000时显示黑色。程序的写法如下:ls_modstring=Salary.Color=0tIf(Salary50000,255,0)dw_1.modify(ls_modstring)30得到当前鼠标所指对象所在的带区stringstr_bandstr_band=GetBandAtPointer()/得到当前鼠标所指对象所在的带区str_band=left(str_band,(pos(str_band,t)-1)/得到header、detail等ifstr_bandheaderthenreturn/单击非头区,退出31得到鼠标指向的列对象名str_object=GetObjectAtPointer()/得到当前鼠标所指对象名str_object=left(str_object,(pos(str_object,t)-1)/得到列对象名(默认为列名_t为列标题)str_column=left(str_object,(len(str_title)-2)/判断该名称是否为列名字ifthis.describe(str_column+.band)=!thenreturn/非是列名,即列标题不是按正常规律起名的。32得到当前行、列,总行、列/this针对数据窗口而言li_col=this.GetColumn()li_ColCount=long(describe(this,datawindow.column.count)ll_row=this.GetRow()ll_RowCount=this.RowCount()/设置当前行、列scrolltorow(this,ll_Row)setrow(this,ll_Row)setcolumn(this,li_col)this.SetFocus()33得到所有列标题ll_colnum=Long(dw_1.object.datawindow.column.count)fori=1toll_colnum/得到标题头的名字ls_colname=dw_1.describe(#+string(i)+.name)+_tls_value=dw_1.describe(ls_colname+.text)next34如何用代码取得数据窗口汇总带计算列的值Stringls_valuels_value=dw_1.Describe(uate(compute_1,1)女如果是数值型,要转换。-35取得单击的列标题、列名、数据库字段名stringls_dwolongll_posstringls_typestringls_titlestringls_columnstringls_dbnameifNotKeyDown(KeyControl!)thenreturnls_dwo=dwo.Nameiftrim(ls_dwo)=orisnull(ls_dwo)thenreturnls_type=This.describe(ls_dwo+.type)标题数据窗口列名数据库中字段名ifls_type=columnthenls_title=This.describe(ls_dwo+_t.text)ls_column=This.describe(ls_dwo+.Name)/ls_dbname=This.describe(ls_dwo+.dbname)/messagebox(信息标题文本:+ls_title+&rn数据窗口列名:+ls_column+&rn数据库中字段名:+ls_dbname)endif36窗口为w_gcde内,放入一个DW_1如何得到dw_1内的某列值yuonghu_id列的内容方法:longlng_column_countintegeristringstr_column/列名stringstr_column_text/text的名字/得到数据窗口的总列数lng_column_count=long(dw_1.Describe(DataWindow.Column.Count)/循环依次读取fori=1tolng_column_countstr_columni=dw_1.Describe(#+string(i)+.name)str_column_texti=dw_1.Describe(str_columni+_t.text)next37在DDDV中实现当前高亮行随鼠标移动DataWindowChildldwc_ChildStringls_PointerLongll_RowGetChild(dept_id,ldwc_Child)/Replacethecolumnnamedept_idasyouneededIFhwndchild=Handle(ldwc_child)THENifnotificationcode=2311then/DDDW的mousemove事件/得到鼠标所在行ls_Pointer=ldwc_Child.GetObjectAtPointer()ll_Row=Long(Mid(ls_Pointer,Pos(ls_Pointer,t)+1)/移到鼠标所在行IFldwc_Child.GetRow()ll_RowANDll_Row0THENldwc_Child.ScrollToRow(ll_Row)ENDIFendifENDIF38实现打印完一个DataWindow后不换页首先将datawindow的print输出到一个打印文件中,把其他的print也输入这个prn,然后,打印这个打印文件就行了如:datawindow_control1.object.datawindow.print.filename=c:printfilepathexam_1.prndatawindow_control2.object.datawindow.print.filename=c:printfilepathexam_1.prndw_1.print()dw_2.print()run(printd:printservenamesharenamec:printfilepathexam_1.prn)d:printservenamesharename打印机名
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 活动策划


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

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


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