密码错三次 软件关闭
数字职场
我现在是一名软件开发人员了,记得我还是学生的时候,参加过很多次招聘会,印象最深的一次是招聘单位现场考我们软件编程思维。记得题目是给某私立医院建立一套电子处方系统,分配给我们的任务是如果医生登录系统时连续三次密码输入错误,登录不成功软件自动关闭,医生必须重新运行软件才能登录。
粗看考题非常难,但仔细想想我们仅需要设计一个模块就可以了,而设计这个模块用到的就是条件判断,满足条件就计数1次,不满足条件就不计数。知识点非常简单,但应用的场合却非常广,例如考题中的登录判断、加油站计费系统等。
设计思路
登录系统三次不成功软件就退出的方法有很多种,我的方法是使用数据库。软件启动时先判断数据库data.mdb是否存在,如果不存在则动态创建data.mdb,并建表doctor_user(两个字段name、pwd),用于存储用户名和密码,然后在软件中读取用户名相同的数据库记录,判断输入的密码是否和记录中的密码字段的值一致,如果一致则进入主画面,如果不一致再使用一个全局变量LoginCount来控制“登录”按钮的点击次数,点击一次就加1,如果次数为3就关闭软件。
数据库把守登录关
启动Delphi,新建一个工程,Form1窗体作为Login窗体,Form2窗体为电子处方系统的主窗体,在Form1窗体中添加ADOQuery1(用于动态创建表)、ADOConnection1、ADODataSet1(这两个控件用于读取数据库),然后添加一个ComboBox1(用于显示这家医院所有医生的姓名)、一个Edit(用于医生输入密码)、两个BitBtn(登录和退出按钮)。
在Login窗体的代码编辑器中添加uses main,这样登录成功后就能进入到主窗体。建立一个全局变量:LoginCount:integer,在窗体的FormCreate事件中把变量LoginCount的值写为0。
然后在程序启动时使用函数FileExists判断数据库文件data.mdb是否存在。在登录按钮中把查询结果记录中的pwd字段的值取出来和Edit输入框的值进行比对。其核心代码如下(完整代码下载地址:http://www.shudoo.com/bzsoft):
if FileExists('d:\data.mdb')=false then//数据库不存在 ,则创建数据库
begin
CreateAccess:=CreateOleObject('ADOX.Catalog');
CreateAccess.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\data.mdb;Jet OLEDB:Database Password=123');//在D盘下创建数据库,并设置数据库密码
with Query1 do //创建表
begin
close;
sql.clear;
sql.add('CREATE TABLE doctor_user (name string,pwd string)');
execsql;
end;
with Query1 do //创建表后增加一条记录,默认登录用户名为曾俊杰,密码为123456
begin
Close;
SQL.Clear;
sql.add('select * from doctor_user');
LoginCount:=LoginCount+1;
case LoginCount of
1:begin
MessageDlg('登录密码输入错误,请检查用户名,您还有2次登录机会', mtError,[mbOk], 0);
end;
2:begin
MessageDlg('登录密码输入错误,请检查用户名,您还有1次登录机会', mtError,[mbOk], 0);
end;
3:begin
MessageDlg('登录密码输入错误,系统即将退出,请重启软件后再次登录', mtError,[mbOk], 0);
除了用数据库,使用ini方法也能达到目的。方法是:程序启动时先判断data.ini文件是否存在,如果不存在则动态创建data.ini文件,写入用户名和密码。之后在软件中读取用户名,查找ini文件中是否存在这个用户名。
如果用户名存在则取出对应的密码和输入框中的密码进行比对,比对结果一致则进入主画面,如果不一致,再使用一个全局变量LoginCount来控制“登录”按钮的点击次数,点击一次就加1,如果次数为3就关闭软件。
