60个PB数据窗口技巧.docx
《60个PB数据窗口技巧.docx》由会员分享,可在线阅读,更多相关《60个PB数据窗口技巧.docx(26页珍藏版)》请在冰豆网上搜索。
60个PB数据窗口技巧
60个数据窗口技巧
1.如何让存储文件目录的列,显示图片?
答:
选择对应的column的displayaspicture属性为true
2、如何复制grid类型的所选择的行的数据到系统剪切板?
答:
stringls_selected
ls_selected=dw_1.Object.DataWindow.Selected.Data
clipboard(ls_selected)
3、如何复制graph风格的datawindow中的图形到剪切板?
答:
dw_1.clipbord("gr_1")
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_abc
ldwo_use=dw_1.Object
ldwo_abc=ldwo_use.__get_attribute("t_1",FALSE)//t_1为datawindow中text对象的名称
注﹕不是版本的问题,是你没找对位置。
在PB的browser中,展开任意放置了datawindow控件的窗口,然后展开datawindow出现dwobject,右边的函数部分就可以看到这几个函数。
因为它的参数从字面上无法猜测出其含义,而帮助上没讲,所以有此一问。
你从哪儿找到这些函数的?
我只知道__get_attribute()。
pb7.0以前的版本这些函数的形式为get_attribute(),没有前面的两个横线。
dwobject ldwo_object,ldwo_object_item
ldwo_object= dw_1.object
ldwo_object_item=ldwo_object.__get_attribute('objectname',false)
参数中的objectname是datawindow中对象的名字,如列名等。
这样可以根据列名得到该列对应的dwo,就跟在datawindow的click事件中的dwo参数一样。
12、如何使用datawindow的查询模式?
答:
dw_1.Object.DataWindow.QueryMode='yes'将datawindow改变为查询模式后,接收用户的输入,再使用一下代码获取结果:
dw_1.accepttext()
dw_1.retrieve()
13、如何缩放datawindow的打印大小?
答:
dw_1.OBJECT.datawindow.zoom=150ordw_1.OBJECT.datawindow.zoom=75
14、如何在已过滤后的数据基础上对datawindow进行过滤?
答:
dw_1.setfilter(dw_1.describe("datawindow.table.filter")+your_join+your_new_filter)
dw_1.filter()
15、如何在datawindow中显示动态时间?
答:
建立一个计算域,表达式为string(datetime(today(),now()),'yyyy年mm月dd日hh点mm分ss秒'),同时设置datawindow的属性dw_1.Object.DataWindow.Timer_Interval=500
16、如何让带用titlebar的datawindow控件的标题栏诚活动窗口的颜色?
答:
外部函数定义:
functionlongSetActiveWindow(longhwnd)Library"user32.dll"
datawindow控件的clicked事件代码:
setactivewindow(handle(this))
17、如何设置datawindow的当前行指示图标?
答:
在datawindow中建立一个计算列,expression为'',并将该计算列移动为datawindow的第一个列,在datawindow控件的
rowfocuschanged事件中写入代码:
SetRowFocusIndicator(hand!
)或setrowfucsindicator(p_1)//p_1为窗口上的picture控件名
18、如何通过代码打开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键
19、如何打印datawindow的内容到文件中?
答:
dw_1.OBJECT.datawindow.print.fileName="c:
\temp.prn"
dw_1.print()
20、如何设置dddw的初始值?
答:
dw_1.OBJECT.columnname.Initial="your_initial_value"
21、如何只显示不同的数据?
答:
dw_1.filter("isnull(columnname[-1])andcolumnname<>columnname[-1]")
dw_1.filter()
22、如何让带有titlebar的datawindow不可以移动?
答:
在datawindow的自定义事件ue_nchittest(pbm_nchittest)中写入如下代码:
return1
23、如何在N-UP显示风格中建立基于第N栏中的列的计算列?
答:
如column有两列,number和price,并显示为两栏,则第一栏的cost计算列的expression为number*price,第二栏的cost_1计算列的expression为number[1]*price[1]
24、如何清空ddlb或edit.codetable中项目?
答:
dw_1.Object.columnname.Values=""
25、如何实现指定的column的字体旋转90度?
答:
dw_1.OBJECT.columnname.font.Escapement="900"
26、如何获取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_control.OBJECT.datawindow.print.orientation=129、如何进行预览:
dw_control.OBJECT.datawindow.print.preview="yes"
30、如何连续在同一张纸打印两个数据窗口?
答:
dw_1.OBJECT.datawindow.print.filename="temp.prn"
dw_2.OBJECT.datawindow.print.filename="temp.prn"
dw_1.print()
dw_2.print()
31、如何将pb9.0的datawindow转化为pb8.0版本的datawindow?
答:
editsource将release9;改为release8;
并删除以下内容:
print.printername=""
print.canusedefaultprinter=yes
print.cliptext=noprint.overrideprintjob=no
hidegrayline=no
encodeselflinkargs="1"
export.xml(headgroups="1"includewhitespace="0"metadatatype=0savemetadata=0)
import.xml()
export.pdf(method=0distill.custompostscript="0"xslfop.print="0")
32、如何设置datawindow分组后每个分组中的记录号?
答:
建立一个计算列,expression为getrow()-first(getrow()forgroup1)+1
33、如何实现在datawindow中只有新增的行,才可以编辑?
答:
在所有的column的protect属性表达式中写入以下表达式:
if(isrownew(),'0','1')
34、保存datawindow数据到excel中
//...Initdocname
//...GetFileOpenNameoranyothermethodifdw_1.SaveAs(docname,HTMLTable!
True)=-1then
MessageBox("Warning","Unabletoexportdata.Errorwritingtofile!
",Exclamation!
)
return
endif//ConvertHTMLfiletoExcelnativeformat
OLEObjectexcel
excel=CREATEOLEObject
ifexcel.ConnectToObject(docname)=0then
excel.application.DisplayAlerts=FALSE
excel.application.workbooks
(1).Parent.Windows(excel.application.workbooks
(1).Name).Visible=True
excel.application.workbooks
(1).saveas(docname,39)
excel.application.workbooks
(1).close()
endifDESTROYexcel
//done35、除了循环以外,有没有更好的方法统计数据窗口中处于选中状态的行数?
一般习惯于使用循环来统计数据窗口中处于选中状态的行数,有没有更好的方法?
其实此问题在应用上用处不大,讨论一下,活跃一下思维还是有好处的。
方法一:
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)
36、问:
怎么让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()37、怎样将数据窗口(free格式)中的内容转成word文档
答:
给你两个函数:
(1)、辅助函数
$PBExportHeader$f_cncharnum.srf
$PBExportComments$得到字符串中汉字或者双字节的个数
globaltypef_cncharnumfromfunction_OBJECT
endtypeforwardprototypes
globalfunctionintegerf_cncharnum(stringaString)
endprototypesglobalfunctionintegerf_cncharnum(stringaString);
//函数名:
f_cncharnum
//用途:
返回一个字符串中汉字的个数
//输入:
aString-string,给定的字符串
//返回值:
li_num-Integer,给定的字符串中汉字的个数
//注意:
1.此方法基于汉字的国标汉字库区位编码的有效性,不符合此编码的系统此函数无效!
//2.若汉字串含有非汉字字符,如图形符号或ASCII码,则这些非汉字字符将保持不变.
//例如:
li_ret=f_cncharnum("摆渡人ferryman")li_ret=3stringls_ch//临时单元
stringls_SecondSecTable//存放所有国标二级汉字读音
integerli_num=0//返回值
integeri,jFori=1toLen(aString)
ls_ch=Mid(aString,i,1)
IfAsc(ls_ch)>=128then//是汉字
li_num++
i=i+1
Endif
NextReturnli_numendfunction---------------------------------------------------------------
(2)、转到WORD
$PBExportHeader$f_outputtoword_new.srf
globaltypef_outputtoword_newfromfunction_OBJECT
endtypeforwardprototypes
globalfunctionintegerf_outputtoword_new(datawindowadw)
endprototypesglobalfunctionintegerf_outputtoword_new(datawindowadw);
//函数名:
f_outputtoword_new
//输入:
adw-datawindow,指定的数据窗口
//返回值:
Integer
constantintegerppLayoutBlank=12
OLEObjectole_OBJECT
ole_OBJECT=CREATEOLEObjectintegerli_retli_ret=ole_OBJECT.ConnectToObject("","word.application")
IFli_ret<>0THEN
//如果Word还没有打开,则新建。
li_ret=ole_OBJECT.ConnectToNewObject("word.application")
ifli_ret<>0then
MessageBox('OLE错误','OLE无法连接!
错误号:
'+string(li_ret))
return0
endif
ole_OBJECT.Visible=True
ENDIFlongll_colnum,ll_rownum
constantlongwdWord9TableBehavior=1
constantlongwdAutoFitFixed=0
constantlongwdCell=12
stringls_value
pointeroldpointeroldpointer=SetPointer(HourGlass!
)stringls_OBJECTs,ls_obj,ls_objs[],ls_objtag[]
longll_pos,ll_len,ll_num=0ls_OBJECTs=trim(adw.Describe('datawindow.Objects'))dowhile(pos(ls_OBJECTs,"~t")>0)
ll_pos=pos(ls_OBJECTs,"~t")
ll_len=ll_pos-1
ls_obj=left(ls_OBJECTs,ll_len)
if(adw.Describe(ls_obj+'.type')='column'or&
adw.Describe(ls_obj+'.type')='compute')and&
(adw.Describe(ls_obj+'.band')='detail')and(ls_obj<>"asd")then
ll_num+=1
ls_objs[ll_num]=ls_obj
ls_objtag[ll_num]=adw.Describe(ls_obj+'.tag')
endif
ls_OBJECTs=right(ls_OBJECTs,len(ls_OBJECTs)-ll_pos)
loop//得到数据窗口数据的列数与行数(行数应该是数据行数+1)
ll_colnum=ll_num
ll_rownum=adw.rowcount()+1ole_OBJECT.Documents.Add()
ole_OBJECT.ActiveDocument.Tables.Add(ole_OBJECT.Selection.Range,ll_rownum,ll_colnum)stringls_colname
integeri,j,kfori=1toll_colnum
//得到标题头的名字
ls_value=ls_objtag
ole_OBJECT.Selection.TypeText(ls_value)
fork=1tof_cncharnum(ls_value)
ole_OBJECT.Selection.TypeB