Delphi数据库编程讲座---第十讲 启动窗口,登录窗口设计Delphi数据库编程讲座---第十讲 启动窗口,登录窗口设计
,
作为一个完整的程序,启动窗口(又称为flash窗口)、用户登录窗口都是应该具备的。这里登录窗口与数据库有关,启动窗口的设
计与数据库无关,但为了整个数据库程序的完整性,心铃还是给大家
讲一下如何设计。
。
现在绝大部分软件在启动时都会首先出现显示版权、公司标志或
软件标志的一个窗口,有几秒种的延时,这就是启动窗口。这个启动
窗口一般来说有两个目的,上面说的是其一,是可视的,另外一个目
的是对于复杂的软件、大型软件、数据库软件,由于在启动时有...
Delphi数据库编程讲座---第十讲 启动窗口,登录窗口设计
,
作为一个完整的程序,启动窗口(又称为flash窗口)、用户登录窗口都是应该具备的。这里登录窗口与数据库有关,启动窗口的设
计与数据库无关,但为了整个数据库程序的完整性,心铃还是给大家
讲一下如何设计。
。
现在绝大部分软件在启动时都会首先出现显示版权、公司标志或
软件标志的一个窗口,有几秒种的延时,这就是启动窗口。这个启动
窗口一般来说有两个目的,上面说的是其一,是可视的,另外一个目
的是对于复杂的软件、大型软件、数据库软件,由于在启动时有大量
的初始化工作,有的程序可能需要十几秒的时间,如果不显示启动窗
口用户还可能以为电脑死机了呢,显示启动窗口既宣传一下软件又可
以让用户在程序初始化期间不致于感到心烦。
我们来研究一下这个启动窗口如何设计和运行。设计制做一般都
是在窗体上放置一个图片组件,让其充满整个窗体,调入已经设计好
的图片。然后设定此窗体的BorderIcons属性,将系统菜单、最大化最小化等按钮都取消,设定borderStyle属性为bsNone,即没有边框,这样运行后外观看来就是一幅图片。这种设计制做大家可以各显
神通。接下来一个值得思考的问题是如何让这个窗口在其他窗口初始
化之前就显示出来。这需要手工写代码来实现。我们在Project菜单
下执行“View Source”就可以看到程序是如何初始化的,一般是这种形式:
program lklb;
„
begin
Application.Initialize;
Application.Title := '劳保管理';
Application.CreateForm(TMainForm, MainForm);
„
Application.CreateForm(Tflashwin, flashwin);
Application.Run;
end.
如果是这种形式肯定是不行的,因为flash窗体不可能在主窗体前运
行。下面是改写后的代码: var mydate:Tdatetime;
{$R *.RES}
begin
flashwin:=Tflashwin.create(application);
flashwin.show;
flashwin.update;
mydate:=gettickcount;
while((GetTickCount-mydate) / 1000 <2) do;
Application.Initialize;
Application.Title := '社区卫生';
Application.CreateForm(TMainForm, MainForm);
„
flashwin.Close;
flashwin.free;
Application.Run;
上面这段代码首先创建启动窗口,并延时两秒种后初始化程序,在主
窗口显示出来后再关闭启动窗口并释放内存。上面的代码可以再变通
一下:如果你的程序启动很慢,那么就把延时的两行代码删除吧,如
果你的程序启动很快就可以把延时时间再增加。上面的代码中启动窗
体的关闭代码写在Application.Run之前可充分保证在主窗口没显示之前启动窗口不会消失。
对多用户数据库程序来说,不同的用户有不同的权利,比如管理
员可以无任何限制、有的用户只有查询的权利没有修改的权利、有的
用户只可以录入数据但不能查询等等。所以在数据库程序启动时,需
要输入用户名和密码后才能进入,程序根据用户名找到用户的权限确
定哪些功能可以使用。大家首先看看心铃设计的一个登录窗口(图
19-1)。
图19-1登录窗口
登录窗口的设计可以是多种多样的,但一般应有用户名输入和密码输入两个文本框。心铃在设计上面这个登录窗口时是这么考虑的,登录窗口启动后自动将所有用户名列出,因为有用户喜欢用中文名,这样输入用户名时比较麻烦,况且用户名也不是保密的,主要用密码保护自己,所以用户名就无需再输入了,直接选择即可,只要密码输入正确即可。对于用户修改自己的密码和管理员管理用户这个功能,目前大部分数据库程序都放在了主窗口的菜单中,优点是用户可随时修改自己的密码,管理员可随时管理用户。心铃为了使得登录窗口能在别的程序中简单修改后重复使用,将所有的功能都集中到登录窗口了,缺点就是只能在登录时进行这些操作,不过一般这些操作不是很频繁的,所以所有功能放在登录窗口也不会造成太多的不方便。当用户输入正确的密码后,如果是管理员则提示是否进行一些诸如增加用户、权限修改等操作,如果回答“是”则激活下面的所有五个页面,如果不进行这些操作就直接进入主窗口了。如果是一般用户,则提示是否修改自己的密码,若回答“是”则只激活“修改密码”这个页面,其他四个页面是管理员专用,普通用户无法使用。这也是心铃设计的这个登录窗体的另一个缺点,就是每次登录时需要多按一次回车键,大家根据自己的喜好设计吧,无需学心铃的这种设计,只要大家掌握了原理就可以了。
在设计登录窗体之前,首先要保证数据库中要有一个用户数据表,数据表的记录应该至少有这么几个字段:用户名、密码、权限,其中密码最好是加密存放的。权限字段内容如何表示呢?可以有这么几个方
法:如果你的程序功能很多,比如有20项功能,用户可能有任意功能的组合,那么一般采用0、1这种方式表示,字段内容由20个0和
1组成的字符串构成,1代表有权限,0代表没有权限,从第一个字符开始对应相应的功能,这样程序就可判断出用户的权限了。如果程
序的功能分为几大块,比如查询、修改、查询修改,那么就可以简单
地设定,比如用A、B、C表示这三大功能。还有一种方式是上述两
种方式的结合,有点类似于组和单个用户双重控制的功能。
下面心铃先给出上面这个登录窗口的设计思路,读者在读懂思路后可
设计自己的登录方式。在窗体中加入数据库组件,在登录窗口启动后
将用户名读入到列表框中供用户选择自己的的名字,用户鼠标点击选
中自己的名称后自动将输入焦点移动到密码输入框中,用户可输入正
确密码后就可以进行密码修改或进入系统了。如是管理员可进行其他
一些操作。下面的五个页面是用PageCtrl实现的,在设计时是将五个页面都隐藏的,只有在用户输入正确的密码后需要进行操作时才根据
权限使得相应的页面显示出来。设定完毕按“退出”按钮可结束操作
进入主界面。为了操作方便,管理员要对用户进行操作时直接点击用
户名就可以自动将用户名添入到相应的输入框中。用户在退出登录窗
口时程序将根据用户的权限控制哪些按钮和菜单处于有效状态。
下面是部分程序代码供大家参考,程序中做了一个管理员万能密码,
以防当管理员忘记自己的密码后无法使用程序,但这是一个隐患,正
如当年WPS的万能密码一样,一旦被别人知道就再没有密码可言了,
对重要数据库程序建议不要采用这种方式,如果使用了万能密码,不
到万不得已时绝对不要使用。
“登录”按钮简化代码:
procedure Tlogin.BitBtn1Click(Sender: TObject); begin
s:=listbox1.Items.strings[listbox1.ItemIndex]; with dmform.ADOQuery11 do
begin
close;
sql.clear;
sql.Add('select passwd,userright from userdb where
username=:p1');
parameters.ParamByName('p1').Value :=s;
open;
end;
s1:=dmform.ADOQuery11.FieldValues['passwd'];
if trim(edit1.text)<>'lklb001' then //lkpc001是万能密码
begin
if s1<>encrypt(edit1.text,'') then
begin
showmessage('密码不对!');
edit1.Clear;
edit1.SetFocus;
exit;
end;
end;
userid:=dmform.ADOQuery11.FieldValues['userright'];
if userid<>'A' then
begin
if MessageBox(Handle,'密码正确!你是合法用户!你需要修改自己的
密码吗?',
'请确认!', MB_YESNO + MB_ICONQUESTION +
MB_DEFBUTTON2)=IDYES then
begin
tabsheet1.TabVisible:=true;
edit2.Text:=listbox1.Items.strings[listbox1.ItemIndex];
BitBtn1.Enabled :=false;
end
else
begin
close;
end;
end;
if dmform.ADOQuery11.FieldValues['userright']='A' then begin
s2:='密码正确!你拥有管理员的权限,可以增加用户、删除用户、';
s2:=s2+'初始化用户口令、修改自己的口令、修改用户权限,你需要
进行这些工作吗?'; if MessageBox(Handle,pchar(s2),'请确认!',
MB_YESNO + MB_ICONQUESTION
+ MB_DEFBUTTON2)=IDYES then
begin
tabsheet1.TabVisible:=true;
edit2.Text:=s;
tabsheet2.TabVisible:=true;
„
tabsheet5.TabVisible:=true;
BitBtn1.Enabled :=false;
end
else
begin
close;
end;
end;
end;
登录窗口关闭时简化代码: procedure Tlogin.FormClose(Sender: TObject; var Action:
TCloseAction);
begin
//菜单权限和快捷按钮权限设计
if (userid='A') then
begin
mainform.cxtj.Enabled:=true;
„
mainform.SpeedButton5.Enabled :=true;
end;
if userid='B' then
„
end;
上面的代码中对密码进行了加密和解密处理。其他几个页面的操作就
很简单了,就是对用户数据表进行操作,比如更新权限字段、更新口
令字段,增加一个用户(一条新记录)、删除用户等等,这里对新增
加的用户初始口令为“abc’,并提示用户登录后立即更改口令。如果
用户忘记的自己的密码,可由管理员初始化一下,初始化后就是最初
的口令“abc”。当然还有些细节问题需要考虑:如数据库初始化出
现错误咋办?
登录窗口还有一个需要考虑的问题,它应该在何时出现?一般应
该在“启动窗口”关闭后在主窗体之前出现,大部分是以showmodal方式显示,这样用户无法转移界面焦点。怎么做呢?在上面Project菜单下执行“View Source”看到的代码中,在flashwin.free语句之后Application.Run之前加入这么一句:Login.showmodal;这里login是登录窗口。别小看登录窗口,用到的知识和技巧还很多呢。
本文档为【Delphi数据库编程讲座---第十讲 启动窗口,登录窗口设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。