PB技巧总结

//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_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中打开DataWindow;
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 -1900,12)+13)*2 -1,2)
//2.天干地支(年份参数:int ls_year 返回参数:string):
mid(fill('甲乙丙丁戊己庚辛壬癸',40),(mod(ls_year -1924,10)+11)*2 -1,2)+mid(fill('子丑寅卯辰巳午未申酉戌亥',48),(mod(ls_year -1924,12)+13)*2 -1,2)
//3.星座(日期参数:date ls_date 返回参数:string):
mid("摩羯水瓶双鱼白羊金牛双子巨蟹狮子处女天秤天蝎射手摩羯",(month(ls_date)+sign(sign(day(ls_date) -(19+integer(mid('102123444423',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(year(ls_date)),100))+sign(mod(abs(year(ls_date)),400)),2)) -1))+'3232332323',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(year(ls_date)),4))+sign(mod(abs(year(ls_date)),100))+sign(mod(abs(year(ls_date)),400)),2)) -1))+'3232332323',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('010203040506070809101112',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('010203040506070809101112',48),(mod(month(ls_date)+ls_add_month -1,12)+13)*2 -1,2)) -12)+1,mod(long(mid(fill('010203040506070809101112',48),(mod(month(ls_date)+ls_add_month -1,12)+13)*2 -1,2))+1,13)+abs(sign(mod(long(mid(fill('010203040506070809101112',48),(mod(month(ls_date)+ls_add_month -1,12)+13)*2 -1,2))+1,13)) -1),1),-1)) -day(ls_date),'00')+'00000',5),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('6012345',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('6012345',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('6012345',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('6012345',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 , 19990821
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[]={1601,1637,1833,2078,2274,2302,2433,2594,2787,3106,3212,3472,3635,3722,3730,3858,4027,4086,4390,4558,4684,4925,5249 }
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[PGKBZGY[YWJKGKLJYWKPJQHY[W[DZLSGMRYPYWWCCKZNKYYGTTNJJNYKKZYTCJNMCYLQLYPYQFQRPZSLWBTGKJFYXJWZLTBNCXJJJJTXDTTSQZYCDXXHGCK[PHFFSS[YBGXLPPBYLL[HLXS[ZM[JHSOJNGHDZQYKLGJHSGQZHXQGKEZZWYSCSCJXYEYXADZPMDSSMZJZQJYZC[J[WQJBYZPXGZNZCPWHKXHQKMWFBPBYDTJZZKQHYLYGXFPTYJYYZPSZLFCHMQSHGMXXSXJ[[DCSBBQBEFSJYHXWGZKPYLQBGLDLCCTNMAYDDKSSNGYCSGXLYZAYBNPTSDKDYLHGYMYLCXPY[JNDQJWXQXFYYFJLEJPZRXCCQWQQSBNKYMGPLBMJRQCFLNYMYQMSQYRBCJTHZTQFRXQHXMJJCJLXQGJMSHZKBSWYEMYLTXFSYDSWLYCJQXSJNQBSCTYHBFTDCYZDJWYGHQFRXWCKQKXEBPTLPXJZSRMEBWHJLBJSLYYSMDXLCLQKXLHXJRZJMFQHXHWYWSBHTRXXGLHQHFNM[YKLDYXZPYLGG[MTCFPAJJZYLJTYANJGBJPLQGDZYQYAXBKYSECJSZNSLYZHSXLZCGHPXZHZNYTDSBCJKDLZAYFMYDLEBBGQYZKXGLDNDNYSKJSHDLYXBCGHXYPKDJMMZNGMMCLGWZSZXZJFZNMLZZTHCSYDBDLLSCDDNLKJYKJSYCJLKWHQASDKNHCSGANHDAASHTCPLCPQYBSDMPJLPZJOQLCDHJJYSPRCHN[NNLHLYYQYHWZPTCZGWWMZFFJQQQQYXACLBHKDJXDGMMYDJXZLLSYGXGKJRYWZWYCLZMSSJZLDBYD[FCXYHLXCHYZJQ[[QAGMNYXPFRKSSBJLYXYSYGLNSCMHZWWMNZJJLXXHCHSY[[TTXRYCYXBYHCSMXJSZNPWGPXXTAYBGAJCXLY[DCCWZOCWKCCSBNHCPDYZNFCYYTYCKXKYBSQKKYTQQXFCWCHCYKELZQBSQYJQCCLMTHSYWHMKTLKJLYCXWHEQQHTQH[PQ[QSCFYMNDMGBWHWLGSLLYSDLMLXPTHMJHWLJZYHZJXHTXJLHXRSWLWZJCBXMHZQXSDZPMGFCSGLSXYMJSHXPJXWMYQKSMYPLRTHBXFTPMHYXLCHLHLZYLXGSSSSTCLSLDCLRPBHZHXYYFHB[GDMYCNQQWLQHJJ[YWJZYEJJDHPBLQXTQKWHLCHQXAGTLXLJXMSL[HTZKZJECXJCJNMFBY[SFYWYBJZGNYSDZSQYRSLJPCLPWXSDWEJBJCBCNAYTWGMPAPCLYQPCLZXSBNMSGGFNZJJBZSFZYNDXHPLQKZCZWALSBCCJX[YZGWKYPSGXFZFCDKHJGXDLQFSGDSLQWZKXTMHSBGZMJZRGLYJBPMLMSXLZJQQHZYJCZYDJWBMYKLDDPMJEGXYHYLXHLQYQHKYCWCJMYYXNATJHYCCXZPCQLBZWWYTWBQCMLPMYRJCCCXFPZNZZLJPLXXYZTZLGDLDCKLYRZZGQTGJHHGJLJAXFGFJZSLCFDQZLCLGJDJCSNZLLJPJQDCCLCJXMYZFTSXGCGSBRZXJQQCTZHGYQTJQQLZXJYLYLBCYAMCSTYLPDJBYREGKLZYZHLYSZQLZNWCZCLLWJQJJJKDGJZOLBBZPPGLGHTGZXYGHZMYCNQSYCYHBHGXKAMTXYXNBSKYZZGJZLQJDFCJXDYGJQJJPMGWGJJJPKQSBGBMMCJSSCLPQPDXCDYYKY[CJDDYYGYWRHJRTGZNYQLDKLJSZZGZQZJGDYKSHPZMTLCPWNJAFYZDJCNMWESCYGLBTZCGMSSLLYXQSXSBSJSBBSGGHFJLYPMZJNLYYWDQSHZXTYYWHMZYHYWDBXBTLMSYYYFSXJC[DXXLHJHF[SXZQHFZMZCZTQCXZXRTTDJHNNYZQQMNQDMMG[YDXMJGDHCDYZBFFALLZTDLTFXMXQZDNGWQDBDCZJDXBZGSQQDDJCMBKZFFXMKDMDSYYSZCMLJDSYNSBRSKMKMPCKLGDBQTFZSWTFGGLYPLLJZHGJ[GYPZLTCSMCNBTJBQFKTHBYZGKPBBYMTDSSXTBNPDKLEYCJNYDDYKZDDHQHSDZSCTARLLTKZLGECLLKJLQJAQNBDKKGHPJTZQKSECSHALQFMMGJNLYJBBTMLYZXDCJPLDLPCQDHZYCBZSCZBZMSLJFLKRZJSNFRGJHXPDHYJYBZGDLQCSEZGXLBLGYXTWMABCHECMWYJYZLLJJYHLG[DJLSLYGKDZPZXJYYZLWCXSZFGWYYDLYHCLJSCMBJHBLYZLYCBLYDPDQYSXQZBYTDKYXJY[CNRJMPDJGKLCLJBCTBJDDBBLBLCZQRPPXJCJLZCSHLTOLJNMDDDLNGKAQHQHJGYKHEZNMSHRP[QQJCHGMFPRXHJGDYCHGHLYRZQLCYQJNZSQTKQJYMSZSWLCFQQQXYFGGYPTQWLMCRNFKKFSYYLQBMQAMMMYXCTPSHCPTXXZZSMPHPSHMCLMLDQFYQXSZYYDYJZZHQPDSZGLSTJBCKBXYQZJSGPSXQZQZRQTBDKYXZKHHGFLBCSMDLDGDZDBLZYYCXNNCSYBZBFGLZZXSWMSCCMQNJQSBDQSJTXXMBLTXZCLZSHZCXRQJGJYLXZFJPHYMZQQYDFQJJLZZNZJCDGZYGCTXMZYSCTLKPHTXHTLBJXJLXSCDQXCBBTJFQZFSLTJBTKQBXXJJLJCHCZDBZJDCZJDCPRNPQCJPFCZLCLZXZDMXMPHJSGZGSZZQLYLWTJPFSYASMCJBTZKYCWMYTCSJJLJCQLWZMALBXYFBPNLSFHTGJWEJJXXGLLJSTGSHJQLZFKCGNNNSZFDEQFHBSAQTGYLBXMMYGSZLDYDQMJJRGBJTKGDHGKBLQKBDMBYLXWCXYTTYBKMRTJZXQJBHLMHMJJZMQASLDCYXYQDLQCAFYWYXQHZ "
//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 Internal table overflow; 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

PB中使用WINSOCK.OCX做双向通信的简单例子----PowerBuilder 一、在窗口中添加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.state0 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.state0 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 //将数据字符串显示在文本框中   以上程序实际上体现了聊天器的底层工作原理,稍加修改扩充就可以做成
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值