pb中datawindow常用技巧.docx
《pb中datawindow常用技巧.docx》由会员分享,可在线阅读,更多相关《pb中datawindow常用技巧.docx(16页珍藏版)》请在冰豆网上搜索。
![pb中datawindow常用技巧.docx](https://file1.bdocx.com/fileroot1/2022-12/7/8ed14c05-0110-4aa3-b1df-ef6071884a5d/8ed14c05-0110-4aa3-b1df-ef6071884a5d1.gif)
pb中datawindow常用技巧
pb中datawindow常用技巧一
(2009-04-1617:
09:
07)
转载▼
标签:
杂谈
分类:
PowerBuilder
pb中datawindow常用技巧一
1、如何让存储文件目录的列,显示图片?
答:
选择对应的column的displayaspicture属性为true
2、如何复制grid类型的所选择的行的数据到系统剪切板?
答:
stringls_selected
ls_selected=dw_1.Object.DataWindow.Selected.Data
clipbord(ls_selected)
4、如何设置的DW底色?
在DW的editsource中改变color的值
5、如何将Grid风格改成自由格式?
在DW的editsource中将processing=1的1改为0
6、要新建一个表A但风格和现有表格B风格一样,怎么将A表快速设置成表B风格?
复制B表C,在C表的DW中的editsource中将表名和字段名改成A表的,即可
7、如何实现gird风格的datawindow的多栏表头?
答:
添加text到header带区,并设置band属性为foreground保存,editsource修改text的x和width属性表达式如下:
x="100~tinteger(describe('firstcol.x')"width="100~tinteger(describe('lastcol.x'))-integer(describe('firstcol.x'))+integer(describe('lastcol.width'))
8、如何过滤dddw编辑风格的显示值为指定值的记录?
答:
dw_1.setfilter("lookupdisplay('column_name')='"+ls_display_value_your+"'")
dw_1.filter()
9、如何设置datawindow的某一列为空?
答:
stringls_temp[]
setnull(ls_temp)
dw_1.object.columnname.primary.current=ls_temp
10、如何设置datawindow的单双行不同颜色间隔?
答:
在detail带区的color属性表达式中写上if(mod(getrow(),2)=1,rgb(255,0,0),rgb(0,255,0)),如果是当前行以第三种颜色表示,表达式如下:
if(getrow()=current(),rgb(255,0,0),if(mod(getrow(),2)=1,rgb(0,0,255),rgb(0,255,0)))
11、如何获取指定名称的datawindowobject?
答:
DWObjectldwo_use,ldwo_abcldwo_use=dw_1.Objectldwo_abc=ldwo_use.__get_attribute("t_1",FALSE)//t_1为datawindow中text对象的名称
12、如何缩放datawindow的打印大小?
答:
dw_1.object.datawindow.zoom=150ordw_1.object.datawindow.zoom=75
13、如何在已过滤后的数据基础上对datawindow进行过滤?
答:
dw_1.setfilter(dw_1.describe("datawindow.table.filter")+your_join+your_new_filter)
dw_1.filter()
14、如何在datawindow中显示动态时间?
答:
建立一个计算域,表达式为string(datetime(today(),now()),'yyyy年mm月dd日hh点mm分ss秒'),同时设置datawindow的属性dw_1.Object.DataWindow.Timer_Interval=500
15、如何让带用titlebar的datawindow控件的标题栏诚活动窗口的颜色?
答:
外部函数定义:
funcationlognSetActiveWindow(longhwnd)Library"user32.dll"
datawindow控件的clicked事件代码:
setactivewindow(handle(this))
16、如何设置datawindow的当前行指示图标?
答:
在datawindow中建立一个计算列,expression为'',并将该计算列移动为datawindow的第一个列,在datawindow控件的
rowfocuschanged事件中写入代码:
SetRowFocusIndicator(hand!
)或setrowfucsindicator(p_1)//p_1为窗口上的picture控件名
17、如何通过代码打开dddw?
答:
定义外部函数引用声明
SUBROUTINEkeybd_event(intbVk,intbScan,intdwFlags,intdwExtraInfo)LIBRARY"user32.dll"
代码如下:
[constantintegerVK_F4=115
dw_1.SetFocus()
dw_1.SetColumn("dept_head_id")//设置当前dddw
keybd_event(VK_F4,0,0,0)//按下F4键
keybd_event(VK_F4,0,2,0)//释放F4键
18、如何打印datawindow的内容到文件中?
答:
dw_1.object.datawindow.print.fileName="c:
\temp.prn"
dw_1.print()
19、如何设置dddw的初始值?
答:
dw_1.object.columnname.Initial="your_initial_value"
20、如何只显示不同的数据?
答:
dw_1.filter("isnull(columnname[-1])andcolumnname<>columnname[-1]")
dw_1.filter()
21、如何让带有titlebar的datawindow不可以移动?
答:
在datawindow的自定义事件ue_nchittest(pbm_nchittest)中写入如下代码:
return1
22、如何在N-UP显示风格中建立基于第N栏中的列的计算列?
答:
如column有两列,number和price,并显示为两栏,则第一栏的cost计算列的expression为number*price,第二栏的cost_1计算列的expression为number[1]*price[1]
23、如何清空ddlb或edit.codetable中项目?
答:
dw_1.Object.columnname.Values=""
24、如何实现指定的column的字体旋转90度?
答:
dw_1.object.columnname.font.Escapement="900"
25、如何获取datawindow的sql代码?
答:
可以通过以下四种方法获取sql代码:
stringszselect
szselect=dw_1.describe("datawindow.table.select")
szselect=dw_1.describe("datawindow.table.sqlselect")
szselect=dw_1.describe("datawindow.table.select.attribute")
szselect=dw_1.getsqlselect()
27、如何获取datawindow对象占有的虚拟存储的容量?
答:
使用datawindow.storage属性
举例:
在datawindow控件的retrieverow事件中,写如如下代码:
longlstorage
lstorage=long(dw_1.object.datawindow.storage)
iflstorage>50000thendbcancel()
28、如何连续在同一张纸打印两个数据窗口?
答:
dw_1.object.datawindow.print.filename="temp.prn"
dw_2.object.datawindow.print.filename="temp.prn"
dw_1.print()
dw_2.print()
29、如何设置datawindow分组后每个分组中的记录号?
答:
建立一个计算列,expression为getrow()-first(getrow()forgroup1)+1
30、如何实现在datawindow中只有新增的行,才可以编辑?
答:
在所有的column的protect属性表达式中写入以下表达式:
if(isrownew(),'0','1')
31、除了循环以外,有没有更好的方法统计数据窗口中处于选中状态的行数?
一般习惯于使用循环来统计数据窗口中处于选中状态的行数,有没有更好的方法?
其实此问题在应用上用处不大,讨论一下,活跃一下思维还是有好处的。
方法一:
longll_Selectedll_Selected=long(dw_1.describe("evaluate('sum(if(IsSelected(),1,0)forall)',1)"))
方法二:
longll_Selectedll_Selected=long(dw_1.describe("evaluate('count(IsSelected()forall)',1)"))
方法三:
upperbound(dw_1.Object.Data.Selected)
32、问:
怎么让PB只打印当前记录,是用Free格式制作的数据窗口!
---------------------------------------------------------------
答:
DataStoreldt_temp
longll_Row,ll_Rows
ll_Rows=dw_XX.Rowcount()
Ifll_Rows=0ThenGoTothe_end
Ifll_Rows=1Then
dw_XX.Print()
GoTothe_end
Endif
dw_XX.SetRedraw(False)
ldt_temp=CreateDataStore
ldt_temp.DataObject=dw_XX.DataObject
ll_Row=dw_XX.GetRow()
dw_XX.RowsMove(1,ll_Rows,Primary!
ldt_temp,1,Primary!
)
ldt_temp.RowsMove(ll_Row,ll_Row,Primary!
dw_XX,1,Primary!
)
dw_XX.Print()
dw_XX.RowsMove(1,1,Primary!
ldt_temp,ll_Row,Primary!
)
ldt_temp.RowsMove(1,ll_Rows,Primary!
dw_XX,1,Primary!
)
Destroyldt_temp
dw_XX.SetRedraw(True)
the_end:
//只用将上述脚本拷入到打印部分即可,dw_XX为被打印的free型数据窗口,该方法可保证dw_XX中的数据在打印前后包括sort等属性均不发生任何改变,但效率较低,不宜用在数据量太大的数据窗口中,当然,考虑到打印本身速度就比较慢,所以3000行数据是可以采用这种方法并让用户接受的。
若在同一窗口上存在与dw_XX共享的grid数据窗口并且与dw_XX同时显示,则需要与dw_one一起SetRedraw()
38、字段如何自动换行的同时且自动高度?
答:
将数据窗口中相应列的autohorzscroll为不选中,选中autosizeheight将detail的autosizeheight选中。
在数据窗口retrieve后调用下面函数即可uf_set_text(datawindowadw_content,stringas_columns,boolean,ab_ignoreblank)if(notisvalid(adw_content))orisnull(as_columns)orlen(as_columns)<1orisnull(ab_ignoreblank)thenreturn-1n_cst_stringlnv_stringstringls_column[],ls_width,as_source,as_replaced,ls_tempintli_upperbound,li_width,li_column,li_fontWidth,li_counterlongll_rowcount,ll_row,ll_totalstepintli_yieldlnv_string.of_parsetoarray(as_columns,',',ls_column)li_upperbound=upperbound(ls_column)ll_rowcount=adw_content.rowcount()ifli_upperbound<1orll_rowcount<1thenreturn-1openwithparm(w_waiting,this)ib_cancel=falseiw_frame.enabled=falsell_totalstep=ll_rowcount*li_upperboundw_waiting.uf_register(ll_totalstep)forli_column=1toli_upperboundls_width=adw_content.describe(ls_column[li_column]+".width")li_width=integer(ls_width)ifls_width='!
'orls_width='?
'orli_width=0thencontinueendif//ls_temp=adw_content.describe(ls_column[li_column]+".Font.property{='width'}")//messagebox(ls_column[li_column]+".Font.property{='width'}",ls_temp)//return1li_fontwidth=27li_counter=li_width/li_fontWidthforll_row=1toll_rowcountifib_canceltheniw_frame.enabled=truereturn0//pressedcancelbuttonendifas_source=adw_content.getitemstring(ll_row,ls_column[li_column])as_replaced=uf_insertstring(as_source,li_counter,'',false)ifas_replaced<>as_sourcethenadw_content.setitem(ll_row,ls_column[li_column],as_replaced)endifw_waiting.uf_stepit()nextnextclose(w_waiting)iw_frame.enabled=truereturn1
39、如何使dw的列不可移动,不可调整列宽?
答:
在datawindow的cilcked事件写ifrow=0thenreturn1endif
40.光标跳转到数据窗口的某一行某一列
dw_1.scrolltorow(ll_row)dw_1.setcolumn(ll_column)
41如何使光标指向每页第一行?
longll_firstrowonpage=long(dw_1.describe("datawindow.firstrowonpage"))
dw_1.scrolltorow(ll_firstrowonpage)
dw_1.setrow(ll_firstrowonpage)
42.Grid的窗口如何使第一列固定不动?
①选上dataOBJECT的HSplitScroll属性②在constructor事件中:
dw_1.Object.DataWindow.HorizontalScrollSplit=integer(dw_1.describe("#1.width"))//第一列的宽度③在scrollhorizontal事件中:
inti
ifpane=1then
i=integer(this.OBJECT.datawindow.horizontalscrollposition2)
ifi<1orisnull(i)thenreturn
ifscrollpos>0then
this.OBJECT.datawindow.horizontalScrollPosition=0
endif
else
i=integer(this.Object.DataWindow.HorizontalScrollSplit)
ifi<1orisnull(i)thenreturn
ifi>scrollposthen
this.OBJECT.datawindow.horizontalScrollPosition2=i
endif
endif
pb中datawindow常用技巧二
(2009-04-1617:
11:
40)
转载▼
标签:
杂谈
分类:
PowerBuilder
1使DataWindow列只能追加不能修改
如何使DataWindow中的数据只能追加新记录而不能修改,利用Column的Protect属性可以很方便的做到这一点,方法如下:
将每一列的Protect属性设置为:
If(IsRowNew(),0,1))
在PowerScript中可以动态修改Protect属性:
dw_1.Modify("column_name_here.Protect='1~tIf(IsRowNew(),0,1)'")
这样,DataWindow中只有新追加的记录可修改,而其他记录是只读的。
2如何在DataWindow中实现列的自动折行
我们在PowerBuilder应用程序的开发过程中,使用DataWindow时,经常会遇
到某列的数据太长,不能同时全部显示的情况.若采用自动水平滚动,操作起
来又不够简便.下面介绍一种方法,实现列数据多行显示,即实现列数据的自
动折行.具体步骤如下:
1)在DataWindowPainter中打开此DataWindow.
2)在需设定自动折行的列上双击鼠标,弹开此列的属性窗口.
3)选择Position标签,选中AutosizeHeight多选框.
4)选择Edit标签,不选中AutoHorzScroll多选框.
5)单击OK按钮,保存所做的修改.
6)点中DetailBand(即写有Detail的灰色长带),单击鼠标右键,选择
Properties...菜单项.
7)选中AutosizeHeight多选框.
8)单击OK按钮,保存所做的修改.
9)保存此DataWindow.
注意:
连在一起的汉字(中间没有标点或空格分隔),系统将认为是一个单词,不
会自动进行折行.
3在数据窗口中实现动画
要实现动画,必须要有定时器,在数据窗口中已经有了一个定时器,双击数据窗口将弹出的对话框,在TimerInterval中定义大于零的值就有定时器(可以精确到毫秒),有了这个定时器就可以实现动画了。
比如要改变某字段的背景颜色,可设
ackgound.color=RGB(Integer(Right(string(now(),'hhmmssf'),1))*256/10,Integer(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事件的处理,代码如下:
ifrow<1thenreturn//setredraw(false)
ifthis.object.flag[row]=1then//如果该行被选中,撤销选择,否则选中该行
this.Object.flag[row]=0
else
this.Object.flag[row]=1
endif
setredraw(true)
您还可以定制本选中行的字体,文本属性等等。
原理相同,不再赘述。
5将日期型字段初始化为当天的日期
使用ColumnSpecifications对话框来设置数据的初始值是一个比较好又比较通用的方法。
为了将日期型字段初始化为当天的日