原创实用代码(一)
来源:互联网 发布:网络交换机怎么安装 编辑:程序博客网 时间:2024/06/16 03:43
一、PB数据窗口中多行选中程序
首先定义窗口实例变量:
long il_LastSelectedRow = 1
然后开始编写多行选中程序。程序算法描述如下:
1、如果按下了Control键
如果是在选中行上,取消该行
否则,选中该行
记录当前到窗口实例变量中
2、如果按下了Shift键
取消所有选中行
选中上次点击行和当前行之间的所有数据行
记录当前到窗口实例变量中
3、如果没有按键
如果点击行为选中行,不执行任何操作
否则,取消所有选中行,选中当前行
记录当前到窗口实例变量中
比如,我们在窗口dw_1的Clicked事件中编写该脚本,程序如下:
//在窗口的实例变量定义:long il_LastSelectedRow = 1long ll_Startlong ll_Endlong ll_indexif Row < 1 then returnif KeyDown(KeyControl!) then if This.IsSelected(Row) then This.SelectRow(Row,False) else This.SelectRow(Row,True) end ifelseif KeyDown(KeyShift!) then if Row < il_LastSelectedRow then ll_Start = Row ll_End = il_LastSelectedRow else ll_Start = il_LastSelectedRow ll_End = Row end if This.SelectRow(0,False) For ll_index = ll_Start to ll_End This.SelectRow(ll_index,True) nextelse if Not This.IsSelected(Row) then This.SelectRow(0,False) This.SelectRow(Row,True) end ifend ifil_LastSelectedRow = Row
二、PB树型结构遍历
树型结构的遍历通常使用递归程序来实现,所以本节给出一个按照内容查找,对树型结构进行遍历,如果和要查找的内容相等,则返回该节点的Handle。函数如下:
//*-----------------------------------------------------------------------------//* 函数名称:long wf_reader(long al_handle,string as_target)//* 函数作用:遍历树型结构,找到指定内容的节点。//* 返 回 值:节点的Handle。//* 算法描述:遍历树型结构,使用递归完成。//*----------------------------------------------------------------------------*/long ll_handlelong ll_handleOldTreeViewItem ltvi_ItemString ls_labelString ls_dataif tv_1.Getitem(al_handle,ltvi_Item)= -1 then return -1ls_label=Trim(String(ltvi_Item.label))ls_data=Trim(String(ltvi_Item.data))if ls_label = as_target then return al_handleelse ll_handle = tv_1.FindItem(ChildTreeItem!,al_handle)end ifif ll_handle > 0 then if tv_1.Getitem(ll_handle,ltvi_Item)= -1 then return 0 ls_label=Trim(String(ltvi_Item.label)) ls_data=Trim(String(ltvi_Item.data)) if ls_label = as_target then return ll_handle//找到了要添加的节点 else return wf_reader(ll_handle,as_target) end ifelse ll_handleOld = al_handle ll_handle = tv_1.FindItem(NextTreeItem!,ll_handleOld) do while ll_handle < 0 ll_handle = tv_1.FindItem(ParentTreeItem!,ll_handleOld) if ll_handle > 0 then ll_handleOld = ll_handle ll_handle = tv_1.FindItem(NextTreeItem!,ll_handleOld) else ll_handle = tv_1.FindItem(NextTreeItem!,ll_handle) if ll_handle < 0 then return -1 end if end if loop if tv_1.Getitem(ll_handle,ltvi_Item)= -1 then return -1 ls_label=String(ltvi_Item.label) ls_data=String(ltvi_Item.data) if ls_label = as_target then return ll_handle//找到了要添加的节点 else return wf_reader(ll_handle,as_target) end ifend if
三、PB编写登录程序
我们的要求是,首先打开主窗口,然后显示登录界面,用户最多可以尝试登录3次,如果登录成功,则根据用户权限初始化主窗口界面,否则关闭整个应用。
登录程序看似简单,实际上涉及到的知识不少。知识点有:SQL语句的使用、窗口类型的理解、SingleLineEdit控件、CommandButton的属性的应用、自定义用户事件、如何触发自定义用户事件、使用窗口实例变量、不同窗口之间如何传递信息等。下面我们开始实现该程序。
设计登录窗口w_login,放置两个SingleEdit、两个CommandButton,分别命名为sle_userid、sle_password、cb_cancel、cb_ok;选中sle_password的password属性。为了计算用户尝试登录的次数,首先定义一个窗口实例变量:
integer ii_count = 3
用户在sle_userid中输入用户登录标志,回车时应该自动切换到sle_password中。所以,在sle_userid的Modified事件中编写如下脚本:
sle_password.SetFocus()
同样,用户在sle_password中输入完口令,然后回车,这时应该对用户输入的登录信息进行校验,所以需要触发cb_ok按钮的Clicked事件。所以,在sle_password的Modified事件中编写如下脚本:
cb_ok.Default = True
上面为什么不能使用cb_ok.TriggerEvent(Clicked!)呢?细心的读者请先自己琢磨。接下来是我们的主要编程了,在cb_ok命令按钮的Clicked事件上编写如下脚本:
String ls_useridString ls_passwordinteger li_countls_userid = sle_userid.Textls_password = sle_password.Textselect count(*) into :li_count from users where userid = :ls_userid and password = :ls_password;if li_count > 0 then gs_userid = ls_userid select username into :gs_username from users where userid = :ls_userid; CloseWithReturn(parent,'ok')else ii_count -- if ii_count = 0 then halt close; sle_userid.text = '' sle_password.text = '' this.Default = False sle_userid.SetFocus()end if
在cb_cancel命令按钮的Clicked事件中编写如下脚本:
CloseWithReturn(parent,'cancel')
在窗口的Open事件中编写如下脚本:
sle_userid.SetFocus()
然后将窗口的类型设置为response类型。至此,用户登录窗口全部完成。接下来我们在主窗口调用它了。比如,我们程序的主窗口名称是w_main,在Application对象的Open事件打开该窗口。接下来,我们需要在w_main中调用w_login。
通过上面的程序我们可以看出,用户登录是否成功是通过w_login的返回信息来确定的。用户登录成功,则w_main继续进行界面初始化,否则关闭整个应用。因为w_login是response类型的,所以w_main在打开w_login之后就一直处于等待状态,知道w_login关闭返回信息w_main才继续执行。为了保证w_main首先显示出来,然后再显示w_login,我们需要为w_main定义自定义事件,比如我们定义ue_open事件。在w_main的Open事件中编写如下程序:
this.PostEvent('ue_open')
然后,在ue_open事件中编写如下程序:
String ls_tempOpen(w_login)//打开登录窗口ls_temp = Message.StringParm//接受登录窗口的返回信息。if ls_temp <> 'ok' then//如果没有登录成功。 halt close;//关闭系统else//登录成功,根据用户权限初始化用户界面。语句省略end if
四、PB获取服务器时间
//*-----------------------------------------------------------------------//* 函数名称:datetime gf_getsysdate(string as_dbms)//* 功能描述:取得服务器的的日期时间(DateTime) //* 参数含义:as_dbms 所使用的数据库DBMS //* 返 回 值:datetime类型,系统日期//* 调用举例:ldt_today = gf_getsysdate(sqlca.dbms)//*-----------------------------------------------------------------------*/datetime ldt_datestring ls_sqlchoose case lower(as_dbms) case "oracle" //oracle ls_sql = "select sysdate from sys.dual" case "sqlserver" //ms sql server ls_sql = "select now() " case "sybase" //sybase ls_sql = "select getdate()" case else ls_sql = "select now() "end chooseDeclare l_cursor dynamic cursor for Sqlsa;Prepare Sqlsa from :ls_sql;Open dynamic l_cursor;if Sqlca.SQLCode = 0 then Fetch l_cursor into :ldt_date;end ifif sqlca.SQLCode <> 0 then messagebox("出错信息","在函数gf_get_sysdate()运行时数据库出现错误!") ldt_date = Datetime(Today(), Now())end ifClose l_cursor;return ldt_date
五、查找某字符串在另外一个字符串中最后出现的位置
//*---------------------------------------------------------------------------------//* 调用方式: gf_GetLastPosition(String as_string,string as_SubString)//* 函数作用: 查找字符串as_string中另一个子串as_SubString所出现的最后位置.//* 返 回 值: integer类型的,最后出现的位置.//* 变量使用: 没有用到全局变量.//*----------------------------------------------------------------------------------*/integer li_Pos,li_NextPos//用来保存当前位置和最后下一个位置if as_String = "" or as_SubString = "" then return 0 //如果传递过来的是两各空字符串.li_pos = Pos(as_String,as_SubString)//变量初始化.if li_Pos = 0 then//没有找到 return 0else li_NextPos = Pos(as_String,as_SubString,li_Pos + 1)//第二个出现位置end ifdo while li_NextPos<>0 li_Pos = li_NextPos li_NextPos = Pos(as_String,as_SubString,li_Pos + 1)loopreturn li_Pos
- 原创实用代码(一)
- 原创实用代码(二)
- 实用代码片段(一)
- Android 实用代码片段(一)
- Android实用代码片段(一)
- Android实用代码七段(一)
- Android实用代码七段(一)
- Android实用代码七段(一)
- Android实用代码七段(一)
- Android实用代码七段(一)
- Android开发实用代码片段(一)
- Android实用代码七段(一)
- 实用代码(一)
- 实用代码段( 一 )
- android实用代码片段(一)
- [原创]绝对实用:jQuery实现可控方向的图片滚动详解(一)
- 实用且不花哨的js代码大全(一)
- 分享10段实用的HTML5代码(一)
- NSTimer产生的问题及解决方案
- 线程Thread的生命周期以及状态
- 测试
- 手把手教你如何去除土豆,优酷..等等播放前的广告!
- 欢迎使用CSDN-markdown编辑器
- 原创实用代码(一)
- 猜数
- Qsort
- [USACO Jan07]考试Schul解题报告
- 查找二叉树最远两个节点的距离
- 滑动到点击位置的ListView
- JAVA数字大写金额转换
- XML编程经验――LIBXML2库使用指南
- 简易Java Bean转JSON