内容发布更新时间 : 2024/12/26 14:00:02星期一 下面是文章的全部内容请认真阅读。
PB数据窗口datawindow技术更新时间:2014-2-1 17:17:10pb数据窗口datawindow常用技巧1、如何让存储文件目录的列,显示图片?答:选择对应的column的display as picture属性为true2、如何复制grid类型的所选择的行的数据到系统剪切板?答:string ls_selectedls_selected=dw_1.object.datawindow.selected.dataclipbord(ls_selected)3、如何复制graph风格的datawindow中的图形到剪切板?答:dw_1.clipbord(\、如何设置的dw底色?在dw的editsource中改变color的值5、如何将grid风格改成自由格式?在dw的editsource中将processing=1的1改为06、要新建一个表a但风格和现有表格b风格一样,怎么将a表快速设置成表b风格?复制b表c,在c表的dw中的editsource中将表名和字段名改成a表的,即可7、如何实现gird风格的datawindow的多栏表头?答:添加 text到header带区,并设置band属性为foreground保存,edit source 修改text的x和width属性表达式如下:x=\e('firstcol.x')) +integer(describe('lastcol.width'))8、如何过滤dddw编辑风格的显示值为指定值的记录?答:dw_1.setfilter(\、如何设置datawindow的某一列为空?答:string ls_temp[]setnull(ls_temp)dw_1.object.columnname.primary.current=ls_temp10、如何设置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?答:dwobject ldwo_use,ldwo_abc ldwo_use = dw_1.object ldwo_abc = ldwo_use.__get_attribute(\1\为datawindow中text对象的名称12、如何使用datawindow的查询模式?答:dw_1.object.datawindow.querymode='yes'将datawindow改变为查询模式后,接收用户的输入,再使用一下代码获取结果:dw_1.accepttext()dw_1.retrieve()13、如何缩放datawindow的打印大小?答:dw_1.object.datawindow.zoom=150 or dw_1.object.datawindow.zoom=7514、如何在已过滤后的数据基础上对datawindow进行过滤?答:dw_1.setfilter(dw_1.describe(\15、如何在datawindow中显示动态时间?答:建立一个计算域,表达式为string(datetime(today(),now()),'yyyy年mm月dd日 hh点mm分ss秒'),同时设置datawindow的属性dw_1.object.datawindow.timer_interval=50016、如何让带用title bar的datawindow控件的标题栏诚活动窗口的颜色?答:外部函数定义:funcation logn setactivewindow(long hwnd ) library \常用技巧2008年01月17日 星期四 11:171、如何让存储文件目录的列,显示图片?答:选择对应的column的display as picture属性为true2、如何复制grid类型的所选择的行的数据到系统剪切板?答:string ls_selectedls_selected=dw_1.object.datawindow.selected.dataclipbord(ls_selected)3、如何复制graph风格的datawindow中的图形到剪切板?答:dw_1.clipbord(\、如何设置的dw底色?在dw的editsource中改变color的值5、如何将grid风格改成自由格式?在dw的editsource中将processing=1的1改为06、要新建一个表a但风格和现有表格b风格一样,怎么将a表快速设置成表b风格?复制b表c,在c表的dw中的editsource中将表名和字段名改成a表的,即可7、如何实现gird风格的datawindow的多栏表头?答:添加 text到header带区,并设置band属性为foreground保存,edit source 修改text的x和width属性表达式如下:x=\
e('firstcol.x')) +integer(describe('lastcol.width'))8、如何过滤dddw编辑风格的显示值为指定值的记录?答:dw_1.setfilter(\、如何设置datawindow的某一列为空?答:string ls_temp[]setnull(ls_temp)dw_1.object.columnname.primary.current=ls_temp10、如何设置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?答:dwobject ldwo_use,ldwo_abc ldwo_use = dw_1.object ldwo_abc = ldwo_use.__get_attribute(\1\为datawindow中text对象的名称12、如何使用datawindow的查询模式?答:dw_1.object.datawindow.querymode='yes'将datawindow改变为查询模式后,接收用户的输入,再使用一下代码获取结果:dw_1.accepttext()dw_1.retrieve()13、如何缩放datawindow的打印大小?答:dw_1.object.datawindow.zoom=150 or dw_1.object.datawindow.zoom=7514、如何在已过滤后的数据基础上对datawindow进行过滤?答:dw_1.setfilter(dw_1.describe(\15、如何在datawindow中显示动态时间?答:建立一个计算域,表达式为string(datetime(today(),now()),'yyyy年mm月dd日 hh点mm分ss秒'),同时设置datawindow的属性dw_1.object.datawindow.timer_interval=50016、如何让带用title bar的datawindow控件的标题栏诚活动窗口的颜色?答:外部函数定义:funcation logn setactivewindow(long hwnd ) library \常用技巧2008年01月17日 星期四 11:171、如何让存储文件目录的列,显示图片?答:选择对应的column的display as picture属性为true2、如何复制grid类型的所选择的行的数据到系统剪切板?答:string ls_selectedls_selected=dw_1.object.datawindow.selected.dataclipbord(ls_selected)3、如何复制graph风格的datawindow中的图形到剪切板?答:dw_1.clipbord(\、如何设置的dw底色?在dw的editsource中改变color的值5、如何将grid风格改成自由格式?在dw的editsource中将processing=1的1改为06、要新建一个表a但风格和现有表格b风格一样,怎么将a表快速设置成表b风格?复制b表c,在c表的dw中的editsource中将表名和字段名改成a表的,即可7、如何实现gird风格的datawindow的多栏表头?答:添加 text到header带区,并设置band属性为foreground保存,edit source 修改text的x和width属性表达式如下:x=\e('firstcol.x')) +integer(describe('lastcol.width'))8、如何过滤dddw编辑风格的显示值为指定值的记录?答:dw_1.setfilter(\、如何设置datawindow的某一列为空?答:string ls_temp[]setnull(ls_temp)dw_1.object.columnname.primary.current=ls_temp10、如何设置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?答:dwobject ldwo_use,ldwo_abc ldwo_use = dw_1.object ldwo_abc = ldwo_use.__get_attribute(\1\为datawindow中text对象的名称12、如何使用datawindow的查询模式?答:dw_1.object.datawindow.querymode='yes'将datawindow改变为查询模式后,接收用户的输入,
再使用一下代码获取结果:dw_1.accepttext()dw_1.retrieve()13、如何缩放datawindow的打印大小?答:dw_1.object.datawindow.zoom=150 or dw_1.object.datawindow.zoom=7514、如何在已过滤后的数据基础上对datawindow进行过滤?答:dw_1.setfilter(dw_1.describe(\15、如何在datawindow中显示动态时间?答:建立一个计算域,表达式为string(datetime(today(),now()),'yyyy年mm月dd日 hh点mm分ss秒'),同时设置datawindow的属性dw_1.object.datawindow.timer_interval=50016、如何让带用title bar的datawindow控件的标题栏诚活动窗口的颜色?答:外部函数定义:funcation logn setactivewindow(long hwnd ) library \文档答:给你两个函数: 1、辅助函数 $pbexportheader$f_cncharnum.srf $pbexportcomments$得到字符串中汉字或者双字节的个数 global type f_cncharnum from function_object end type forward prototypes global function integer f_cncharnum (string astring) end prototypes global function integer f_cncharnum (string astring); //函数名: f_cncharnum //用途: 返回一个字符串中汉字的个数 //输入: astring - string, 给定的字符串 //返回值: li_num - integer, 给定的字符串中汉字的个数 //注意: 1. 此方法基于汉字的国标汉字库区位编码的有效性,不符合此编码的系统此函数无效! // 2. 若汉字串含有非汉字字符,如图形符号或ascii码,则这些非汉字字符将保持不变. //例如: li_ret = f_cncharnum(\摆渡人ferryman\临时单元 string ls_secondsectable //存放所有国标二级汉字读音 integer li_num = 0 //返回值 integer i,j for i = 1 to len(astring) ls_ch = mid(astring,i,1) if asc(ls_ch) >= 128 then //是汉字 li_num++ i = i+1 end if next return li_num end function --------------------------------------------------------------- 2、转到word $pbexportheader$f_outputtoword_new.srf global type f_outputtoword_new from function_object end type forward prototypes global function integer f_outputtoword_new (datawindow adw) end prototypes global function integer f_outputtoword_new (datawindow adw); //函数名:f_outputtoword_new //输入: adw - datawindow,指定的数据窗口 //返回值: integer constant integer pplayoutblank = 12 oleobject ole_object ole_object = create oleobject integer li_ret li_ret = ole_object.connecttoobject(\如果word还没有打开,则新建。 li_ret = ole_object.connecttonewobject(\ole错误','ole无法连接!错误号:' + string(li_ret)) return 0 end if ole_object.visible = true end if long ll_colnum,ll_rownum constant long wdword9tablebehavior = 1 constant long wdautofitfixed = 0 constant long wdcell = 12 string ls_value pointer oldpointer oldpointer = setpointer(hourglass!) string ls_objects,ls_obj,ls_objs[],ls_objtag[] long ll_pos,ll_len,ll_num = 0 ls_objects = trim(adw.describe('datawindow.objects')) do while (pos(ls_objects,\cts,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 <> \[ll_num] = ls_obj ls_objtag[ll_num] = adw.describe(ls_obj + '.tag') end if ls_objects = right(ls_objects,len(ls_objects) - ll_pos) loop //得到数据窗口数据的列数与行数(行数应该是数据行数 + 1) ll_colnum = ll_num ll_rownum = adw.rowcount() + 1 ole_object.documents.add() ole_object.activedocument.tables.add(ole_object.selection.range, ll_rownum, ll_colnum) string ls_colname integer i,j,k for i = 1 to ll_colnum //得到标题头的名字 ls_value = ls_objtag[i] ole_object.selection.typetext(ls_value) for k = 1 to f_cncharnum(ls_valu
e) ole_object.selection.typebackspace() next ole_object.selection.moveright(wdcell) next adw.setredraw(false) ole_object.selection.moveleft(wdcell) string column_name for i = 2 to ll_rownum for j = 1 to ll_colnum column_name = ls_objs[j] if adw.describe(column_name + '.type') = 'column' then ls_value = adw.describe(\if if adw.describe(column_name + '.type') = 'compute' then ls_value = adw.describe(\ adw.describe(column_name + '.expression') + \veright(wdcell) ole_object.selection.typetext(ls_value) //for k = 1 to f_cncharnum(ls_value) //ole_object.selection.typebackspace() //next next next adw.setredraw(true) constant long wdformatdocument = 0 setpointer(oldpointer) //保存新建的文档 if messagebox(\保存\文档已经成功完成,是否保存?\选择文件\saveas(docname, 0,false,\断开ole连接 ole_object.disconnectobject() destroy ole_object return 1 end function38、字段如何自动换行的同时且自动高度?答:将数据窗口中相应列的auto horz scroll 为不选中,选中autosize height 将detail的autosize height选中。在数据窗口retrieve 后调用下面函数即可 uf_set_text(datawindow adw_content,string as_columns,boolean,ab_ignoreblank) /************************************************************* describe: 在数据窗口adw_content中,在as_columns中包含的列中插入空格 args: as_columns 要操作的多个列,列间用逗号隔开 *************************************************************/ if (not isvalid(adw_content)) or isnull(as_columns) or len(as_columns)<1 or isnull(ab_ignoreblank) then return -1 n_cst_string lnv_string string ls_column[] , ls_width ,as_source,as_replaced ,ls_temp int li_upperbound , li_width , li_column , li_fontwidth, li_counter long ll_rowcount , ll_row , ll_totalstep int li_yield lnv_string.of_parsetoarray(as_columns,',',ls_column) li_upperbound = upperbound(ls_column) ll_rowcount = adw_content.rowcount() if li_upperbound<1 or ll_rowcount<1 then return -1 openwithparm(w_waiting,this) ib_cancel = false iw_frame.enabled = false ll_totalstep = ll_rowcount * li_upperbound w_waiting.uf_register(ll_totalstep) for li_column = 1 to li_upperbound ls_width = adw_content.describe(ls_column[li_column]+\!' or ls_width='?' or li_width=0 then continue end if //ls_temp = adw_content.describe(ls_column[li_column]+\= 'width' }\to ll_rowcount if ib_cancel then iw_frame.enabled = true return 0 //pressed cancel button end if as_source = adw_content.getitemstring(ll_row,ls_column[li_column]) as_replaced = uf_insertstring(as_source,li_counter,' ',false) if as_replaced<>as_source then adw_content.setitem(ll_row,ls_column[li_column],as_replaced) end if w_waiting.uf_stepit() next next close(w_waiting) iw_frame.enabled = true return 139、如何动态外部创建数据窗口?答:首先制作一个自己想动态得到的数据窗口,然后将该数据窗口导出,看看语法,这样你就了解了这种数据窗口的生成语法了! --------------------------------------------------------------- dw_1.create() 可以参考帮助 以及 srd文件(数据窗口导出文件) --------------------------------------------------------------- 动态数据窗创建原理及实现在实际应用中,经常需要根据用户需求来动态创建数据窗,一般方法是这样的。 在一个window中加入一个数据窗控件,如dw_new,但是该数据窗没有data object,(空白的) 就可以用以下语法来创建: dw_new.create(ls_syntax,ls_error) // 创建语法,错误信息 ls_syntax可
以用以下三种方法来形成:一、动态由sql语法创建: // 连接到pb的example数据库string ls_sql,ls_syntax,ls_errorls_syntax = 'select * from department'ls_syntax = sqlca.syntaxfromsql(ls_sql,'style(type=grid)',ls_error)if len(ls_error) >0 thenmessagebox('error','syntaxfromsql error:~r'+ls_error)elsedw_new.create(ls_syntax,ls_error)if len(ls_error) >0 thenmessagebox(\reate have these errors: ~r\nd if二、由另一个数据窗的syntax来创建string ls_syntax,ls_errorls_syntax = dw_test.describe('datawindow.syntax')dw_new.create(ls_syntax,ls_error)if ls_error <> '' thenmessagebox('create error',ls_error)elsedw_new.settransobject(sqlca)dw_new.retrieve()end if三、读取psr文件来创建 样例string ls_syntax,ls_error,ls_retls_ret = char(13)+char(10) //回车键int li_filenumlong li_lengthli_filenum = fileopen(\ // 以下是pb5的代码if li_filenum >0 thenfileseek(li_filenum, 158, frombeginning!)li_length = fileread(li_filenum,ls_syntax)end iffileclose(li_filenum)if li_length = 0 thenreturn ls_syntax = \/截掉ls_syntax中的数据部分,5.0以\作为参考位置 //6.0以html(作为参考位置 long pos1,pos2 pos1 = pos(ls_syntax,'sparse(names=\syntax = left(ls_syntax,pos1) + mid(ls_syntax,pos1 +1,pos2 - pos1 +1) dw_new.create(ls_syntax,ls_error) if ls_error <> '' then messagebox('create error',ls_error) else dw_new.settransobject(sqlca) dw_new.retrieve() end if //pb6,pb7的代码可以参照pb5自己写,只是文件头和数据窗结束标记不同而已。 --------------------------------------------------------------- global type f_createextenddw from function_object end type forward prototypes global function string f_createextenddw (ref datawindow dw, string cols[]) end prototypes global function string f_createextenddw (ref datawindow dw, string cols[]);string sql_dw_general, sql_dw_columns_type, sql_dw_headers_conf, sql_dw_columns_conf, ls_errors int i long ll_colcount string ls_colnametype string ls_colname,ls_coltype long ll_pos ll_colcount = upperbound(cols) //generals sql_dw_general = \ts=0 timer_interval=0 color=16777215 processing=0 print.documentname=\r(34) + \6 print.margin.bottom = 96 print.paper.source = 0 print.paper.size = 0 print.prompt=no print.buttons=no print.preview.buttons=no )\har(34) + \ter(height=0 color=\ar(34) + \列及类型 sql_dw_columns_type = \me = right(ls_colnametype,len(ls_colnametype) - 1) ls_coltype = left(ls_colnametype,1) choose case upper(ls_coltype) case 'c' ls_coltype = 'char(100)' case 'd' ls_coltype = 'date' case 'n' ls_coltype = 'decimal(6)' case else ls_coltype = 'char(100)' end choose //ls_coltype = 'char(100)' //列及类型 sql_dw_columns_type= sql_dw_columns_type + \clause=no name=\列标题 sql_dw_headers_conf = sql_dw_headers_conf + \2\) + \ar(34) + \