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_userid
String ls_password
integer li_count

ls_userid = sle_userid.Text
ls_password = sle_password.Text

select 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_temp

Open(w_login)//打开登录窗口
ls_temp = Message.StringParm//接受登录窗口的返回信息。

if ls_temp <> 'ok' then//如果没有登录成功。
halt close;//关闭系统
else//登录成功,根据用户权限初始化用户界面。语句省略
end if

你可能感兴趣的:(登录)