pb怎样表示c decimal表示

当前位置: >>
pb新技术汇总
1 在数据窗口当中按下回车键之后,焦点移动到后面的字段,如从最后移动,则自动跳转到 下一行 2. 窗口当中的 enter 事件! datawindow 的事件当中新建一个自定义事件 ue_enter,在 even_id 在 3. PB 窗口之间传递多参数的方法 4.怎样在程序中为 datawindow 加计算域或 line5.我如何才能够很好的控制程序的安全性呢? 比如说,我要在一个窗口当中控制一个 button 的操作权限 在 datawindow 中,操作一个字段的可操属性,难道要对这些个单独编码吗? 有没有比较好的方式? 6.用 PB 做一个通用右键菜单7.一个把窗口 redraw 到 screen 中间的函数:8.如何获得当前应用程序的路径 9.获得当前计算机的名称 10.获得当前的路径 11.如何用代码配置 ODBC 数据源 12.这样一个功能怎么建呢? 首先优两个 dropdownlistbox, 当选择其中一个中的 item 后, 另外一个 dropdownlistbox 显示相应与第一个选 择项的内容。 例如,一个显示各个中心的名称,当选择其中一个中心名称时,另一个则显示相应中心的所有部门的名称。 13、在 grid 的窗口当中,某列不允许编辑,某列允许编辑 14.在数据窗中如何选中多行 15.一个使数据窗口居中的例子 16 数据表 d_query 中有一数据列 id,设置为 DropDownDW 格式,并关联到另一数据表 d_info(id,name)。这样 程序运行时显示的数据为 name 的值, 而 dw_1.getitemstring(1,'id') / dw_1.object.date(1,1)得到的数据是 id 的 值。 但现在我想得到 name 的值,有什么简单的方法? 17.窗口为 w_gcde 内,放入一个 DW_1,如何得到 dw_1 内的 yuonghu_id 列的内容 18.保存报表为 excel 表 19.pbcalcol,pbcattbl,pbcatedt,pbcatfmt 四表的作用及分e的含x 20.PB 中怎样把数据写到已经固定格式的 EXCEL 表中 21.九行代码实现表达式计算! 22.把一个窗口上的一些控件(不是全部)复制到另一个窗口上,控件的属性不变(比如相于父窗口位置) , 如何实现。 23.在 C/S 体系中设置工作站与服务器的时钟同步 24.PB 动态报表格式自由定义的实现 25.PB 中关于动态工资项目问题的解决办法 26.PB 中一个类 Word 打印对话框的实现 27.PB 数据管道的实用程序设计技术 28.PowerBuilder 创建动态数据窗口综述 29. PB 动态报表格式自由定义的实现 30. Powerbuilder 中实现并应用树形视图 31. Powerbuilder 中利用 API 实现动画特效 32. API 函数和 PB 编程 33. PowerBuilder 7.0 中实现电子邮件的收发 34. PB 中数据窗口的两点应用技巧 35. 检测计算机是否连网 36. 在 PB 应用中收发电子邮件(这个很简单,不能处理附件的--JACK) 37. 在 PB 应用中实现声音与动画 38. PB 中相关联下拉数据窗口的实现 39. PowerBuilder 数据窗口中记录颜色的隔层显示 40.可以让数据窗口的内容自动适应纸张的大小的代码 41.如何实现,文字在标题栏上从左到右(或从右到左)自动滚动?获得机器 IP 地址声明 win32 API 函数: function int WSAStartup( uint UIVersionRequested, ref s_WSAData lpWSAData ) library &wsock32.dll& function int WSACleanup() library &wsock32.dll& function int WSAGetLastError ( ) library &wsock32.dll& function int gethostname ( ref string name, int namelen ) library &wsock32.dll& function string GetHost(string lpszhost, ref blob lpszaddress ) library &PBws32.dll& 使用方法: s_wsadata l_WSAData string ls_HostName = space(128) string ls_IpAddress int li_version = 257 blob{4} lb_hostaddress IF wsastartup ( li_version, l_WSAData ) = 0 THEN IF gethostname ( ls_HostName, len(ls_HostName) ) & 0 THEN messagebox(&GetHostName&,WSAGetLastError()) ELSE GetHost(ls_HostName, lb_HostAddress) ls_IpAddress = string(asc(string(blobmid(lb_HostAddress,1,1))),&000&) + &.& ls_IpAddress += string(asc(string(blobmid(lb_HostAddress,2,1))),&000&) + &.& ls_IpAddress += string(asc(string(blobmid(lb_HostAddress,3,1))),&000&) + &.& ls_IpAddress += string(asc(string(blobmid(lb_HostAddress,4,1))),&000&) END IF WSACleanup() ELSE messagebox(&GetHostName&,WSAGetLastError()) END IF sle_1.text=ls_hostname sle_2.text=ls_ipaddress //pb 中的一些经验和技巧 1.RGB 函数计算公式: 颜色值 = (65536 * Blue) + (256 * Green) + (Red) 2.控件可拖动:send(handle(this),274,.如何用程序控制下拉子数据窗口的下拉和收起 用 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_control.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! //数据窗口中实现字段的组合 现在假设客户的省份,城市,地址,邮编分别存放在不同的字段中,它们是 Province,City, Address, PC。我们要得到“邮编+省份+城市+地址”的格式,如:“(214001)江苏省无锡市人民路 1 号。&,具体实现 如下: 1、在需要显示的位置添加一个计算域(Compute Field) 2、在它的表达式栏中写上“ '(' + PC + ' )' + Province + City + Address ” 3、单击确定完成。 很容易是不是。需要提醒大家的是,计算域只能用来显示,不能对它进行修改,因为它 没有 TAB 属性, 不能得到焦点。 //数据窗口的自动刷新技术 在我们编写诸如像库存, 销售等应用系统时, 总希望程序能动态的自动刷新库存量或销售量, 比如说 每隔 1 秒刷新一次。要实现这样的功能只要我们利用数据窗口的时间间隔属性(Timer Interval) , 当该值为 0 时数据窗口不进行刷新, 如果要使数据窗口以每一秒钟的频率刷新的话, 只要将 该值设为 1000,即 1000 毫秒。 我们还可以为应用程序添加闪烁报警的功能。 就拿库存量来说吧, 最常用的是当某货物的库 存量达到 一个最低库存量时程序应能自动判别,并用警告色显示,通常是红色。此时,我们只要在运 用了上述的 方法后再在需要闪烁的字段上,比如,库存量,在它的颜色属性中写上相应的语句。下面这 段代码实现 “当某一物品的库存量小于 20 的时候,程序以红色闪烁显示警告” if ( Store_Num & 20, & if mod( Second(Now()), 2) && 0, & // 每秒一次,偶数显示红色,奇数显示白色,即底色 RGB(255, 255, 255), RGB(255, 0, 0) ) //如何在 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) + &')& //如何在 DataWindow 的 SQL 语法中不使用 SELECT DISTINCT 实现删除重复的行 起先对你要显示唯一值的列进行排序:&city A&,然后增加如下过滤字符串: & city & & city [-1] or GetRow () = 1& //如何在分组形式的 DataWindow 中分别显示各组的行号 当我们为 Datawindow 的每一行显示行号时,可以简单的放一个表达式为 GetRow()计算列。 但是对于分组的 Datawindow,要分别显示各组的行号,则应使用表达式为 GetRow() - First(GetRow() for Group 1) + 1 的计算列。 //如何改变列的字体颜色,提醒用户此列已做修改 在列的 Color 属性中,输入如下表达式 IF (column_name & &column_name.Original, RGB(255, 0, 0), RGB(0, 0, 0))。 在这个条件中,如果此列已改变,则显示红色字体,否则显示黑色字体。这个表达式主要用 column_name & & column_name.Original 比较当前列的值和原始列的值是否相同来达到判断 的目的。 //在数据窗口中移走行,但不是去做过滤或删除操作 RowsDiscard()函数可做到这一点,它在数据窗口中执行移除工作,但被移走的行它不可被删 除或做任何 修改性的保存。 //如何在多行显示的 DataWindow 中的 Footer Band 中显示当前数据的首行和最后行的行号 我们先看两个计算列的表达式: IF (GetRow() = First(GetRow() FOR Page), 1, 0) // 1 为当前页的第一行 IF (GetRow() && 1 AND GetRow() = Last(GetRow() FOR Page), 1, 0) // 1 为当前页的最后一行 由上面可知,在 Footer Band 中设置如下计算列表达式: 'Rows ' + String(First(GetRow() FOR Page)) + ' to ' + String(Last(GetRow() FOR Page)) + ' are displayed'。 即可达到这项功能。 //窗口居中: function long shCenterWindow(long hwnd) library &Pbvm60.dll& //用 IE 打开指定网页: function long shRunDefltBrower(string sellrl) library &Pbvm60.dll& //如何取得数据窗口计算域的值! em_data.text=dw_1.getdatavalue(compute_1)是不行的,应该如何写呢? 答案:取个名字,然后就象字段取值一样!在 name 属性里命名为 compute_1 em_date.Text = dw_1.Object.compute_1[dw_1.GetRow()] //PB6.5 中 grid 风格的数据窗口如何自动折行 1、在 DataWindow Painter 中打开 DataW 2、在需设定自动折行的列上双击鼠标, 弹开此列的属性窗口; 3、 选择 Position 标签, 选中 Autosize Height 多选框; 4、 选择 Edit 标签, 不选中 Auto Horz Scroll 多选框; 5、 单击 OK 按钮, 保存所做的修改; 6、 点中 Detail Band (即写有 Detail 的灰色长带), 单击鼠标右键, 选择 Properties... 菜单项; 7、 选中 Autosize Height 多选框; 8、 单击 OK 按钮, 保存所做的修改; 9、 保存 DataWindow。 在列的 Height 傩表_式: if(len(trim( file_name ))/18 & 1,ceiling(len(trim(file_name))/18)*24,18)多少字符就折行 //【12个用一条语句写成的有关日期函数】 可以直接赋值给变量,不用写成函数形式的。另函数适用于 pb6.5,一个汉字占两个字节, 如果用于 pb8.0 以上请根据实际情况修改 //1.生肖(年份参数:int ls_year 返回参数:string): mid(fill('鼠牛虎兔龙蛇马羊猴鸡狗猪',48),(mod(ls_year -)*2 -1,2) //2.天干地支(年份参数:int ls_year 返回参数:string): mid(fill('甲乙丙丁戊己庚辛壬癸',40),(mod(ls_year -)*2 -1,2)+mid(fill('子丑寅卯辰 巳午未申酉戌亥',48),(mod(ls_year -)*2 -1,2) //3.星座(日期参数:date ls_date 返回参数:string): mid (& 摩 羯 水 瓶 双 鱼 白 羊 金 牛 双 子 巨 蟹 狮 子 处 女 天 秤 天 蝎 射 手 摩 羯 &,(month(ls_date)+sign(sign(day(ls_date) -(19+integer(mid('',month(ls_date),1))))+1))*4 -3,4)+'座' //4.判断闰年(年份参数:int ls_year 返回参数:int 0=平年,1=闰年): abs(sign(mod(sign(mod(abs(ls_year),4))+sign(mod(abs(ls_year),100))+sign(mod(abs(ls_year),400 )),2)) -1) //5.某月天数(日期参数:date ls_date 返回参数:int): integer(28+integer(mid('3'+string(abs(sign(mod(sign(mod(abs(year(ls_date)),4))+sign(mod(abs(ye ar(ls_date)),100))+sign(mod(abs(year(ls_date)),400)),2)) -1))+'',month(ls_date),1))) //6.某月最后一天日期(日期参数:date ls_date 返回参数:date): date(year(ls_date),month(ls_date),integer(28+integer(mid('3'+string(abs(sign(mod(sign(mod(abs(y ear(ls_date)),4))+sign(mod(abs(year(ls_date)),100))+sign(mod(abs(year(ls_date)),400)),2)) -1))+'',month(ls_date),1)))) //7.另一个求某月最后一天日期(日期参数:date ls_date 返回参数:date): a.RelativeDate (date(year(ls_date)+sign(month(ls_date) -12)+1,mod(month(ls_date)+1,13)+abs(sign(mod(month(ls_date)+1,13)) -1),1),-1) b.RelativeDate(date(year(ls_date)+integer(month(ls_date)/12),mod(month(ls_date),12)+1,1),-1) //8.另一个求某月天数(日期参数:date ls_date 返回参数:int): a.day(RelativeDate (date(year(ls_date)+sign(month(ls_date) -12)+1,mod(month(ls_date)+1,13)+abs(sign(mod(month(ls_date)+1,13)) -1),1),-1)) b.day(RelativeDate(date(year(ls_date)+integer(month(ls_date)/12),mod(month(ls_date),12)+1,1),1)) //9.某月某日星期几--同PB系统函数 DayName(日期参数:date ls_date 返回参数:string): ' 星 期 '+mid(' 日 一 二 三 四 五 六 ',(mod(year(ls_date) -1 + int((year(ls_date) -1)/4) int((year(ls_date) -1)/100) + int((year(ls_date) -1)/400) + daysafter(date(year(ls_date),1,1),ls_date)+1,7)+1)*2 -1,2) //10.求相隔若干月份后的相对日期(日期参数:date ls_date 相隔月份(可 取负数):int ls_add_month 返回参数:date): date(year(ls_date)+int((month(ls_date)+ls_add_month)/13),long(mid(fill('12',48),(mod(month(ls_date)+ls_add_month -1,12)+13)*2 -1,2)),day(ls_date) -integer(right(left(string(day(RelativeDate (date(year(ls_date)+int((month(ls_date)+ls_add_month)/13)+sign(long(mid(fill('07 ',48),(mod(month(ls_date)+ls_add_month -1,12)+13)*2 -1,2)) -12)+1,mod(long(mid(fill('',48),(mod(month(ls_date)+ls_add_month -1,12)+13)*2 -1,2))+1,13)+abs(sign(mod(long(mid(fill('',48),(mod(month(ls_date) +ls_add_month -1,12)+13)*2 -1,2))+1,13)) -1),1),-1)) -day(ls_date),'00')+'0),3))/100) //11.求某日在当年所处的周数(日期参数:date ls_date 返回参数:int): //a.周始日为星期天 //a1 abs(int(-((daysafter( RelativeDate(date(year(ls_date),1,1), -mod(year(ls_date) -1 + int((year(ls_date) -1)/4) - int((year(ls_date) -1)/100) + int((year(ls_date) -1)/400) + 1,7) +1),ls_date)+1)/7))) //a2(使用 DayNumber 函数) abs(int(-((daysafter( RelativeDate(date(year(ls_date),1,1), -DayNumber(date(year(ls_date),1,1))+1),ls_date)+1)/7))) //b.周始日为星期一 //b1 abs(int(-((daysafter( RelativeDate(date(year(ls_date),1,1), -integer(mid(';,mod(year(ls_date) -1 + int((year(ls_date) -1)/4) - int((year(ls_date) -1)/100) + int((year(ls_date) -1)/400) + 1,7),1))),ls_date)+1)/7))) //b2(使用 DayNumber 函数) abs(int(-((daysafter( RelativeDate(date(year(ls_date),1,1), -integer(mid(';,DayNumber(date(year(ls_date),1,1)),1))),ls_date)+1)/7))) //12. 求 某 日 相 对 于 过 去 某 一 日 期 所 处 的 周 数 ( 日 期 参 数 : date ls_date_1( 要 求 的 某 日),ls_date_2(过去的某日) 返回参数:int): //注:ls_date_1&ls_date_2 //a.周始日为星期天 //a1 abs(int(-((daysafter( RelativeDate(ls_date_2, -mod(year(ls_date_2) -1 + int((year(ls_date_2) -1)/4) int((year(ls_date_2) -1)/100) + int((year(ls_date_2) -1)/400) + daysafter(date(year(ls_date_2),1,1),ls_date_2)+ 1,7) +1),ls_date_1)+1)/7))) //a2(使用 DayNumber 函数) abs(int(-((daysafter( RelativeDate(ls_date_2, -DayNumber(ls_date_2)+1),ls_date_1)+1)/7))) //b.周始日为星期一 //b1 abs(int(-((daysafter( RelativeDate(ls_date_2, -integer(mid(';,mod(year(ls_date_2) -1 + int((year(ls_date_2) -1)/4) - int((year(ls_date_2) -1)/100) + int((year(ls_date_2) -1)/400) + daysafter(date(year(ls_date_2),1,1),ls_date_2)+ 1,7) ,1))),ls_date_1)+1)/7))) //b2(使用 DayNumber 函数) abs(int(-((daysafter( RelativeDate(ls_date_2, -integer(mid(';,DayNumber(ls_date_2),1))),ls_date_1)+1)/7))) //pb 用纯函数实现在数据窗口中模拟资源管理器鼠标单击动作动态排序,并显示排序箭头 //函数名:f_dwsort(datawindow fdw_dw,dwobject fdwo_dwo) return none //说明:用于在数据窗口中模拟资源管理器鼠标单击动作动态排序,并显示排序箭头 //调用规则:在数据窗口控件 clicked!中写入 f_dwsort(this,dwo) //参数:fdw_dw datawindow // fdwo_dwo dwobject //返回值:无 String ls_clicked_pos,ls_col,ls_format,ls_tag Long ll_pos string ls_text,ls_column[] int li_i ls_clicked_pos = fdwo_dwo.Name ll_pos = Pos(ls_clicked_pos,'_t') If ll_pos &0 Then //设置排序 ls_col = Left(ls_clicked_pos,ll_pos -1) ls_tag = fdwo_dwo.tag If ls_tag = ls_col + &A& Then fdwo_dwo.tag = ls_col + &D& ls_format = ls_col+& A& ELSEIF ls_tag = ls_col + &D& Then fdwo_dwo.tag = ls_col + &A& ls_format = ls_col+& D& Else fdwo_dwo.tag = ls_col + &D& ls_format = ls_col+& A& End If //设置列标题 for li_i = 1 to long(fdw_dw.object.datawindow.column.count) ls_column[li_i] = fdw_dw.describe(&#& + string(li_i) + &.Name&) //得到列名 ls_text = fdw_dw.Describe(ls_column[li_i] + &_t.text&) if right(ls_text,2)=&& or right(ls_text,2)=&△& then ls_text = left(ls_text,len(ls_text) - 2) end if fdw_dw.modify(ls_column[li_i] + &_t.text='&+ls_text + &'&) next ls_text = fdw_dw.Describe(ls_clicked_pos + &.text&) if right(ls_text,2)=&& or right(ls_text,2)=&△& then ls_text = left(ls_text,len(ls_text) - 2) end if if right(ls_format,1) = 'A' then fdw_dw.modify(ls_clicked_pos + &.text='&+ls_text + &△'&) elseif right(ls_format,1) = 'D' then fdw_dw.modify(ls_clicked_pos + &.text='&+ls_text + &'&) end if fdw_dw.SetSort(ls_format) fdw_dw.Sort() End If //本程序在 pb6.5 下通过测试 //pb 中取汉字串首字符的一个函数 zhoukan(收藏) 今天看到 xuejun 的一个取汉字首字符的函数,试用了一下,感觉很好用,不敢独享,拿出 来跟大家分享: $PBExportHeader$uf_getfirstletter.srf $PBExportComments$ 返回给定汉字串的首字母串, xuejun ,
global type uf_getfirstletter from function_object end type forward prototypes global function string uf_getfirstletter (string as_inputstring) end prototypes global function string uf_getfirstletter (string as_inputstring);//Function name : uf_GetFirstLetter //Used to : 返回给定汉字串的首字母串,即声母串 //Input Arguments: as_InputString - string , 给定的汉字串 //Return Value : ls_ReturnString - String , 给定的汉字串的声母串,一律为小写 //Notice : 1. 此方法基于汉字的国标汉字库区位编码的有效性, 不符合此编码的系统 此函数无效! // 2. 若汉字串含有非汉字字符,如图形符号或 ASCII 码,则这些非汉字字符将保持 不变. //Sample : ls_rtn = uf_GetFirstLetter(&中华人民共和国&) // ls_rtn will be : zhrmghg //Scripts: char lc_FirstLetter[23] //存放国标一级汉字不同读音的起始区位码对应读音 string ls_ch //临时单元 string ls_SecondSecTable //存放所有国标二级汉字读音 string ls_ReturnStr //返回串 integer li_SecPosValue[23] //存放国标一级汉字不同读音的起始区位码 integer i , j integer li_SectorCode //汉字区码 integer li_PositionCode //汉字位码 integer li_SecPosCode //汉字区位码 integer li_offset //二级字库偏移量 //Set initial value li_SecPosValue[]={33,02,87,72,, 27,58,49 } lc_FirstLetter[] = {&A&, &B&,&C&,&D&,&E&,&F&,&G&,&H&,&J&,&K&,&L&,&M&,&N&,&O&,&P&,&Q&,&R&,&S&,&T&,&W&,&X&,&Y&,&Z&} ls_SecondSecTable=&CJWGNSPGCGNE[Y[BTYYZDXYKYGT[JNNJQMBSGZSCYJSYY[PG KBZGY[YWJKGKLJYWKPJQHY[W[DZLSGMRYPYWWCCKZNKYYGTTNJJNYKKZYTC JNMCYLQLYPYQFQRPZSLWBTGKJFYXJWZLTBNCXJJJJTXDTTSQZYCDXXHGCK[PHF FSS[YBGXLPPBYLL[HLXS[ZM[JHSOJNGHDZQYKLGJHSGQZHXQGKEZZWYSCSCJXY EYXADZPMDSSMZJZQJYZC[J[WQJBYZPXGZNZCPWHKXHQKMWFBPBYDTJZZKQHY LYGXFPTYJYYZPSZLFCHMQSHGMXXSXJ[[DCSBBQBEFSJYHXWGZKPYLQBGLDLCC TNMAYDDKSSNGYCSGXLYZAYBNPTSDKDYLHGYMYLCXPY[JNDQJWXQXFYYFJLEJ PZRXCCQWQQSBNKYMGPLBMJRQCFLNYMYQMSQYRBCJTHZTQFRXQHXMJJCJLX QGJMSHZKBSWYEMYLTXFSYDSWLYCJQXSJNQBSCTYHBFTDCYZDJWYGHQFRXWC KQKXEBPTLPXJZSRMEBWHJLBJSLYYSMDXLCLQKXLHXJRZJMFQHXHWYWSBHTR XXGLHQHFNM[YKLDYXZPYLGG[MTCFPAJJZYLJTYANJGBJPLQGDZYQYAXBKYSEC JSZNSLYZHSXLZCGHPXZHZNYTDSBCJKDLZAYFMYDLEBBGQYZKXGLDNDNYSKJS HDLYXBCGHXYPKDJMMZNGMMCLGWZSZXZJFZNMLZZTHCSYDBDLLSCDDNLKJY KJSYCJLKWHQASDKNHCSGANHDAASHTCPLCPQYBSDMPJLPZJOQLCDHJJYSPRCHN [NNLHLYYQYHWZPTCZGWWMZFFJQQQQYXACLBHKDJXDGMMYDJXZLLSYGXGKJ RYWZWYCLZMSSJZLDBYD[FCXYHLXCHYZJQ[[QAGMNYXPFRKSSBJLYXYSYGLNS CMHZWWMNZJJLXXHCHSY[[TTXRYCYXBYHCSMXJSZNPWGPXXTAYBGAJCXLY[DC CWZOCWKCCSBNHCPDYZNFCYYTYCKXKYBSQKKYTQQXFCWCHCYKELZQBSQYJ QCCLMTHSYWHMKTLKJLYCXWHEQQHTQH[PQ[QSCFYMNDMGBWHWLGSLLYSDL MLXPTHMJHWLJZYHZJXHTXJLHXRSWLWZJCBXMHZQXSDZPMGFCSGLSXYMJSHX PJXWMYQKSMYPLRTHBXFTPMHYXLCHLHLZYLXGSSSSTCLSLDCLRPBHZHXYYFH B[GDMYCNQQWLQHJJ[YWJZYEJJDHPBLQXTQKWHLCHQXAGTLXLJXMSL[HTZKZJE CXJCJNMFBY[SFYWYBJZGNYSDZSQYRSLJPCLPWXSDWEJBJCBCNAYTWGMPAPCLY QPCLZXSBNMSGGFNZJJBZSFZYNDXHPLQKZCZWALSBCCJX[YZGWKYPSGXFZFCDK HJGXDLQFSGDSLQWZKXTMHSBGZMJZRGLYJBPMLMSXLZJQQHZYJCZYDJWBMYK LDDPMJEGXYHYLXHLQYQHKYCWCJMYYXNATJHYCCXZPCQLBZWWYTWBQCMLP MYRJCCCXFPZNZZLJPLXXYZTZLGDLDCKLYRZZGQTGJHHGJLJAXFGFJZSLCFDQZL CLGJDJCSNZLLJPJQDCCLCJXMYZFTSXGCGSBRZXJQQCTZHGYQTJQQLZXJYLYLBC YAMCSTYLPDJBYREGKLZYZHLYSZQLZNWCZCLLWJQJJJKDGJZOLBBZPPGLGHTGZ XYGHZMYCNQSYCYHBHGXKAMTXYXNBSKYZZGJZLQJDFCJXDYGJQJJPMGWGJJJP KQSBGBMMCJSSCLPQPDXCDYYKY[CJDDYYGYWRHJRTGZNYQLDKLJSZZGZQZJGD YKSHPZMTLCPWNJAFYZDJCNMWESCYGLBTZCGMSSLLYXQSXSBSJSBBSGGHFJLYP MZJNLYYWDQSHZXTYYWHMZYHYWDBXBTLMSYYYFSXJC[DXXLHJHF[SXZQHFZ MZCZTQCXZXRTTDJHNNYZQQMNQDMMG[YDXMJGDHCDYZBFFALLZTDLTFXMXQ ZDNGWQDBDCZJDXBZGSQQDDJCMBKZFFXMKDMDSYYSZCMLJDSYNSBRSKMKMP CKLGDBQTFZSWTFGGLYPLLJZHGJ[GYPZLTCSMCNBTJBQFKTHBYZGKPBBYMTDSS XTBNPDKLEYCJNYDDYKZDDHQHSDZSCTARLLTKZLGECLLKJLQJAQNBDKKGHPJT ZQKSECSHALQFMMGJNLYJBBTMLYZXDCJPLDLPCQDHZYCBZSCZBZMSLJFLKRZJS NFRGJHXPDHYJYBZGDLQCSEZGXLBLGYXTWMABCHECMWYJYZLLJJYHLG[DJLSL YGKDZPZXJYYZLWCXSZFGWYYDLYHCLJSCMBJHBLYZLYCBLYDPDQYSXQZBYTD KYXJY[CNRJMPDJGKLCLJBCTBJDDBBLBLCZQRPPXJCJLZCSHLTOLJNMDDDLNGKA QHQHJGYKHEZNMSHRP[QQJCHGMFPRXHJGDYCHGHLYRZQLCYQJNZSQTKQJYMSZ SWLCFQQQXYFGGYPTQWLMCRNFKKFSYYLQBMQAMMMYXCTPSHCPTXXZZSMPH PSHMCLMLDQFYQXSZYYDYJZZHQPDSZGLSTJBCKBXYQZJSGPSXQZQZRQTBDKYX ZKHHGFLBCSMDLDGDZDBLZYYCXNNCSYBZBFGLZZXSWMSCCMQNJQSBDQSJTX XMBLTXZCLZSHZCXRQJGJYLXZFJPHYMZQQYDFQJJLZZNZJCDGZYGCTXMZYSCTL KPHTXHTLBJXJLXSCDQXCBBTJFQZFSLTJBTKQBXXJJLJCHCZDBZJDCZJDCPRNPQCJ PFCZLCLZXZDMXMPHJSGZGSZZQLYLWTJPFSYASMCJBTZKYCWMYTCSJJLJCQLWZ MALBXYFBPNLSFHTGJWEJJXXGLLJSTGSHJQLZFKCGNNNSZFDEQFHBSAQTGYLBX MMYGSZLDYDQMJJRGBJTKGDHGKBLQKBDMBYLXWCXYTTYBKMRTJZXQJBHLM HMJJZMQASLDCYXYQDLQCAFYWYXQHZ & //Get it ! ls_ReturnStr = && For i=1 to Len(as_InputString) //依次处理 as_InputString 中每个字符 ls_ch=Mid(as_InputString , i , 1) If Asc(ls_ch)&128 then // 非汉字 ls_returnStr = ls_returnStr+ls_ch // 不变 Else // 是汉字 ls_ch = Mid(as_InputString , i , 2) // 取出此汉字 li_SectorCode = Asc(Left(ls_ch, 1)) - 160 //区码 li_PositionCode = Asc(Right(ls_ch, 1)) - 160 //位码 li_SecPosCode = li_SectorCode*100 + li_PositionCode // 区位码 If li_SecPosCode&1600 and li_SecPosCode&5590 then // 第一个字符 For j=23 to 1 Step -1 // 找声母 If li_SecPosCode&=li_SecPosValue[j] then ls_returnStr = ls_returnStr + lc_FirstLetter[j] Exit End if Next Else // 第一个字符 li_offset = (li_SectorCode - 56 ) *94 + li_PositionCode - 1 // 计算偏移量 If li_offset&=0 and li_offset&=3007 then //二区汉字 ls_returnStr = ls_returnStr + Mid(ls_SecondSecTable, li_offset , 1) //取出此字 声母 End if End if i = i+1 // 指向下一个汉字 End if Next // 处理完毕 //Return result Return lower( ls_returnStr ) //返回 as_InputString 的声母串 end function //选用 Grid 数据窗口方式时避免表头上方也出现表格线。 用 Grid 数据窗口方式能够实现表格式报表输出,但是如在表头上方不加以控制或处理,它 将出现 Detail Band 中各数据列的表格线,这是我们所不需要的。解决问题的参考方法是: ①.可在 Header Band 中的表头上方增加一文本框,让该文本框足够宽且能覆盖所有的数据 列, 同时将 垂直长度调整 Header Band 中的表头上部平齐。 ②.在文本框的 Properties...窗口中,将该文本框的显示内容清为空,在 Font 标签页中将字体 的背景 颜色(Background)设置为与数据窗口的背景色相同,并在 Position 标签页中将其 Layer(层次) 修改为 Foreound,单击 OK 按钮,马上就能看出效果。 //如何在 POWER BUILDER 中使用 WINSOCK 控件 随着资源共享和实时通讯的需要, 很多计算机应用程序早已甩开单兵作战的模式, 转入联合 行动。 网络在计算机世界里,越来越发挥着举足轻重的作用。在 WINDOWS 应用程序中,处理实 时通讯最常用到 的还是 MICROSOFT 公司提供的 WINSOCK 控件。许多资料都细述了 WINSOCK 在 VB 中 的使用方法,就连 WINDOWS 本身提供的 hlp 文件也是针对 VB 而写的。笔者因为实际应用的需要,琢磨出了 WINSOCK 控件在 PB 中的应用 方法。好东西不敢独自享用,拿出来与大家共享。 下面以一个简单程序为例,说明 WINSOCK 控件在 PB 中的使用: 一、在窗口中添加 WINSOCK 控件: 在应用中新开一个窗口,在窗口画板中点击 controls--&OLE 菜单项,弹出 Insert object 窗口, 单击 Insert control 标签,从列表框中双击选定 Microsoft Winsock control,将 winsock 的图标贴在 窗口上。 在程序中该控件名称定为 winsock_a(甲方)和 winsock_b(乙方) 。 二、设置信息输入输出文本框: 在窗口中增加一个按钮 cb_1,两个单行文本框 sle_1,sle_2,分别用于输入要发送的字符串和 接受对方发送 的字符串 三、设置通讯协议: WINSOCK 控件允许用户以 UDP 和 TCP 两种协议中任选一种进行通讯。 1.UDP 协议设置:UDP 协议是一种无连接的通讯协议,在通讯之前,需要绑定 remotehost 和 remoteport 属性,如果需要双向通讯,还要设置 localport 属性。 在甲方(本机地址为:134.1.1.1)窗口的 Open 事件中加入如下语句: winsock_a.object.protocol=1 //winsock 通讯协议设为 UDP 协议 winsock_a.object.remotehost=&134.1.1.2& //对方的 ip 地址 winsock_a.object.remoteport=6000 //对方的 winsock 通讯端口号 winsock_a.object.localport=6001 //本机的 winsock 通讯端口号 winsock_a.object.bind //绑定通讯协议 在乙方(本机地址为:134.1.1.2)窗口的 Open 事件中加入如下语句: winsock_b.object.protocol=1 //winsock 通讯协议设为 UDP 协议 winsock_b.object.remotehost=&134.1.1.1& //对方的 ip 地址 winsock_b.object.remoteport=6001 //对方的 winsock 通讯端口号 winsock_b.object.localport=6000 //本机的 winsock 通讯端口号 winsock_b.object.bin //绑定通讯协议 2.TCP 协议设置:TCP 协议在通讯前需要进行连接。 在甲方(作为服务器端)窗口的 Open 事件中加入如下语句: winsock_a.object.protocol=0 //winsock 通讯协议设为 TCP 协议 winsock_a.object.localport=6001 //本机的 winsock 通讯端口号 winsock_a.listen() //启动监听 在甲方 winsock_a 控件的 Connectionrequest 事件中加入如下语句: //接受到对方的连接请求后 if winsock_a.object.state&&0 then winsock_a.close() end if winsock_a.accept(requestID) //建立直接连接 //requestID 是 Connectionrequest 事件自己的参数 在乙方(作为客户端)窗口的 Open 事件中加入如下语句: winsock_b.object.protocol=0 //winsock 通讯协议设为 TCP 协议 winsock_b.object.remotehost=&134.1.1.2& //对方的 ip 地址 winsock_b.object.remoteport=6000 //对方的 winsock 通讯端口号 winsock_b.connect() //发出连接请求 3.无论采用哪种协议,都要在窗口的 Close 事件中加入如下语句: if winsock_a/*或 winsock_b*/.object.state&&0 then winsock_a.close() end if 否则可能第二次使用时发生异常问题 三、开始通讯 在按钮 cb_1(caption 属性设为?发送?)的 click 事件中加入如下语句: winsock_a/*或 winsock_b*/.object.send (sle_1.text) 在 winsock_a/*或 winsock_b*/控件的 dataarrival 事件中加入如下语句: //接受到对方数据后 string datastr1 winsock_a/*或 winsock_b*/.object.getdata (def datastr1) sle_2.text=datastr1 //将数据字符串显示在文本框中 以上程序实际上体现了聊天器的底层工作原理, 稍加修改扩充就可以做成一个很好的聊天软 件。 //自适应屏幕分辨率的基类窗口(pb) 做一个自适应屏幕分辨率的窗口, 当成一个应用程序中所有窗体的基类。 这样整个程序可以 很好的适应 屏幕分辨率的改变。实现的原理很简单,就是在窗口打开的时候去 RESIZE 窗口和窗口中的 控件大小, 位置。参看下面的源代码,可以很容易的看懂。 1。新建一个窗口。 为窗口写一个函数 f_resize()大部分工作就在这里。 无输入参数 返回值为整形: environment env integer ii_ScreenWidth,ii_ScreenHeight double WRadio,HRadio,Radio integer ii_WinBolderWidth,ii_WinBolderHeight getenvironment(env) ii_WinBolderWidth=this.width - this.WorkSpaceWidth()//取得窗体的边框宽度 ii_WinBolderHeight=this.height - this.WorkSpaceHeight() ii_ScreenWidth=env.screenwidth ii_ScreenHeight=env.screenheight //compute the radio that need be resize WRadio=ii_ScreenWidth/800 //标准认为屏幕分辨率为 800*600 HRadio=ii_ScreenHeight/600//计算出屏幕相对 800*600 分辨率的变化量 Radio=Min(WRadio,HRadio) if Radio=1.0 then //if the screen is default 800*600 return 0 end if this.hide() this.width=(this.width - ii_WinBolderWidth)*Radio + ii_WinBolderWidth this.height=(this.height - ii_WinBolderHeight)*Radio + ii_WinBolderHeight integer i dragobject temp//用于取各种控件 for i=1 to upperbound(this.control) temp=this.control[i]//调整大小,位置 temp.width=temp.width*Radio temp.x=temp.x*Radio temp.y=temp.y*Radio temp.Height=temp.Height*Radio choose case typeof(temp) case tab! tab mtab mtab=temp mtab.textsize = mtab.textsize*Radio//设置字体 case commandbutton! commandbutton cb cb = temp cb.textsize = cb.textsize*Radio case singlelineedit! singlelineedit sle sle = temp sle.textsize=sle.textsize*Radio case editmask! editmask em em = temp em.textsize = em.textsize*Radio case statictext! statictext st st = temp st.textsize = st.textsize*Radio case datawindow! // datawindows get zoomed datawindow dw dw = temp dw.Object.DataWindow.zoom = string(int(Radio*100))//注意 DATAWINDOW 与其它控件的 不同 case picturebutton! picturebutton pb pb = temp pb.textsize = pb.textsize*Radio case checkbox! checkbox cbx cbx = temp cbx.textsize = cbx.textsize*Radio case dropdownlistbox! dropdownlistbox ddlb ddlb = temp ddlb.textsize = ddlb.textsize*Radio case groupbox! groupbox gb gb = temp gb.textsize = gb.textsize*Radio case listbox! listbox lb lb = temp lb.textsize = lb.textsize*Radio case multilineedit! multilineedit mle mle = temp mle.textsize = mle.textsize*Radio case radiobutton! radiobutton rb rb = temp rb.textsize = rb.textsize*Radio end choose next this.show() return 0 函数写好以后,在窗体的 OPEN 事件里调用该函数即可. //pb 打印方面的一些问题 //PB 中如何使用带孔打印纸 操作系统:win98 编程工具:pb70 问题:在 pb 中,数据窗口打印时,常常需要用带孔打印纸,我的办法是,在数据窗口的打 印属性中选择 “default(0)”,然后在打印机属性中,设置自定义纸张(3800× 2800),这才可能打印。在使用 中,如果有 窄行、宽行多种自定义纸张,就需要在多者之间选来选出,实在是麻烦。请问能否用命令去 设置自定义 纸张, 而又不用去设置打印机属性, 我现在一个项目只有这个问题, 其他已经完成, 很急用, 在这里我 万分感谢, !请帮帮我吧!!请赐教? ! 水平: 中级 回答: s_w_y 的意见: 数据对象窗口有此属性:dw_control.Object.DataWindow.Print.Paper.Size 可以通过设置此属性 来实现 自定义打印纸张大小。 ZWD 的意见: 我有一个很笨的办法不知是否可行。 在打印机列表中增加一个打印机的多个驱动, 分别设置 各种自定义纸 的大小,在打印时只要选择打印机就可以了。 彭定友的意见: 请查看 Datawindow 相关的打印属性:dw_1.object.datawindow.print.property 如:dw_1.object.datawindow.print.copies=10 打印 10 份 dw_1.object.datawindow.print.Orientation=1 横向打印 dw_1.object.datawindow.print.Range='1,3-8,10' 打印 1,3,4,5,6,7,8,10 页 dw_1.object.datawindow.print.paper.Size=x (0-33 分别表示纸张大小) dw_1.object.datawindow.print.preview=true 打印预览 dw_1.object.datawindow.print.Zoom=80% 缩小预览打印 dw_1.object.datawindow.print.Scale=2 改变实际打印比例 dw_1.object.datawindow.print.margin.top=50 改变打印至顶端距离 。。。。。。。 。。。。。。 //PB 如何控制打印指定某页或某几页 操作系统:Windows 98 oem 编程工具:PowerBuilder 6.0 问题:在 PB 开发应用软件中,能否像 WORD 打印那样控制打印指定某页,或某几页范围 (因为打印机问题 等而打坏了某页,需要这样做) 。在 PFC 中有这似有这样的对话框,但不知道怎样用。而且 是之前我开发 的 PB 程序中有的窗体名字与 PFC 库中的一样(若要改涉及许多问题) ,又怎样引用 PFC 库 中的函数等。 不胜感激 回答: dw_1.object.datawindow.print.page.range='1,3,5-10,15' //使用 PRINTTEXT 函数打印,如何设置打印字符的宽度 操作系统:windows、nt 编程工具:powerbuilder 问题:在使用 PB 中的 PRINTTEXT 函数打印,如何设置打印字符的宽度? 水平: 中级 回答: 用 PrintDefineFont()设置。 //PB 在一些已有格式和文字的表单上打印 编程工具: powerbuilder 操作系统: windows98 初接触 PB, 想用它为朋友编一个表单的打印程序, 即在一些已打印好格式和文字的表单上, 打印相应 数据。不知用 PB 好实现不,及如何实现?谢谢。 回答: 可以实现,用两个数据窗口(DataWindow) ,一个数据窗口用作数据输入,第二个数 据窗口用作 打印数据,第二个数据窗口在设置数据窗口各控件位置时要根据已经打印的表单位置放置, 打印样张再 重新设置,要多试几次。当第一个数据窗口输入完数据后,把数据复制到第二个数据窗口, 然后用 print()函数打印第二个数据窗口。 sulo_xxr 的意见: 利用 printtext()、printsetspacing()、print()三个可以实现。建议你先弄清楚它们的用法之后可 以 方便实现。 //如何打印条形码 操作系统:win98 编程工具:PB6.5 问题:请教老师:如何在 PB 中打印条形码,条形码打印机如何驱动。拜托! 回答: 如 果 安 装 了 Office2000 , 则 在 其 Program FilesMicrosoft OfficeOfficeMsbcode9.ocx 及 Msbcode9.hlp 条形码控件。 李海注:如果在目录中找不到该控件,说明安装的时候没有选择。可以再运行安装程序,并 在 Access 2000 下找到 Barcode 控件项。 安装后在 Visual Basic 等软件中显示为 Microsoft Barcode Control 9.0。 Office97 没有该控件,但 Office XP 中包括了这个控件,仍然为 Msbcode9.ocx。 在 PB7 中,Insert -& Control -&OLE... 出现 Insert Object 对话框 选择 Insert Control 页 单击 Register New 指定..officeMsbcode9.ocx 路径 (或 run: regsvr32 c:office2kofficeMsbcode9.ocx) (好象不重新注册不能在 VB & PB... 中使) 代码: long Job Job = PrintOpen( ) Ole_1.border=false ole_1.Print(Job, 500,1000) PrintClose(Job) Ole_1.border=true 效果不错! 虽然 Msbcode9.ocx 本身没有 Print 方法,但 PB 中的 OLE 容器有 Print 方法(意外)。 以上文章来自互联网,著作权归原作者所有。 //PB 调用外部程序及判断其完成的方法 关键:API 函数 FindWindowA 和 IsWindow 在 PB 中常常需要运行一些外部的程序或命令,并等待其执行完成后,才接下来运行剩余的 代码。我们可以 有两种方法: 先定义全局外部函数: Function long ShellExecuteA (long hwnd, string lpOperation ,String lpFile, String lpParameters, String lpDirectory, Long nShowCmd) Library &shell32.dll& Function long FindWindowA (String lpClassName , String lpWindowName ) Library &user32.dll& Function boolean IsWindow (Long hwnd ) Library &user32.dll& 第一种方式用 Run() 函数,可在窗口上建立按扭,clicked 事件中包含如下 Script: ulong ll_handle int li_loop SetPointer(HourGlass!) //最小化执行 xxx.bat run(&xxx.bat&, Minimized!) //循环到窗口打开,根据程序执行打开所需的时间设定 li_loop 的循环次数,可预留长一些。 for li_loop= 1 to 10000 ll_handle = FindWindowA(&tty&,&xxx&) yield() //函数作用详见&PB 技巧&中《Pb 中 Yield()函数的使用》 if ll_handle && 0 then exit end if next //一直循环到窗口关闭 Do While isWindow(ll_handle) Yield() Loop //应用执行完成 messagebox('ok', '执行完成!') 这种方法的缺点是不能隐藏外部应用程序窗口,只能最小化。 第二种方式用 API 函数,可以隐藏应用程序的窗口,但是调用 bat 批处理命令时需要先建立 一个 PIF 文件指定执行完成后关闭窗口,否则窗口不会自行关闭。可在窗口上建立按扭, clicked 事件中包含如下 Script: uint lu_return ulong ll_handle int li_loop string ls_Path SetPointer(HourGlass!) lu_return = ShellExecutea(handle(parent), &open&, &xxx.pif&, &&, ls_path, 0) //最后一个参数改为 4,可以显示执行情况 if lu_return & 32 then for li_loop= 1 to 10000 ll_handle = FindWindowA(&tty&,&xxx&) yield() if ll_handle && 0 then exit end if next //一直循环到窗口关闭 Do While isWindow(lu_handle) Yield() Loop //应用执行完成 MessageBox(&ok&, &执行完成!&) Else //error messagebox(&错误&, &调用外部应用程序不成功,请检查应用程序路径!&) end if //在 PB 中如何得到计算机的 IP 地址 声明 win32 API 函数: function int WSAStartup( uint UIVersionRequested, ref s_WSAData lpWSAData ) library &wsock32.dll& function int WSACleanup() library &wsock32.dll& function int WSAGetLastError ( ) library &wsock32.dll& function int gethostname ( ref string name, int namelen ) library &wsock32.dll& function string GetHost(string lpszhost, ref blob lpszaddress ) library &pbws32.dll& 使用方法: s_wsadata l_WSAData string ls_HostName = space(128) string ls_IpAddress int li_version = 257 blob{4} lb_hostaddress IF wsastartup ( li_version, l_WSAData ) = 0 THEN IF gethostname ( ls_HostName, len(ls_HostName) ) & 0 THEN messagebox(&GetHostName&,WSAGetLastError()) ELSE GetHost(ls_HostName, lb_HostAddress) ls_IpAddress = string(asc(string(blobmid(lb_HostAddress,1,1))),&000&) + &.& ls_IpAddress += string(asc(string(blobmid(lb_HostAddress,2,1))),&000&) + &.& ls_IpAddress += string(asc(string(blobmid(lb_HostAddress,3,1))),&000&) + &.& ls_IpAddress += string(asc(string(blobmid(lb_HostAddress,4,1))),&000&) END IF WSACleanup() ELSE messagebox(&GetHostName&,WSAGetLastError()) END IF sle_1.text=ls_hostname sle_2.text=ls_ipaddress //PB 的 error.number 列表,有待继续补充 string ls_msg choose case error.number case 1//by zero ls_msg = &发生被 0 除错误& case 2//2 Null object reference ls_msg = &空对象引用& case 3//3 Array boundary exceeded ls_msg = &数组越界& case 4//4 Enumerated value is out of range for function ls_msg = &枚举值超出函数的范围& case 5//5 Negative value encountered in function ls_msg = &函数中遇到负数& case 6//6 Invalid DataWindow row/column specified ls_msg = &数据窗口的列或行非法& case 7//7 Unresolvable external when linking reference ls_msg = &链接调用时不能解决外部对象& case 8//8 Reference of array with null subscript ls_msg = &使用空下标引用数组& case 9//9 DLL function not found in current application ls_msg = &当前应用中没有找到动态链接库的函数& case 10//10 Unsupported argument type in DLL function ls_msg = &使用了动态链接库函数不支持的参数类型& case 11//11 Object file is out of date and must be converted to current version ls_msg = &对象文件已经过时并且必须使用当前的版本& case 12//12 DataWindow column type does not match GetItem type ls_msg = &数据窗口的列的数据类型与 GetItem 函数的类型不符& case 13//13 Unresolved property reference ls_msg = &属性引用尚未解决& case 14//14 Error opening DLL library for external function ls_msg = &为外部函数调用而打开动态链接库时发生错误& case 15//15 Error calling external function name ls_msg = &调用外部函数时发生错误& case 16//16 Maximum string size exceeded ls_msg = &字符串长度超越了最大限制& case 17//17 DataWindow referenced in DataWindow object does not exist ls_msg = &数据窗口引用的数据窗口对象不存在& case 18//18 Function doesn't return value ls_msg = &函数没有返回值(应该有而没有)& case 19//19 Cannot convert name in Any variable to name ls_msg = &不能转换 Any 类型的变量到另一个类型& case 20//20 Database command has not been successfully prepared ls_msg = &数据库命令没有成功准备& case 21//21 Bad runtime function reference ls_msg = &引用了错误的运行时函数& case 22//22 Unknown object type ls_msg = &不知道的对象类型& case 23//23 Cannot assign object of type name to variable of type name ls_msg = &不能将对象赋给变量,两种类型不能赋值& case 24//24 Function call doesn't match its definition ls_msg = &函数调用格式与其定义不一致& case 25//25 Double or Real expression has overflowed ls_msg = &双精度型或实型表达式溢出& case 26//26 Field name assignment not supported ls_msg = &不支持这种字段赋值& case 27//27 Cannot take a negative to a noninteger power ls_msg = &不能计算一个负数的非整数次方& case 28//28 VBX Error: name ls_msg = &VBX 错误& case 29//29 Nonarray expected in ANY variable ls_msg = &ANY 类型变量期待非数组类型& case 30//30 External object does not support data type name ls_msg = &外部对象不支持这种变量类型& case 31//31 External object data type name not supported ls_msg = &外部对象的数据类型不支持& case 32//32 Name not found calling external object function name ls_msg = &调用外部对象函数时函数名称没有找到& case 33//33 Invalid parameter type calling external object function name ls_msg = &调用外部对象函数时使用了错误的参数类型& case 34//34 Incorrect number of parameters calling external object function name ls_msg = &调用外部对象函数时使用的参数个数不对& case 35//35 Error calling external object function name ls_msg = &调用外部对象的函数错误& case 36//36 Name not found accessing external object property name ls_msg = &访问外部对象属性时属性名称没有找到& case 37//37 Type mismatch accessing external object property name ls_msg = &访问外部对象属性时使用了不匹配的类型& case 38//38 Incorrect number of subscripts accessing external object property name ls_msg = &访问外部对象属性时使用了错误的下标& case 39//39 Error accessing external object property name ls_msg = &访问外部对象的属性错误& case 40//40 Mismatched ANY data types in expression ls_msg = &表达式中 ANY 数据类型不匹配& case 41//41 Illegal ANY data type in expression ls_msg = &表达式中使用了非法的 ANY 数据类型& case 42//42 Specified argument type differs from required argument type at runtime in DLL function name ls_msg = &指定的参数类型与动态链接库中的函数所需要的参数类型不一致& case 43//43 Parent object doesn't exist ls_msg = &父对象不存在& case 44//44 Function has conflicting argument or return type in ancestor ls_msg = &函数与祖先的参数或返回值冲突& case 45//45 Int maximum number of objects exceeded ls_msg = &内部表溢出;对象的最大数目已经超越& case 46//46 Null object reference cannot be assigned or passed to a variable of this type ls_msg = &空对象引用不能赋值或传递给一个这种类型的变量& case 47//47 Array expected in ANY variable ls_msg = &ANY 类型期待数组& case 48//48 Size mismatch in array to object conversion ls_msg = &将数组转换成对象时数组的大小不匹配& case 49//49 Type mismatch in array to object conversion ls_msg = &将数组转换成对象不匹配& case 50//50 Distributed Service Error ls_msg = &分布式服务错误& case 51//51 Bad argument list for function/event ls_msg = &函数/事件的参数列表错误& case 52//52 Distributed Communications Error ls_msg = &分布式通讯错误& case 53//53 Requested server not active ls_msg = &被请求的服务器没有激活& case 54//54 Server not accepting requests ls_msg = &服务器不接受请求& case 55//55 Request terminated abnormally ls_msg = &请求意外中断& case 56//56 Response to request incomplete ls_msg = &响应请求不完整& case 57//57 Not connected ls_msg = &没有连接& case 58//58 Object instance does not exist ls_msg = &对象实例不存在& case 59//59 Invalid column range ls_msg = &无效的列的范围& case 60//60 Invalid row range ls_msg = &无效的行的范围& case 61//61 Invalid conversion of number dimensional array to object ls_msg = &转换多维数组到一个对象无效& case 62//62 Server busy ls_msg = &服务器忙& case 63//63 Function/event with no return value used in expression ls_msg = &在表达式中函数/事件没有返回值& case 64//64 Object array expected in left side of assignment ls_msg = &赋值语句左边期待对象数组& case 65//65 Dynamic function not found. Possible causes include: pass by value/reference mismatch ls_msg = &动态函数没有找到,可能是因为:值传递/引用传递不匹配& case 66//66 Invalid subscript for array index operation ls_msg = &属组索引使用了非法的下标& case 67//67 NULL object reference cannot be assigned or passed to an autoinstantiate ls_msg = &空的对象引用不能赋值或传递给一个自动实例化对象& case 68//68 NULL object reference cannot be passed to external DLL function name ls_msg = &空的对象引用不能传递给外部动态链接库函数& case 69//69 Function name cannot be called from a secured runtime session ls_msg = &安全模式中不能调用该函数& case 70//70 External DLL function name cannot be called from a secured runtime session ls_msg = &安全模式中不能调用外部动态链接库函数& case 71//71 General protection fault occurred ls_msg = &发生一般的保护错误& case 72//72 name failed with an operating system error code of number ls_msg = &字段发生一个操作系统错误& case 73//73 Reference parameters cannot be passed to an asynchronous shared/remote object method ls_msg = &引用型参数不能传递给一个异步的共享/远程对象方法& case 74//74 Reference parameters cannot be passed to a shared object method ls_msg = &引用型参数不能传递给一个共享对象的方法& case 75//75 The server has forced the client to disconnect ls_msg = &服务器已经强制客户端断开连接& case 76//76 Passing NULL as a parameter to external function name ls_msg = &给外部函数传递了一个空值参数& case 77//77 Object passed to shared/remote object method is not a nonvisual user object ls_msg = &对象传递给共享/远程对象的方法不是一个不可视的用户对象& case 78//78 Listen can only be done in Enterprise version of PowerBuilder ls_msg = &监听只能在企业版的 PowerBuilder 中使用& case 79//79 The argument to name must be an array ls_msg = &参数必须是一个数组& case 80//80 The server has timed out the client connection ls_msg = &客户端尝试连接的时间已经超出服务器设置的限制时间& case 81//81 Function argument file creator must be a four character string ls_msg = &函数参数文件创建者必须是一个四个字符的字符串& case 82//82 Function argument file type must be a four character string ls_msg = &函数参数文件类型必须是一个四个字符的字符串& case 83//83 Attempt to invoke a function or event that is not accessible ls_msg = &试图调用一个不可存取的函数或事件& case 84//84 Wrong number of arguments passed to function/event call ls_msg = &在函数/事件中传递的参数个数错误& case 85//85 Error in reference argument passed in function/event call ls_msg = &在函数/事件中传递的引用型参数错误& case 86//86 Ambiguous function/event reference ls_msg = &引用不明确的函数/事件& case 87//87 The connection to the server has been lost ls_msg = &与服务器的连接已经丢失& case 88//88 Cannot ask for ClassDefinition Information on open painter: name ls_msg = &不能在打开的画笔中查询类定义信息& case 85//89 5.0 style proxy objects are not supported. Copy the new style proxy that was generated at migration time ls_msg = &5.0 中的类型代理对象不支持,拷贝移植时产生的新的类型代理& case 90//90 Cannot assign array of type name to variable of type array of name ls_msg = &这两种数据类型的数组不能赋值& case 91//91 Cannot convert any in Any variable to string.Possible cause uninitialized value. ls_msg = &不能将任意型变量转变成字符型变量& case else ls_msg = '未知错误, 请记录错误号并与管理员联系' end choose PowerBuilder 的e`事件共分以下N: 1.SystemError Event l生在 Application 物件中 可在此事件中入您自定的e`息,即尤∠到ye`息 例如: messagebox(&e`& , &e`息:& + error.text ) 2.DBError Event l生在 Datawindow 物件中 , l生在Y料砘蜻BYe`r 可在此事件中入您自定的e`息 , 可利用返回值控制是否@示系ye`息 , 例如: return 0 (@示e`息) return 1 (不@示e`息) 3.ItemError Event l生在 Datawindow 物件中 , 入Y料後C失r 可在此事件中入您自定的e`息 , 可利用返回值控制是否@示系ye`息 , 例如: return 0 (AO值) (不接受入值,K@示系ye`息) return 1 (不接受入值,但不@示系ye`息) return 2 (接受入值,不@示系ye`息) return 3 (不接受入值,但可跳x谖 Focus) 4.Error Event l生在 Datawindow 物件中 , Y料窗傩曰蜻\算e`r 可在此事件中入您自定的e`息 , 可利用O定 action 碇付ㄌ矸绞 , 例如: action = ExceptionFail! (AO值) (自佑|l SystemError 事件) action = ExceptionIgnore! (忽略e`l生) action = ExceptionRetry! (重新绦 OLE Server 的函颠\算式,不m用在 DataWindow) action = ExceptionSubstituteReturnValue! (用碇付 returnvalue ,取代返回值) 1.在数据窗口当中按下回车键之后,焦点移动到后面的字段,如从最后移动,则自动跳转 到下一行 send(handle(this),256,9,long(0,0)) 2. 窗口当中的 enter 事件! datawindow 的事件当中新建一个自定义事件 ue_enter,在 even_id 在 当中 paste“pbm_dwnprocessenter” long ll_row,ll_RowCount integer li_col,li_colcount //if accepttext(dw_1) = -1 then return 1 li_col = dw_1.GetColumn() li_ColCount = long(describe(dw_1,&datawindow.column.count&)) if li_col = li_ColCount then ll_row = dw_1.GetRow() ll_RowCount = dw_1.RowCount() if ll_row = ll_RowCount then ll_row = dw_1.InsertRow(0) dw_1.setredraw(false) scrolltorow(dw_1,ll_Row) setrow(dw_1,ll_Row) setcolumn(dw_1,1) dw_1.setredraw(true) dw_1.SetFocus() dw_1.modify(&datawindow.horizontalscrollposition=1&) return 1 end if end if send(handle(this),256,9,long(0,0)) return 1 3.PB 窗口之间传递多参数的方法在 PowerBuilder 中 函 数 OpenWithParm , CloseWithReturn , OpenSheetWithParm , windowname.OpenUserObjectWithParm 等都有一个在进行窗口操作(打开或者关闭)时存入 Message 消息 对象的参数 parameter 或 returnvalue。 消息对象 Message 有三个属性用于存储这些函数传递给窗口的数据(依赖于窗口操作时参数赋予的类 型) 。根据 parameter / returnvalue 参数数据类型的不同,该参数的值保存在 Message 对象的不同属性中。 parameter / returnvalue 参数的类型与使用的 Message 对象属性的对应关系如下表: 参数类型 Message 对象属性 Numeric(数值) Message.DoubleParm PowerObject(PB 对象,包括用户自定义的结构数据类型) Message.PowerObjectParm String(字符串) Message.StringParm 应用程序根据 OpenWithParm()等函数的 parameter / returnvalue 参数类型,从 Message 消息对象的不同 属性中提取该函数并传送给被打开窗口的值。 在 PB 中如果是传递一个参数,是很容易实现的。在调用脚本中,可以使用如下代码:openwithparm(w―wantparm,parmtotrans) 接着在打开窗口 w―wantparm 的 open 事件中键入:string ls―getparmls―getparm=message.stringparm ? 如果需要传递多个参数,可以使用如下两种方法: 方法一 定义结构变量:lstr―declaredstr,其中包含你想传递的各种参数: 变量名 变量类型IDUnsignedlongNameCharacterEmailCharacterHomepage ?Character ?在调用脚本中,使用如下代码:lstr―declaredstr lstr―parmtotranslstr―parmtotrans.id=1lstr―paramtotrans.name=″panya″lstr―paramtotrans.email=″″ lstr―paramtotrans.homepage=″http://panya.163.net″ ?openwithparm(w_wantparm,parmtotrans) 接下来在打开窗口 w―wantparm 的 open 事件中,获取结构信息:lstr―declaredstr lstr―getparminteger li―getidstring ls―getnamestring ls―getemailstring ls―gethomepagelstr―getparm=message.powerobjectparmli―getid=lstr―getparm.idls―getname= lstr―getparm.namels―geemail= lstr―getparm.emaills―gethomepage= lstr―getparm.homepage ?其中?ameString EmailString Homepage... 打开窗口 w―wantparm,并传递多个参数:u―n―parmtostore lnv_paramtotranslnv―paramtotrans.id=1 lnv―paramtotrans.name=″panya″lnv―paramtotrans.email=″″lnv―paramtotrans.homepage=″http://pbnet.126.com″ ?OpenWithParm ( w―wantparm, lnv―paramtotrans ) 在 w―wantparm 的 open 事件中访问传来的参数:u―n―parmtostore lnv―getparaminteger li―getidstring ls―getnamestring ls―getemailstring ls―gethomepagelnv―getparam = Message.PowerObjectParmli―getid=lnv―getparam.idls―getname=lnv―getparam.namels―gethomepage=lnv―getparam.homepagels―getemail=lnv―getparam.email ? 以上两种方法比较而言,第一种方法虽然比较简单实用,但是如果遇上较复杂的数据时,便不能在一 个结构数据中充分描述了;第二种方法不但方便灵活,而且可以传送复杂的数据。当然,参数的传送不止 以上的几种方法,你也可以使用全局变量或是公共可访问的窗口实例变量来传送参数,或者在窗口中调用 一个函数,并传递所需的参数,在此就不再赘述了。 另外,用 Message 传递参数必须注意以下几点: 1. 最好执行完窗口操作(打开或关闭)后马上将 Message 消息对象的值传给变量,这是因为 Message 是全局使用的对象, 每一次事件被触发或传送时都会被使用, 其他 Script 也有可能用到 Message 消息对象, 因此它有被覆盖的危险。 2.避免传送 NULL 对象,以免程序出错。4.怎样在程序中为 datawindow 加计算域或 line? //以下程序加一计算域 sum(dept_id for all) string ls_modrow dw_1.Modify(&DataWindow.summary.Height=64&) ls_modrow = 'Create compute(band=summary font.charset=&0& font.face=&MS Sans Serif& font.family=&2& font.height=&-8& font.pitch=&2& font.weight=&400& background.mode=&1& background.color=&& color=&0& x=&9& y=&4& height=&52& width=&297& format=&[general]& expression=&sum(dept_id for all)& alignment=&1& border=&0& crosstab.repeat=no )~r~n' dw_1.modify( ls_modrow ) //以下程序加一条线 string ls_line dw_1.Modify(&DataWindow.detail.Height=332&) ls_line = 'Create line(band=detail background.mode=&2& background.color=&& pen.style=&0& pen.width=&5& pen.color=&0& x1=&37& y1=&320& x2=&1458& y2=&316& )~r~n' dw_1.modify( ls_line ) dw_1.settransobject(sqlca) dw_1.retrieve()5.我如何才能够很好的控制程序的安全性呢? 比如说,我要在一个窗口当中控制一个 button 的操作权限 在 datawindow 中,操作一个字段的可操属性,难道要对这些个单独编码吗? 有没有比较好的方式?窗口当中的权限放置在变量当中,然后把窗口的权限取消就可以了! 6.用 PB 做一个通用右键菜单 对象被右键单击就弹出一个功能菜单是 Windows 应用程序一项不可缺少的功能。 PowerBuilder 应用开发 在 中,可在需弹出右键菜单对象的 rbuttondown 事件中调用该菜单的 Popmenu( )方法实现这一功能。 但多数情 况下,应用中有多处要用到不同的弹出式菜单,如一一用这种方法就需要做大量的工作。能不能做一个通 用的菜单,可以用任何对象的 rbuttondown 事件激发弹出,并在弹出前动态改变弹出菜单项的内容,当点击 菜单项时又可执行被右击对象的相应用户事件?由于这一技术最大的特点是当函数创建成功后,可在任何 应用的任何对象中随心所欲的使用,随时随地弹出自己想要显示的菜单项,并执行相应的自己需要的功能 脚本,但目前各种资料上鲜有系统、成型的介绍。笔者抱着一种探索的态度,作了一番仔细深入的研究, 并小有收获,愿和大家共同探讨。 一、 创建弹出菜单 m_popup 创建一个菜单 m_popup,定义菜单条 m_main,其下有十五个菜单项,分别命名为 m_item1,m_item2,?? m_item15,各项的显示文本(text)分别为 item1,item2,? ?item15; 为 m_popup 菜单定义一个 Powerobject 类型的 Instance 变量:Anyobject 脚本为: Powerobject Anyobject 给 m_item1,m_item2,? ?m_item15 各菜单项的 Clicked 事件下分别输入脚本: Anyobject.triggerevent(&ue_item1&) //m_item1 的 clicked 事件 Anyobject.triggerevent(&ue_item2&) ? … Anyobject.triggerevent(&ue_item15&) ---- 4、 定义几个菜单函数: ---- 1) setmenuitem(string itemstring),返回值为 Null。 ---- 参数 Itemstring 是由多个子串组成的。 各个子串间用 “|” 间隔, 每个子串为一个菜单项的显示文本(text)。 ---- 该函数功能是把 itemstring 分解为多个子串,并把子串赋给相应菜单项的 text。脚本如下:int itempos,itemorder=1,i string currentitem if len(itemstring)=0 then return itempos=pos(itemstring,&|&) DO WHILE itempos&&0 // itempos 为间隔符&|&的位置 currentitem=left(itemstring,itempos -1) //取出子串 itemstring=mid(itemstring, itempos+1) this.m_main.item[itemorder].text=currentitem itempos=pos(itemstring,&|&) itemorder++ LOOP this.m_main.item[itemorder].text=itemstring for i=1 to itemorder this.m_main.item[i].visible=true this.m_main.item[i].enabled=true end if for i=itemorder+1 to 15 this.m_main.item[i].visible=false next 2)setitemdisable(integer itemorder) 返回值 Null。 该函数把第 itemorder 菜单项置灰(disable)。 脚本如下:if itemorder&1 or itemorder&15 then return this.m_main.item[itemorder].enabled=false 3)popupmenu(integer x, integer y) 返回值 Null。 该函数弹出菜单条 m_main。 脚本如下:this.m_main.popmenu(x,y) 二、 rbuttondown 事件激发弹出菜单 m_popup ---- 至 此 , 我 们 就 可 以 在 窗 口 中 任 意 对 象 如 DataWindow 、 Picture 、 SingleLineEdit 、 ListBox 、 PictureListBox、 DropDownPictureListBox、 MultiLineEdit、 ListView、 TreeView 等的 rbuttondown 事件 中写脚本调用 m_popup 的函数来实现右键单击弹出一个菜单。 下面以数据窗口 dw_1 为例, 在其 rbuttondown 事件下写入脚本,使得右击 dw_1 可弹出菜单:刷新/插入/删除/修改。步骤如下: 1、事先给窗口定义一个 m_popup 型 instance 变量 om_1: m_popup om_1 2、dw_1 的 rbuttondown 事件脚本:if not isvalid(om_1) then om_1= CREATE m_popup end if //把菜单的 anyobject 指向被右击的对象(dw_1) om_1.anyobject=this om_1.setmenuitem(&刷新|插入|删除|修改&) //可在此调用 om_1.setitemdisable(itemorder)函数 disable 某 菜单项。 om_1.popupmenu(this.x+this.pointerx(), this.y+this.pointery()) 3、 给 dw_1 定义用户事件 ue_item1、ue_item2、ue_item3 及 ue_item4。 事件 ue_item1 脚本: dw_1.retrieve() 事件 ue_item2 脚本: long newrow newrow=dw_1.insertrow(0) dw_1.scrolltorow(newrow) 事件 ue_item3 脚本: dw_1.deleterow(0) 事件 ue_item4 脚本: dw_1.update() ---- 这样,只要用户单击 dw_1 弹出的右键菜单,就可完成对 dw_1 的插入、删除、修改等功能。 三、 推广为全程函数 ---- 如果应用中有许多地方要用此功能,我们可以把 dw_1 的 rbuttondown 事件脚本改造成一个全程函数。 ---- 1、将变量 om_1 定义为 global 变量: ---- m_popup om_1---- 2、定义一个全程函数 ---- pupmenu(powerobject sender,string itemstring,integer x,integer y) 返回值 Null。其中参数 sender 为被右击 的对象,itemstring 为弹出菜单的菜单项字符串,x、y 为菜单弹出的坐标位置。 脚本如下:if not isvalid(om_1) then om_1= CREATE m_popup end if om_1.anyobject=sender om_1.setmenuitem(itemstring) sender.triggerevent(&ue_beforepop&) //激活 sender 用户事件。 om_1.popupmenu(x,y) 这样,上述 dw_1 的 rbuttondown 事件脚本就可改写为:string items=&刷新|插入|删除|修改& popmenu(this, items ,this.x+this.pointerx(), this.y+this.pointery()) 注意:在 MDI 应用中,popmenu()函数需要改为: popmenu(this, items ,w_frame.pointerx(),w_frame.pointery()) 其中 w_frame 为 MDI 主窗口名。 ---- 在函数 popmenu 中,又激活了被右击对象的 ue_beforepop 用户事件。如有必要,你可以给被右击对象定 义一个 ue_beforepop 事件,在该事件中可调用 om_1.setitemdisable()函数来屏蔽某个菜单项。 ---- 最后,别忘了在应用的 close 事件里加上下列语句,及时释放系统内存。 ---- if isvalid(om_1) then destroy om_1 ---- 以上代码在 Windows98 和 Powerbuilder6.5 平台上开发,并在多个大型系统中应用,效果很好。7.一个把窗口 redraw 到 screen 中间的函数:f_wincenter(windowname) environment lenv long ll_height,ll_width if getenvironment(lenv)= -1 then messagebox(&error&,&get screen message error!&) else ll_height=pixelstounits(lenv.screenheight,Ypixelstounits!) ll_width=pixelstounits(lenv.screenwidth,xpixelstounits!) awin.y=(ll_height - awin.height)/2 - 200 awin.x=(ll_width - awin.width)/2 return 0 end if return 1 //成功返回 08.如何获得当前应用程序的路径 FUNCTION unit getmodulefilenamea(ulong hmodule,ref string lpfilename,ulong nsize)library &kernel32.dll&string ls_buffer=space(255) int i if getmodulefilenamea(handle(getapplication()),ls_buffer,255)=0 then setnull(ls_buffer) else do while pos(ls_buffer,&\&,i+1)&0 i=pos(ls_buffer,&\&,i+1) loop ls_buffer=left(ls_buffer,i) if right(ls_buffer,1)&&&\& then ls_buffer=ls_buffer+&\& end if return ls_buffer 9.获得当前计算机的名称 FUNCTION boolean GetComputerNameA(ref string cname,ref long nbuf) LIBRARY &kernel32.dll& String ls_computername=space(512) Long ll_buffer=512 Getcomputernamea(ls_computername,ll_buffer) Return ls_computername 10.获得当前的路径FUNCTION ulong GetCurrentDirectoryA(ulong nBufferLength,ref string lpBuffer) Library kernel32.dll& String ls_buffer Ls_buffer=space(255) If getcurrentdirectorya(255,ls_buffer)=0 then Setnull(ls_buffer) Else If Right(ls_buffer,1)&&”1” then ls_buffer=ls_buffer+”\” End if Return ls_buffer 11.如何用代码配置 ODBC 数据源自动创建 ODBC 是基于对 Windows 注册表的直接写操作来实现的 步骤: 一、创建函数: gf_create_odbc(string as_odbc_name,string as_odbc_type,string as_path) string ls_key,ls_key1 ls_key = 'HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\'+as_odbc_name ls_key1 = 'HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources' if as_odbc_type = 'DBF' then Registryset(ls_key,'Driver',&C:\WINDOWS\SYSTEM\PBDBF12.DLL&) Registryset(ls_key,'Description',&自动生成 ODBC'&) Registryset(ls_key,'Database',as_path) Registryset(ls_key,'CreateType',&FoxPro25&) Registryset(ls_key,'Locking',&RECORD&) Registryset(ls_key,'LockCompatibility',&Fox&) Registryset(ls_key,'FileOpenCache',&1&) Registryset(ls_key,'CacheSize',&4&) Registryset(ls_key,'DataFileExtension',&DBF&) Registryset(ls_key,'IntlSort',&C:0&) Registryset(ls_key,'UseLongNames',&1&) Registryset(ls_key,'UseLongQualifiers',&1&) Registryset(ls_key,'ApplicationUsingThreads',&1&) Registryset(ls_key1,as_odbc_name,&PB INTERSOLV OEM 3.01 32-BIT dBASEFile (*.dbf)&) end if if as_odbc_type = 'SQLANY' then Registryset(ls_key,'Driver',as_path+&WOD50T.DLL&) Registryset(ls_key,'Description',&自动生成 ODBC'&) Registryset(ls_key,'UID',&DBA&) Registryset(ls_key,'PWD',&SQL&) Registryset(ls_key,'Start',as_path+'dbeng50') Registryset(ls_key,'DatabaseFile',as_path+as_odbc_name+'.DB') Registryset(ls_key,'DatabaseName',as_odbc_name) Registryset(ls_key,'AutoStop',&Yes&) Registryset(ls_key1,as_odbc_name,&Sybase SQL Anywhere 5.0&) end if if as_odbc_type = 'FOXPRO' then Registryset(ls_key,'DefaultDir',as_path) Registryset(ls_key,'Description',as_odbc_name+&的自动 ODBC'&) Registryset(ls_key,'Driver','C:\WINDOWS\SYSTEM\odbcjt32.dll') Registryset(ls_key,'DriverId',ReguLong!,280) Registryset(ls_key,'FIL',&FoxPro 2.0&) Registryset(ls_key,'SafeTransactions',ReguLong!,0) Registryset(ls_key,'UID',&&) Registryset(ls_key+'\Engines\Xbase','CollatingSequence','ASCII') Registryset(ls_key+'\Engines\Xbase','Deleted',Regulong!,1) Registryset(ls_key+'\Engines\Xbase','ImplicitCommitSync','Yes') Registryset(ls_key+'\Engines\Xbase','PageTimeout',ReguLong!,600) Registryset(ls_key+'\Engines\Xbase','Statistics',Regulong!,0) Registryset(ls_key+'\Engines\Xbase','Threads',Regulong!,3) Registryset(ls_key+'\Engines\Xbase','UserCommitSync','Yes') Registryset(ls_key1,s_dbfname,&Microsoft FoxPro Driver (*.dbf)&) end if ... 二、在建立联接前先创建该 ODBC 的相关信息,如 ... string ls_dbfname=&c:\Foxprow\Database& gf_create_odbc('TestDBF','FOXPRO',ls_dbfname) SQLCA.DBMS = &ODBC& SQLCA.AutoCommit = False SQLCA.Database = 'TestDBF' SQLCA.dbparm = &ConnectString='DSN=TestDBF'& if sqlca.sqlcode && 1 then messagebox('错误','无法连接到制定的数据库文件!('+ls_dbfname+')',stopsign!) end if ... 三、删除该 ODBC 设置; 创建公用函数 gf_erase_odbc(string as_odbc_name) ... 通过以上步骤,就不需要通过控制面板中的 ODBC 工具来设置了。 您可以考虑以下改进: 1、增加 ODBC 创建函数的参数设置; 2、自己做一个 ODBC 的设置工具,可以在系统内运行; 3、ODBC 驱动程序可以指定到特定的目录或文件。12.这样一个功能怎么建呢? 首先优两个 dropdownlistbox, 当选择其中一个中的 item 后, 另外一个 dropdownlistbox 显示相应与第一个选 择项的内容。 例如,一个显示各个中心的名称,当选择其中一个中心名称时,另一个则显示相应中心的所有部门的名称。 (1)用代参数的 dropdownDW 更好 (2) 我刚实现的。表可以这样建: 手机品牌表: CREATE TABLE [dbo].[MOBILE] ( [ID] [numeric](5, 0) NOT NULL , [NAME] [varchar] (20) NOT NULL , [MAKER] [char] (10) NULL , [MAKE_DATE] [datetime] NULL ) GO 手机型号表 CREATE TABLE [dbo].[MOBILEMODEL] ( [ID] [numeric](5, 0) NOT NULL , [MOB_ID] [numeric](5, 0) NOT NULL , [MODEL] [varchar] (20) NOT NULL , [MAKER] [char] (10) NULL , [MAKE_DATE] [datetime] NULL )在 dw 的 itemfocuschanged 写如下代码: Long ll_model ll_model=dw_edit.getitemnumber(dw_edit.getrow(),'mob_id') if dwo.name='model_id' and not isnull(ll_model) then datawindowchild idwc_model dw_edit.GetChild ( &model_id&, idwc_model ) idwc_model.SetTransObject ( SQLCA ) idwc_model.Retrieve() // idwc_model.Setfilter(&model_id=&+string(ll_model)) idwc_model.Setfilter(&mob_id=&+string(ll_model)) idwc_model.filter() end if13、在 grid 的窗口当中,某列不允许编辑,某列允许编辑有了以下的方法,不就可以很方便了,各取所需吧 方法一: 在 DataWindow 中,列与列之间用 Tab 键进行移动时,是依据 DataWindow 为每一列设置的 Tb 值来进行移动 的。当某列的 Tab 值为 0 时,此列不可编辑,使用户无法对其进行增、删、改等操作。故可将某列的 Tab 值 置为 0,即可让此列设为不可编辑。 方法如下(设 columnname 为 DataWindow 中要置成的不可编辑的列名): dw_1.setorder(&columnname&,0) 或者在数据窗口的 script 中用以下语句进行修改: dw_1.modify(:columnname.tabsequence=0&) 或 dw_1.modify(&#&+string(number)+&.tabsequence=0&) 该方法的优点是易于实现,缺点是不允许列进行移动。即在 Grid 风格的 DataWindow 中,必须不选中 column moving,否则按下 tab 键时会引起顺序混乱。 方法二: 可查看列属性中的 edit 属性,查看 style 风格。若要将某列置不可编辑,可在该列的 edi style=&edit&中 选中或者在窗口的 script 中用以下语句进行修改: dw+1.modify(&columnname.edit. displayonly=Yes) 或 dw_1.modify(&#&+string(number)+&.edit.displayonly=Yes&) 若将该列改回可编辑,可在该列的 edit style=&edit&中,不选中或者在窗口的 script 中用 以下语句进行修改: dw_1.modify(&columnname.edit.displayonly=No&) 该方法也很简单,但同样不允许列移动。 方法三: 用 DataWindow 的 clicked 事件中的方法也可以实现列的保护。若某列不可更改,则可置 r otect=0。即: dw_1.modify(&columnname.protect=0&) 或 dw_1.modify(&#&+string(number)+&.protect=0&) 若要将该列改为可更改,则置 protect=1,即: dw_1.modify(:columnname.protect=1&) 或 dw_1.modify(&#&+string(number)+&.protect=1&) 此方法不影响 Tab 键的移动,用户可以随意拉动列,还可在应用过程中自己决定哪一列可编辑,哪一列不可 编辑。 14.在数据窗中如何选中多行//int lastselectedrow //if row&1 then //long r //if not keydown(keyShift!) or lastSelectedRow =0 //if not keyDown(keyControl!) then //this.SelectRow(0,false); //this.selectRow(row,true); //lastSelectedRow = //else //if isSelected(row) then //this.selectrow(row,false); //lastSelectedRow = 0; //else //this.selectRow(row,true); //lastSelectedRow = //end if // //end if // //else //if lastSelectedRow&0 then //this.selectrow(0,false); //if row& lastSelectedRow then //for r=lastSelectedRow to row //this.selectrow(r,true); //next //elseif row& lastSelectedRow then //for r=row to lastSelectedRow //this.selectrow(r,true); //next //elseif row = lastselectedRow then //this.selectrow(0,false); //this.selectRow(row,true); //end if //end if //end if 在 rowfocuschanged 事件上写 this.selectrow(currentrow,true) 或者是在 clicked 事件上也可以 then return 15.一个使数据窗口居中的例子 ////////////////////////////////////////////////////////////////////////////// // //Function: of_Center // //Access: public // //Arguments: // //Returns: //-1 = error // //Description: //Centers the window relative to the dimensions of the //current display resolution. // ////////////////////////////////////////////////////////////////////////////// // //Revision History // //Version //5.0 // ////////////////////////////////////////////////////////////////////////////// // //Copyright ? Sybase, Inc. and its subsidiaries. All rights reserved. //Any distribution of the PowerBuilder Foundation Classes (PFC) //source code by other than Sybase, Inc. and its subsidiaries is prohibited. // ////////////////////////////////////////////////////////////////////////////// Integerli_screenheight Integerli_screenwidth Integerli_rc Integerli_x = 1 Integerli_y = 1 environmentlenv_obj //Check for a window association with this object If IsNull(iw_requestor) Or Not IsValid (iw_requestor) Then Return -1 End If Initial version integer // 1 = success none // Get environment If GetEnvironment (lenv_obj) = -1 Then Return -1 End If // Determine current screen resolution and validate li_screenheight = PixelsToUnits (lenv_obj.screenheight, YPixelsToUnits!) li_screenwidth = PixelsToUnits (lenv_obj.screenwidth, XPixelsToUnits!) If Not (li_screenheight & 0) or Not (li_screenwidth & 0) Then Return -1 End If // Get center points If li_screenwidth & iw_requestor.Width Then li_x = (li_screenwidth / 2) - (iw_requestor.Width / 2) End If If li_screenheight & iw_requestor.Height Then li_y = (li_screenheight / 2) - (iw_requestor.Height / 2) End If // Center window li_rc = iw_requestor.Move (li_x, li_y) If li_rc && 1 Then Return -1 End If Return 116 数据表 d_query 中有一数据列 id,设置为 DropDownDW 格式,并关联到另一数据表 d_info(id,name)。这样程序运行时显示的数据为 name 的值, 而 dw_1.getitemstring(1,'id') / dw_1.object.date(1,1)得到 的数据是 id 的值。 但现在我想得到 name 的值,有什么简单的方法? dw_object.Describe(&evaluate('LookUpDisplay(&列名&)',&+String(行号)+&)&) 你的就是: dw_1.Describe(&evaluate('LookUpDisplay(id)',1)&) 17.窗口为 w_gcde 内,放入一个 DW_1,如何得到 dw_1 内的 yuonghu_id 列的内容 long lng_column_count integer i string str_column[] string str_column_text[] //列名 //text 的名字 //得到数据窗口的总列数 lng_column_count = long(dw_1.Describe(&DataWindow.Column.Count&)) //循环依次读取 for i = 1 to lng_column_count str_column[i] = dw_1.Describe(&#&+string(i)+&.name&) str_column_text[i] = dw_1.Describe(str_column[i] + &_t.text&) next18.保存报表为 excel 表string fpath,fname int f_s boolean lb_exist f_s=GetFileSaveName(&请选择需保存的文件名&, fpath,fname,&txt&,&文本文件(*.txt),*.txt,Excel(*.xls),*.xls& ) lb_exist = FileExists(fpath) if f_s&&1 then return elseif lb_exist then choose case MessageBox(&Save&,&OK to over write file: & + fname,Question!, OKCancel!) case 1 dw_1.saveas(fname, text!, TRUE) messagebox(&成功覆盖&,&成功覆盖文件 &+fname) case else messagebox(&警告&,&文件未保存成功&) return end choose else dw_1.saveas(fname, text!, TRUE) end if 19.pbcalcol,pbcattbl,pbcatedt,pbcatfmt 四表的作用及分e的含x pbcalcol 表中有每列的名称,标题,标签及位置信息 PBCATEDIT 列的编辑风格及定义 PBCATFMT 列的显示风格及定义 PBCATVLD 列的有效性规则及定义 pbcattbl 偶不知道。。 。。哈哈 pbcattbl

我要回帖

更多关于 mysql中decimal表示 的文章

 

随机推荐