PB中一些技巧.doc_第1页
PB中一些技巧.doc_第2页
PB中一些技巧.doc_第3页
PB中一些技巧.doc_第4页
PB中一些技巧.doc_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PB中一些技巧1.RGB函数计算公式: 颜色值 (65536 * Blue) + (256 * Green) + (Red) 2.控件可拖动: send(handle(this),274,61458,0) 3.如何用程序控制下拉子数据窗口的下拉和收起 用modify或者直接用dw_1.object.col1.dddw.showlist = true 4.检索参数有些不需要传入则传%. 5.如何屏蔽鼠标滚轮触发 在控件的other事件写 if message.number = 522 then return 1 6.得到数据窗口的语法: string ls_dwsyntax ls_dwsyntax=dw_1.describe(datawindow.syntax) 7.得到数据窗口中各列及标题: long ll_count,i string ls_value,ls_colname ll_colnum = Long(dw_1.object.datawindow.column.count) for i = 1 to ll_colnum /得到标题头的名字 ls_colname = dw_1.describe(# + string(i) + .name) + _t ls_value = dw_1.describe(ls_colname + .text) next 8.在程序中动态设置初始值: ex:dw_contro.object.columnName.initial = xxxx 9.如何在DataWindow的SQL语法中不使用SELECT DISTINCT实现删除重复的行 - 起先对你要显示唯一值的列进行排序:city A,然后增加如下过滤字符串: city city -1 or GetRow () = 1 10.如何改变列的字体颜色,提醒用户此列已做修改 - 在列的Color属性中,输入如下表达式IF (column_name column_name.Original, RGB(255, 0, 0), RGB(0, 0, 0)。在这个条件中,如果此列已改变,则显示红色字体,否则显示黑色字体。这个表达式主要用column_name column_name.Original比较当前列的值和原始列的值是否相同来达到判断的目的。 11.在数据窗口的clicked或doubleclicked事件中写上注释/可解决一些意外的bug! 12.如何屏蔽上下鍵触发 新建一个事件:id为pbm_dwnkey IF KeyDown(KeyDownArrow!) OR KeyDown(KeyUpArrow!) Then Return 1 End IF 13.你注意到没有,数据窗口画板里面,在写表达式的时候,试着用一些用户自定义的全局变量和全局函数,你会发现在某些特殊的场合,这个小窍门还是很有用的。 14.有些程序员在窗口的右键pop菜单里面写了很多代码,在菜单里面有很多w_windowname.controlname等等引用,如果这个窗口被继承,很容易就会出毛病,别忘了在菜单里面可以引用parentwindow哦,有了它我的pop菜单里面的代码和具体窗口无关,随便继承。当然强烈建议最好还是把所有和窗口相关的逻辑都转移到窗口的函数和事件中去,在pop菜单中触发调用。 15.whichdw.describe(evaluate(lookupdisplay(+colname+),+string(row)+) 这个表达式可以得到指定列的显示值。(这个知识点有滥竽充数之嫌,但是一时间我真是想不起来太多的东西) 16.在数据窗口画板里面我们如果想要比较当前行和上一行或者下一行的值,怎么比较呢,哈哈,看这个就知道了 if ( yw_bc_circuit_dlcode = yw_bc_circuit_dlcode -1 and yw_bc_circuit_dlname = yw_bc_circuit_dlname -1 and yw_bc_circuit_xtno = yw_bc_circuit_xtno -1 ,0,1) 这个表达式就是比较当前行和上一行是否相同的。其他的依此类推就行了。 17.两个结构相同的数据窗口之间快速复制数据 dw_1.object.data = dw_2.object.data 18.根据条件改变记录颜色 if ( Mod(getrow(),2)=0,rgb(0,255,255),rgb(255,255,255) /奇偶行不同色 if (currentRow()=getrow(),rgb(0,255,255),rgb(255,255,255) /当前行不同色 19.使窗口总位于所有打开窗口的最上面 w_main.SetPosition(Topmost!) 20.取数据窗口中列的总数 string ls_count ls_count = dw_1.describe(datawindow.column.count) 21.取数据窗口中可列新的表名。string ls_tablels_table = dw_1.describe(datawindow.updatetable.table)22.取数据窗口对象中列的名称及类型string ls_cols,ls_typesint li_count,ili_count = integer(ls_count)for i = 1 to li_count ls_colsi = dw_1.describe(#+string(i)+.name) ls_typesi = dw_1.describe(#+string(i)+.coltype)next23.Case( dealintype WHEN 0 THEN RGB(254,251,235) WHEN 2 THEN rgb(254,251,235) ELSE RGB(0,0,255)写道字段的protect中不仅仅是颜色改变的问题看看24.dw.Object.coln : 直接获得数据窗口的col列第n 行的数据。25.在做数据窗口时,我们有时候希望能够多一些字段来作一些特殊的用处,但是在数据窗口中又不能乱加字段,因为已有的字段必须是数据库中有的或者是他们的组合,呵呵,大家不妨看看这个sql用产生什么样的数据窗口select colname1,colname2,1,from tablename是不是多出了两个字段阿,一个是字符串字段,一个是数字字段别忘了要convert syntax 哦26.清空数组string a,ba1 = 1;a1 = 2;a1 = 3a = b/即可以清空a27.只允许修改第n行的name列:dw_1.modify(tect = 1 t if(getrow()=n),0,1)28.让run程序和主程序一起关闭:function ulong findwindowA(.).user32.dllfunction long setparent(.user32.dllhandle = findwindowA(nul,win_title)setparent(handle,handle(w_main)29.取得某一天以前或以后n天的函数RelativeDate(date, n)例: 取得当天前10天的日期 RelativeDate(Today(),10) 取得当天后10天的日期 RelativeDate(Today(),-10)30.不想做排序窗口?调用PB自身的好了。string ls_nullSetNull(ls_null)dw_1.SetSort(ls_null)dw_1.Sort()31.调用PB自身的过滤窗口:dw_1.SetFilter(ls_null)dw_1.Filter()32.增量输入定位代码或名称记录位置:定义一个窗口,放一个SLE_1,在它的MODIFY程序中写:long ll_findstring value0value0=sle_1.textif not (isnull(sle_1.text) or sle_1.text=) then if left(sle_1.text,1)=0 or integer(sle_1.text)0 then /输入的为代码 ll_find=jwl_dmxz.dw_1.find(dm like +value0+%,1,jwl_dmxz.dw_1.rowcount()/jwl_dmxz为主窗口,dm为查询的字段名,这里是代码。 else /输入的为名称 ll_find=jwl_dmxz.dw_1.find(mc like +value0+%,1,jwl_dmxz.dw_1.rowcount()/ end if if ll_find0 then jwl_dmxz.dw_1.scrolltorow(ll_find) /为了避免首次目标记录为第一条,无法选中。 if ll_find=ll_find0 then jwl_dmxz.dw_1.selectrow(ll_find,true) elseif ll_findll_find0 then jwl_dmxz.dw_1.selectrow(ll_find,true) jwl_dmxz.dw_1.selectrow(ll_find0,false) ll_find0=ll_find end if end ifend if33.然后在查询窗口中的TIMER事件中写:timer(0.05)sle_1.triggerevent(modified!)34.判断计算器是否存在:string is_fileExistsboolean is_Existsis_fileExists=c:/windows/calc.exeis_Exists=fileExists(is_fileExists)if is_Exists then run(c:/windows/calc.exe)else messagebox(提示信息,本机的WINDOWS没有计算器!,stopsign!)end if35.得到硬盘序例号String ls_Rootpath, ls_volumnename ,ls_return,softpathGetCurrentDirectoryA(256,softpath)softpath=left(softpath,2)if softpath=C: then ls_Rootpath = D: / 指定要得到序列号的硬盘, / 一般情况都是C盘,除非你能保证用户存在其它逻辑盘或物理盘 else ls_Rootpath = C:end ifls_volumnename = Space(256) / 分配足够的空间,下同 Ulong lul_VolumeNameSize lul_VolumeNameSize = 256 Ulong lul_VolumeSerialNumber, lul_MaximumComponentLength, lul_FileSystemFlags lul_MaximumComponentLength = 256 String ls_FileSystemNameBuffer ls_FileSystemNameBuffer = space(256) Ulong lul_FileSystemNameSize lul_FileSystemNameSize = 256 int ilong ls_num,ls_gnum,ls_dnumi=GetVolumeInformation(ls_Rootpath, ls_volumnename, lul_VolumeNameSize, lul_VolumeSerialNumber, lul_MaximumComponentLength, lul_FileSystemFlags, ls_FileSystemNameBuffer, lul_FileSystemNameSize) ls_return=string(lul_VolumeSerialNumber)return ls_returnPB问答:1.如何让存储文件目录的列,显示图片? 答:选择对应的column的display as picture属性为true 2、如何复制grid类型的所选择的行的数据到系统剪切板? 答:string ls_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保存,edit source 修改text的x和width属性表达式如下: x=100t integer(describe(firstcol.x) width=100tinteger(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的某一列为空? 答:string ls_temp setnull(ls_temp) dw_1. O B J E C T.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、如何获取指定名称的datawindow O B J E C T? 答:DWObject ldwo_use,ldwo_abc ldwo_use = dw_1.Object ldwo_abc = ldwo_use._get_attribute(t_1,FALSE)/t_1为datawindow中text对象的名称 12、如何使用datawindow的查询模式? 答:dw_1.Object.DataWindow.QueryMode=yes将datawindow改变为查询模式后,接收用户的输入,再使用一下代码获取结果: dw_1.accepttext() dw_1.retrieve() 13、如何缩放datawindow的打印大小? 答:dw_1. O B J E C T.datawindow.zoom=150 or dw_1. O B J E C T.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、如何让带用title bar的datawindow控件的标题栏诚活动窗口的颜色? 答:外部函数定义: funcation logn SetActiveWindow(long hwnd ) 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? 答:定义外部函数引用声明 SUBROUTINE keybd_event( int bVk, int bScan, int dwFlags, int dwExtraInfo) LIBRARY user32.dll 代码如下: constant integer VK_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. O B J E C T.datawindow.print.fileName =c:/temp.prn dw_1.print() 20、如何设置dddw的初始值? 答:dw_1. O B J E C T.columnname.Initial=your_initial_value 21、如何只显示不同的数据? 答:dw_1.filter(isnull(columnname-1) and columnname columnname-1) dw_1.filter() 22、如何让带有title bar的datawindow不可以移动? 答:在datawindow的自定义事件ue_nchittest(pbm_nchittest)中写入如下代码: return 1 23、如何在N-UP显示风格中建立基于第N栏中的列的计算列? 答:如column有两列,number和price ,并显示为两栏,则第一栏的cost计算列的expression为number*price,第二栏的cost_1计算列的expression为number1*price1 24、如何清空ddlb或edit.codetable中项目? 答:dw_1.Object.columnname.Values= 25、如何实现指定的column的字体旋转90度? 答:dw_1. O B J E C T.columnname.font.Escapement =900 26、如何获取datawindow的sql代码? 答: 可以通过以下四种方法获取sql代码: string szselect 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事件中,写如如下代码: long lstorage lstorage=long(dw_1. O B J E C T.datawindow.storage) if lstorage50000 then dbcancel() 28、如何控制打印横向: dw_control. O B J E C T.datawindow.print.orientation= 1 29、如何进行预览: dw_control. O B J E C T.datawindow.print.preview = yes 30、如何连续在同一张纸打印两个数据窗口? 答:dw_1. O B J E C T.datawindow.print.filename=temp.prn dw_2. O B J E C T.datawindow.print.filename=temp.prn dw_1.print() dw_2.print() 31、如何将pb9.0 的datawindow转化为pb 8.0版本的datawindow? 答:edit source 将release 9;改为release 8; 并删除以下内容: print.printername= print.canusedefaultprinter=yes print.cliptext=no print.overrideprintjob=no hidegrayline=no encodeselflinkargs=1 export.xml(headgroups=1 includewhitespace=0 metadatatype=0 savemetadata=0 ) import.xml() export.pdf(method=0 distill.custompostscript=0 xslfop.print=0 ) 32、如何设置datawindow分组后每个分组中的记录号? 答:建立一个计算列,expression为 getrow() - first(getrow() for group 1)+1 33、如何实现在datawindow中只有新增的行,才可以编辑? 答:在所有的column的protect属性表达式中写入以下表达式: if(isrownew(),0,1) 34、保存datawindow数据到excel中 / . Init docname / . GetFileOpenName or any other method if dw_1.SaveAs(docname, HTMLTable!, True) = -1 then MessageBox(Warning, Unable to export data. Error writing to file!, Exclamation!) return end if / Convert HTML file to Excel native format OLEObject excel excel = CREATE OLEObject if excel.ConnectToObject(docname) = 0 then 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() end if DESTROY excel / done 35、除了循环以外,有没有更好的方法统计数据窗口中处于选中状态的行数? 一般习惯于使用循环来统计数据窗口中处于选中状态的行数,有没有更好的方法? 其实此问题在应用上用处不大,讨论一下,活跃一下思维还是有好处的。 方法一: long ll_Selected ll_Selected = long(dw_1.describe(evaluate(sum( if(IsSelected(), 1, 0) for all),1) 方法二: long ll_Selected ll_Selected = long(dw_1.describe(evaluate(count(IsSelected() for all),1) 方法三: upperbound(dw_1.Object.Data.Selected)36、问:怎么让PB只打印当前记录,是用Free格式制作的数据窗口! 答: DataStore ldt_temp long ll_Row , ll_Rows ll_Rows = dw_XX.Rowcount() If ll_Rows = 0 Then GoTo the_end If ll_Rows = 1 Then dw_XX.Print() GoTo the_end End if dw_XX.SetRedraw(False) ldt_temp = Create DataStore 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!) Destroy ldt_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$得到字符串中汉字或者双字节的个数 global type f_cncharnum from function_ O B J E C T 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) li_ret = 3 string ls_ch /临时单元 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_ O B J E C T 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_ O B J E C T ole_ O B J E C T = CREATE OLEObject integer li_ret li_ret = ole_ O B J E C T.ConnectToObject(,word.application) IF li_ret 0 THEN /如果Word还没有打开,则新建。 li_ret = ole_ O B J E C T.ConnectToNewObject(word.application) if li_ret 0 then MessageBox(OLE错误,OLE无法连接!错误号: + string(li_ret) return 0 end if ole_ O B J E C T.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_ O B J E C Ts,ls_obj,ls_objs,ls_objtag long ll_pos,ll_len,ll_num = 0 ls_ O B J E C Ts = trim(adw.Describe(datawindow.Objects) do while (pos(ls_ O B J E C Ts,t) 0) ll_pos = pos(ls_ O B J E C Ts,t) ll_len = ll_pos - 1 ls_obj = left(ls_ O B J E C Ts,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_objsll_num = ls_obj ls_objtagll_num = adw.Describe(ls_obj + .tag) end if ls_ O B J E C Ts = right(ls_ O B J E C Ts,len(ls_ O B J E C Ts) - ll_pos) loop /得到数据窗口数据的列数与行数(行数应该是数据行数 + 1) ll_colnum = ll_num ll_rownum = adw.rowcount() + 1 ole_ O B J E C T.Documents.Add() ole_ O B J E C T.ActiveDocument.Tables.Add(ole_ O B J E C T.Selection.Range, ll_rownum, ll_colnum) string ls_colname integer i,j,k for i = 1 to ll_colnum /得到标题头的名字 ls_value = ls_objtagi ole_ O B J E C T.Selection.TypeText(ls_value) for k = 1 to f_cncharnum(ls_value) ole_ O B J E C T.Selection.TypeBackspace() next ole_ O B J E C T.Selection.MoveRight(wdCell) next adw.setredraw(false) ole_ O B J E C T.Selection.MoveLeft(wdCell) string column_name for i = 2 to ll_rownum for j = 1 to ll_colnum column_name = ls_objsj if adw.Describe(column_name + .type) = column then ls_value = adw.Describe(Evaluate(LookupDisplay(+column_name+),+string(i - 1)+) end if if adw.Describe(column_name + .type) = compute then ls_value = adw.Describe(Evaluate( + adw.Describe(column_name + .expression) + ,+string(i - 1)+) end if ole_ O B J E C T.Selection.MoveRight(wdCell) ole_ O B J E C T.Selection.TypeText(ls_value) /for k = 1 to f_cncharnum(ls_value) /ole_ O B J E C T.Selection.TypeBackspace() /next next next adw.setredraw(true) constant long wdFormatDocument = 0 SetPointer(oldpointer) /保存新建的文档 if messagebox(保存,文档已经成功完成,是否保存?,Question!,YesNo!) = 1 then string docname, named integer value value = GetFileSaveName(选择文件,docname, named, DOC,Doc Fil

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论