《数据库应用技术——Delphi应用系统开发》-第十章.ppt
第第10章章 SLMIS集成与运行集成与运行n n本章学习要点本章学习要点l学习SLMIS系统的总体设计l掌握数据模块的创建与使用l掌握界面设计方法与技巧l掌握视图在查询中的应用l掌握存储过程的创建与使用Microsoftn nSLMISSLMIS售售售售楼楼楼楼管管管管理理理理系系系系统统统统是是是是一一一一个个个个典典典典型型型型的的的的客客客客户户户户/服服服服务务务务器器器器(C/SC/S)体体体体系结构的数据库应用系统。系结构的数据库应用系统。系结构的数据库应用系统。系结构的数据库应用系统。n nC/SC/S模模模模式式式式的的的的基基基基本本本本工工工工作作作作原原原原理理理理是是是是:客客客客户户户户程程程程序序序序向向向向数数数数据据据据服服服服务务务务器器器器发发发发送送送送SQLSQL请请请请求求求求,服服服服务务务务器器器器返返返返回回回回数数数数据据据据和和和和结结结结果果果果。客客客客户户户户端端端端负负负负责责责责实实实实现现现现用用用用户户户户接接接接口口口口功功功功能能能能,同同同同时时时时封封封封装装装装部部部部分分分分或或或或全全全全部部部部的的的的应应应应用用用用逻逻逻逻辑辑辑辑。服服服服务务务务器器器器端端端端的的的的数数数数据据据据库库库库服服服服务务务务器器器器主主主主要要要要提提提提供供供供数数数数据据据据存存存存储储储储功功功功能能能能,也也也也可可可可通通通通过过过过触触触触发发发发器器器器和和和和存存存存储储储储过过过过程程程程提提提提供供供供部部部部分分分分应应应应用用用用逻逻逻逻辑辑辑辑,并并并并且且且且通通通通常常常常把把把把那那那那些些些些不不不不同同同同的的的的(不不不不管管管管是是是是已已已已知知知知的的的的还还还还是是是是未未未未知知知知的的的的)前前前前台台台台应应应应用用用用所所所所不不不不能能能能违违违违反反反反的的的的规规规规则则则则在在在在服服服服务务务务器器器器程程程程序序序序中中中中集集集集中中中中实实实实现现现现,例例例例如如如如访访访访问问问问者者者者的的的的权权权权限限限限、编编编编号号号号不不不不准准准准重重重重复复复复等等等等规规规规则则则则。所所所所有有有有这这这这些些些些,对对对对于于于于运运运运行行行行客客客客户户户户应应应应用用用用程程程程序序序序的的的的最最最最终终终终用用用用户户户户,是是是是“透透透透明明明明”的的的的,最最最最终终终终用用用用户户户户无无无无须须须须过过过过问问问问(通通通通常常常常也也也也无无无无法法法法干干干干涉涉涉涉)这这这这背背背背后后后后的的的的过过过过程程程程,就就就就可可可可以以以以完完完完成成成成自自自自己己己己的的的的一一一一切切切切工工工工作作作作。在在在在客客客客户户户户服服服服务务务务器器器器架架架架构构构构的的的的应应应应用用用用中中中中,数数数数据据据据库库库库真真真真正正正正变变变变成成成成了了了了公公公公共共共共、专专专专业业业业化化化化的的的的仓仓仓仓库库库库,受到独立的专门管理。受到独立的专门管理。受到独立的专门管理。受到独立的专门管理。n n本本本本章章章章将将将将介介介介绍绍绍绍SLMISSLMIS数数数数据据据据库库库库系系系系统统统统集集集集成成成成以以以以及及及及系系系系统统统统运运运运行行行行调调调调试试试试方方方方法法法法,最终完成这个传统最终完成这个传统最终完成这个传统最终完成这个传统C/SC/S结构管理信息系统的全面设计。结构管理信息系统的全面设计。结构管理信息系统的全面设计。结构管理信息系统的全面设计。Microsoft10.1 工程总体设计工程总体设计 房房屋屋售售楼楼管管理理系系统统是是一一个个商商品品房房从从录录入入、销销售售、合合同同制制作作到到结结算算的的管管理理信信息息系系统统。系系统统总总体体设设计计和和数数据据库库设设计计已已在在第第1章章中中详详细介绍,下面重点讲解工程总体设计。细介绍,下面重点讲解工程总体设计。10.1.1 工程窗体结构设计工程窗体结构设计Delphi中,应用程序通过一个工程Project来实现,而工程通过多个窗体Form来实现应用程序所具有的功能。与售楼管理系统的系统功能模块相对应,工程中窗体的结构如图10-1所示。MicrosoftMicrosoft 运运行行Delphi将将新新建建一一个个工工程程,其其包包含含一一个个空空白白窗窗体体。在在此此工工程程中中在在新新建建14个个空空白白窗窗体体Form(在在这这里里不不包包括括策策划划管管理理和和销销售售前前台台主主界界面面窗窗体体),将将工工程程中中的的14个个空空白白窗窗体体分分别别按按表表进进行行设设置置,其其中中原原组组件件对对象象名名(即即Name属属性性)是是空空白白窗窗体体的的默默认认名名字字,由由系系统统自自动动编编号号给给出出,即即Form1、Form2、Form3等等等等,将将其其改改为为新新组组件件对对象象名名(Name属属性性)并并对对其其Caption属属性性的的值值按按照表照表10-1的内容进行设置。的内容进行设置。Microsoft 表表10-1 所有窗体主要属性的设置所有窗体主要属性的设置新组件对象名Caption属性值说明Frm_Register注册数据库连接窗体,将它的单元文件保存为Ufrmregister.pasFrm_Login系统登录用户登录窗体,将它的单元文件保存为U_Login.pasFrm_Slismain武汉市新世界房屋销售管理系统主窗体,将它的单元文件保存为Primary.pasDfmbasehouse房屋基本信息录入房 屋 基 本 信 息 录 入 窗 体,将 它 的 单 元 文 件 保 存 为Basehousenw1.pasDfmpublicxx房屋公用信息录入房屋公用信息录入窗体,将它的单元文件保存为Publicxx.pasDfmdaimoney代收代付录入代收代付录入窗体,将它的单元文件保存为Daimoney.pasDfmchsaleyes销售许可信息录入销 售 许 可 信 息 录 入 窗 体,将 它 的 单 元 文 件 保 存 为Chsaleyes.pasDfmshoujiabiao房屋售价表房屋售价表窗体,将它的单元文件保存为Shoujiabiao.pasMicrosoftDfmmianjibiao房屋面积表房屋面积表窗体,将它的单元文件保存为Mianjibiao.pasFrm_relationdanmade联系单制作联 系 单 制 作 窗 体,将 它 的 单 元 文 件 保 存 为Relationdanmade.pasDfmjinlichaxunmain经理查询经理查询窗体,将它的单元文件保存为Jinlichaxun.pasFrm_jiesuan房屋结算管理房屋结算管理窗体,将它的单元文件保存为Jiesuan.pasFrm_backup数据库备份数据库备份窗体,将它的单元文件保存为Backup.pasFrm_restore数据库恢复数据库恢复体,将它的单元文件保存为Restore.pasFrm_quanxian角色权限管理系 统 角 色 权 限 管 理 窗 体,将 它 的 单 元 文 件 保 存 为Quanxian.pasMicrosoft按表的说明项中的单元文件名将各个窗体保存在系统路径下“E:售楼管理系统”下,工程保存为prjnw.dpr。主窗体是系统的主界面,程序运行时首先显示的是登录窗体,只有用户输入正确的用户名和密码后,才能进入主界面,如果用户是第一次运行该程序,则需要进行注册即数据库连接。本售楼管理系统访问数据库采用的是ADO接口,工程中使用数据模块窗体对数据进行统一管理,数据模块窗体 名 为“DataModule1”,窗 体 中 放 置 一 个ADOConnection1组件,建立与数据库newworldhouse的连接,保存的文件名为“data.pas”。Microsoft在系统所有的窗体中都将通过数据模块窗体来引用其中的数据组件ADOConnection1,只需要在相应单元文件中实现部分implementation语句下面加入“usesdata;”代码即可。登录和注册窗体都需要使用数据模块窗体中的数据组件ADOConnection1,因此数据模块窗体放在最前面,这需要在工程中设置。在Delphi的Project菜单下单击Options子菜单项,按图10-2的形式将Frm_Login设置为工程的主窗体,图中“Auto-createforms”下的列表框显示的是运行时在内存中自动创建的静态窗体,由于登录窗体Frm_Login中也要使用数据模块窗体DataModule1中的数据组件ADOConnection1,因此DataModule1窗体放在“Auto-createforms”列表框的最上面;“AvailableForms”下的列表框显示的是运行时临时创建的动态窗体,使用动态窗体可以节约系统资源。MicrosoftMicrosoft10.1.2 10.1.2 创建公共使用单元创建公共使用单元创建公共使用单元创建公共使用单元 n n在在在在售售售售楼楼楼楼管管管管理理理理系系系系统统统统中中中中,将将将将系系系系统统统统要要要要访访访访问问问问的的的的全全全全局局局局变变变变量量量量放放放放在在在在同同同同一一一一个个个个单单单单元元元元文文文文件件件件publicvarpublicvar.pas.pas中中中中,将将将将系系系系统统统统多多多多个个个个模模模模块块块块要要要要调调调调用用用用的的的的公公公公共共共共过过过过程程程程和和和和函函函函数数数数放放放放在在在在同同同同一一一一个个个个单单单单元元元元文文文文件件件件upublicfunc1.pasupublicfunc1.pas中中中中。这这这这样样样样在在在在要要要要使使使使用用用用这这这这些些些些变变变变量量量量、过过过过程程程程或或或或函函函函数数数数的的的的单单单单元元元元中中中中,在在在在其其其其usesuses子子子子句句句句中中中中包包包包含含含含publicvarpublicvar和和和和upublicfunc1upublicfunc1单单单单元元元元即即即即可可可可访访访访问问问问这些变量或者调用这些函数。这些变量或者调用这些函数。这些变量或者调用这些函数。这些变量或者调用这些函数。n n在在在在DelphiDelphi的的的的FileFile菜菜菜菜单单单单下下下下单单单单击击击击【NewNew】|【unitunit】子子子子菜菜菜菜单单单单项项项项,系系系系统统统统将将将将自自自自动动动动产产产产生生生生一一一一个个个个空空空空框框框框架架架架的的的的单单单单元元元元文文文文件件件件,将将将将该该该该文文文文件件件件保保保保存存存存为为为为publicvarpublicvar.pas.pas。Microsoft在公共单元文件publicvar中,设计如下的全局变量:username:string;/当前用户姓名userrole:string;/当前用户角色userright:string;/当前用户权限registed:boolean;/数据库是否已经成功注册ConstructCode:string;/合同号ConstructKey:integer;/合同IDOperationType:integer;/操作类型在Delphi的File菜单下单击【New】|【form】子菜单项,系统将自动产生一个新 的 窗 体,窗 体 中 添 加 一 个 ADOQuery1组 件,保 存 单 元 文 件 为upublicfunc1.pas,接着在单元文件的实现部分implementation语句下面加入“usesdata,publicvar;”代码,则该单元文件对应的窗体中ADOQuery1组件可以设置Connection的属性为DataModule1.ADOConnection1,即使用数据模块窗体所建立的数据库连接,同时单元文件upublicfunc1也可以使用publicvar单元文件中所定义的全局变量。Microsoft在公共单元文件upublicfunc1中,设计如下的全局函数:functionWriteLogin():integer;/填写登陆信息functionWriteLogout():integer;/填写登陆离开信息functiongethousedanyuan(consts:string):string;/返回房屋座落的单元号在单元的implementation部分,WriteLogin填写登陆信息函数的实现代码如下:functionWriteLogin():integer;varnowtime:double;beginnowtime:=now();/填写登陆信息withPublicFunc1dobeginwithADOQuery1dobeginifActivethenClose;/写入登陆信息MicrosoftSQL.Clear;SQL.Add(insertintosys_login(c_name,d_login)values(:names,:timenow);Parameters.parambyname(names).datatype:=ftstring;Parameters.ParamByName(names).Value:=username;Parameters.parambyname(timenow).datatype:=ftdatetime;Parameters.ParamByName(timenow).Value:=nowtime;tryExecSQL;exceptApplication.MessageBox(错误号200167!,错误,MB_OK);result:=0;end;ifActivethenClose;/返回日志IDMicrosoftSQL.Clear;SQL.Add(selectI_KEYfromsys_loginwhere(c_name=:names)and(d_login=:timenow);Parameters.parambyname(names).datatype:=ftstring;Parameters.ParamByName(names).Value:=username;Parameters.parambyname(timenow).datatype:=ftdatetime;Parameters.ParamByName(timenow).Value:=nowtime;tryopen;result:=FieldValuesI_KEY;exceptApplication.MessageBox(错误号200182!,错误,MB_OK);result:=0;end;end;end;end;Microsoft在单元的implementation部分,WriteLogout填写登陆离开信息函数的实现代码如下:functionWriteLogout():integer;beginwithPublicFunc1do/填写登陆离开信息beginwithADOQuery1dobeginifActivethenClose;/写入登陆信息SQL.Clear;SQL.Add(updatesys_loginsetd_logout=:timenowwhereI_KEY=:sysid);Parameters.parambyname(sysid).datatype:=ftinteger;Parameters.ParamByName(sysid).Value:=systemflagid;Parameters.parambyname(timenow).datatype:=ftdatetime;Parameters.ParamByName(timenow).Value:=now();tryExecSQL;exceptApplication.MessageBox(错误号200206!,错误,MB_OK);result:=0;end;end;end;result:=0;end;Microsoft10.1.3 10.1.3 创建数据模块创建数据模块创建数据模块创建数据模块n n在在在在DelphiDelphi的的的的主主主主菜菜菜菜单单单单上上上上选选选选中中中中【FileFile】|【NewNew】|【Data Data ModuleModule】来来来来创创创创建建建建一一一一个个个个数数数数据据据据模模模模块块块块,将将将将其其其其NameName属属属属性性性性设设设设置置置置为为为为DataModule1DataModule1。使使使使用用用用了了了了数数数数据据据据模块后访问位于其上的组件的方法是:数据模块名模块后访问位于其上的组件的方法是:数据模块名模块后访问位于其上的组件的方法是:数据模块名模块后访问位于其上的组件的方法是:数据模块名.组件对象名。组件对象名。组件对象名。组件对象名。n n在在在在数数数数据据据据模模模模块块块块中中中中,首首首首先先先先要要要要放放放放入入入入一一一一个个个个ADOConnection1ADOConnection1组组组组件件件件,其其其其主主主主要要要要属属属属性见表性见表性见表性见表10-210-2。表表10-2 ADOConnection1组件主要属性设置组件主要属性设置属性设置值NameDataModule1ProviderSQLOLEDB.1ConnectionString空LoginPromptFalseMicrosoft在C/S体系结构中,ADOConnection1组件用于客户端和服务器端建立连接,并对连接进行管理。从表10-2中可看出ADOConnection1组件的ConnectionString属性设置为空值,实际上该值是在程序中动态的设置的。当客户端是第一次使用该售楼管理系统时,需要进行注册即SQLServer数据库连接初始化,初始化完成,以后该客户端每次进入系统时从注册表里找到相关数据库连接信息,设置ADOConnection1组件的ConnectionString属性值。客户端第一次使用该售楼管理系统时注册界面如图10-3所示。图10-3数据库连接初始化窗体Microsoft在如图10-3所示的界面上输入正确的服务器机器名、SQLServer数据库名、SQLServer数据库用户名和SQLServer数据库口令之后,按下“”按钮,即可完成数据库连接初始化,“”按钮的OnClick事件代码如下。procedureTFrmRegister.Button1Click(Sender:TObject);varconstr:string;beginreg:=tregistry.Create;reg.RootKey:=HKEY_CURRENT_USER;ifreg.OpenKey(softwareCiedwhpu,true)thenbeginreg.WriteString(computer,trim(edit1.Text);reg.WriteString(database,trim(edit2.Text);reg.WriteString(username,trim(edit3.Text);reg.WriteString(password,trim(edit4.Text);endMicrosoftelsebeginifreg.OpenKey(software,false)thenbeginreg.CreateKey(computer);reg.CreateKey(database);reg.CreateKey(username);reg.CreateKey(password);reg.CloseKey;ifreg.OpenKey(softwareCiedwhpu,true)thenbeginreg.WriteString(computer,trim(edit1.Text);reg.WriteString(database,trim(edit2.Text);reg.WriteString(username,trim(edit3.Text);reg.WriteString(password,trim(edit4.Text);end;end;reg.CloseKey;reg.Free;end;Microsoftconstr:=Provider=SQLOLEDB.1;Password=+trim(edit4.Text);/口令constr:=constr+;PersistSecurityInfo=false;UserID=+trim(edit3.Text);/用户名constr:=constr+;InitialCatalog=+trim(edit2.Text);/数据库名称constr:=constr+;DataSource=+trim(edit1.Text);/服务器名称ADOConnection1.ConnectionString:=constr;ADOConnection1.Connected:=true;/ADOConnection1组件用于判断注册是否成功ifADOConnection1.Connectedthen/与数据模块中的ADOConnection1组件不是同一个beginshowmessage(注册成功!请退出系统后重新进入。);F_Login.Close;/关闭登录窗体F_Login.Release;/释放登录窗体所占内存资源FrmRegister.Close;/关闭注册窗体FrmRegister.Release;/释放注册窗体所占内存资源end;end;Microsoft注册成功后,客户端操作系统注册表记载了数据库的有关信息,退出售楼系统第二次或者以后进入该售楼系统,就不必再进行注册,直接在登录窗体中输入正确的用户名和口令(此处是售楼系统的用户名和口令),则进入售楼系统的主界面窗体。登录窗体F_Login的OnCreate事件设置了数据模块中ADOConnection1组件的ConnectionString属性值,这是从注册表里读取服务器机器名、SQLServer数据库名、SQLServer数据库用户名和SQLServer数据库口令,接着将这4个信息赋值给ConnectionString属性,代码如下。procedureTF_Login.FormCreate(Sender:TObject);varconstr,Red:string;reg:TRegistry;beginreg:=tregistry.Create;reg.RootKey:=HKEY_CURRENT_USER;ifreg.OpenKey(softwareCiedwhpu,false)thenbeginMicrosoftconstr:=Provider=SQLOLEDB.1;Password=+reg.ReadString(password);/口令constr:=constr+;PersistSecurityInfo=false;UserID=+reg.ReadString(username);/用户名constr:=constr+;InitialCatalog=+reg.ReadString(database);/数据库名constr:=constr+;DataSource=+reg.ReadString(computer);/服务器名称Red:=reg.ReadString(registed);/是否已注册DataModule1.ADOConnection1.ConnectionString:=constr;给ConnectionString属性赋值tryDataModule1.ADOConnection1.Open;Button3.Visible:=false;/已经注册,注册按钮不可见exceptonELoginFaileddobeginButton3.Visible:=true;/注册按钮可见,要进行注册Timer1.Enabled:=true;showmessage(请检查网络是否连通!);application.Destroy;end;end;endelsebeginTimer1.Enabled:=true;/第一次使用本系统,请先注册数据库!end;end;Microsoft10.2 用户登录窗体设计及系统主窗体用户登录窗体设计及系统主窗体10.2.1用户登录窗体界面设计用户登录窗体运行时让用户输入密码,以确定用户是否合法,能否进入售楼系统。在工程中选中Frm_Login空白窗体,按照图10-4进行设置,其中用到的组件对象的主要属性见表10-3。Microsoft表表10-3 主要组件对象属性设置主要组件对象属性设置组件对象名属性属性值说明Label1Captio部门:Label2Caption用户名:Label3Caption口令:ComboBox2Text请选择部门用于选择部门ComboBox1Text请选择姓名用于选择姓名Edit1PasswordChar*输入的口令以*形式显示Text(空)用于输入密码Button1Caption确定“确定”按钮Button2Caption取消“取消”按钮Button3Caption注册“注册”按钮ADOQuery1ConnectionDataModule1.ADOConnection1选择数据模块上的数据库连接ADOQuery2ConnectionDataModule1.ADOConnection1选择数据模块上的数据库连接Microsoft图10-4数据库连接初始化窗体Microsoft10.2.2 用户登录窗体功能设计下面详细介绍本窗体设计的主要内容。1初始化用户登录时,窗体中数据源组件用数据模块中的ADOConnection1组件建立数据库连接,调用登录窗体F_Login的OnCreate事件即可将注册表中注册的数据库信息赋值给ADOConnection1组件的ConnectionString属性,实现过程见10.1.3节。用户登录窗体除了进行数据库连接初始化之外,还要将部门和姓名的信息写到下拉框ComboBox2和ComboBox1中,调用登录窗体F_Login的OnShow事件则可完成下拉框数据信息的初始化,代码如下。procedureTF_Login.FormShow(Sender:TObject);varreg:TRegistry;beginreg:=tregistry.Create;reg.RootKey:=HKEY_CURRENT_USER;ifreg.OpenKey(softwareCiedwhpu,false)then/注册表中有数据库信息MicrosoftbeginADOQuery1.CLOSE;ADOQuery1.SQL.Clear;/从数据表use_dep中选择所有部门信息ADOQuery1.SQL.Add(selectc_departmentfromuse_dep);tryADOQuery1.Open;exceptF_Login.Release;end;ComboBox2.Items.Clear;ifNOTADOQuery1.IsEmptythenbeginADOQuery1.First;whilenotADOQuery1.Eofdobegin/将所有部门信息逐条加入到ComboBox2下拉框中ComboBox2.Items.Add(ADOQuery1.FieldValuesc_department);ADOQuery1.Next;end;end;MicrosoftComboBox1.Items.Clear;ADOQuery2.CLOSE;ADOQuery2.SQL.Clear;/从数据表use_user中选择所有用户名姓名信息ADOQuery2.SQL.Add(selectc_namefromuse_user);ADOQuery2.Open;ifNOTADOQuery2.IsEmptythenbeginADOQuery2.First;whilenotADOQuery2.Eofdobegin/将所有用户名信息逐条加入到ComboBox1下拉框中ComboBox1.Items.Add(ADOQuery2.FieldValuesc_name);ADOQuery2.Next;end;end;endelsebeginreg.CloseKey;end;reg.Free;end;Microsoft当客户端用户选择相应的部门信息后,ComboBox1下拉框中的文本信息不再是所有用户名信息,而是选中部门下的所有用户名姓名,实现过程调用ComboBox2的OnSelect事件,代码如下。procedureTF_Login.ComboBox2Select(Sender:TObject);vardepid:integer;name1:string;beginEdit1.Text:=;name1:=trim(ComboBox2.Text);ComboBox1.Items.Clear;ADOQuery2.Close;ADOQuery2.SQL.Clear;ADOQuery2.SQL.Add(select*fromuse_depwherec_department=:name);ADOQuery2.Parameters.parambyname(name).datatype:=ftstring;ADOQuery2.Parameters.ParamByName(name).Value:=name1;ADOQuery2.Open;ifnotADOQuery2.IsEmptythenMicrosoftbeginADOQuery2.First;depid:=ADOQuery2.FieldValuesi_id;ADOQuery2.Close;ADOQuery2.SQL.Clear;ADOQuery2.SQL.Add(selectc_name,c_passfromuse_userwherei_depart=:depid);ADOQuery2.Parameters.parambyname(depid).datatype:=ftinteger;ADOQuery2.Parameters.ParamByName(depid).Value:=depid;ADOQuery2.Open;ComboBox1.Items.Clear;ifNOTADOQuery2.IsEmptythenbeginADOQuery2.First;whilenotADOQuery2.EofdobeginComboBox1.Items.Add(ADOQuery2.FieldValuesc_name);ADOQuery2.Next;end;end;end;end;Microsoft2“确定”按钮功能实现“确定”按钮的功能是根据用户姓名和用户口令,到操作用户信息中去检测是否合法用户。如果是合法用户,则登录成功可进入售楼信息主窗体,同时记载用户名、用户权限和用户角色,即分别给公共使用单元publicvar.pas的三个变量username、userright、userrole赋值。其“”按钮的OnClick事件代码如下。procedureTF_Login.Button1Click(Sender:TObject);varpasswd:string;rightid:integer;beginusername:=ComboBox1.Text;passwd:=edit1.text;Edit1.Text:=;/Edit1文本框置为空,为下一次输入口令做准备if(username)and(passwd)thenbeginADOQuery2.Close;ADOQuery2.SQL.Clear;MicrosoftADOQuery2.SQL.Add(select*fromuse_userwherec_name=:usernameandc_pass=:passwd);ADOQuery2.Parameters.parambyname(username).datatype:=ftstring;ADOQuery2.Parameters.ParamByName(username).Value:=username;ADOQuery2.Parameters.parambyname(passwd).datatype:=ftstring;ADOQuery2.Parameters.ParamByName(passwd).Value:=passwd;ADOQuery2.Open;ifNOTADOQuery2.IsEmptythen/找到数据库中存放的用户名和口令beginADOQuery2.First;rightid:=ADOQuery2.FieldValuesi_roleid;ADOQuery1.Close;ADOQuery1.SQL.Clear;ADOQuery1.SQL.Add(select*fromuse_rolewherei_id=:rightid);ADOQuery1.Parameters.parambyname(rightid).datatype:=ftinteger;ADOQuery1.Parameters.ParamByName(rightid).Value:=rightid;ADOQuery1.Open;ifNOTADOQuery1.IsEmptythenMicrosoftbeginADOQuery1.First;if(ADOQuery2.FieldValuesi_passed=i_co1)OR(ADOQuery2.FieldValuesi_passed=i_co2)thenbeginuserright:=ADOQuery1.FieldValuesc_popedom;userrole:=ADOQuery1.FieldValuesc_name;F_Login.Hide;/填写登陆信息systemflagid:=WriteLogin();ReadInfo();dfm11.Show;endelsebeginshowmessage(错误号201111);ComboBox1.SetFocus;exit;end;end;endMicrosoftelsebeginshowmessage(密码错误!);edit1.Text:=;ComboBox1.SetFocus;exit;end;endelsebeginshowmessage(用户名或密码为空!);edit1.SetFocus;exit;end;end;10.2.3 10.2.3 系统主窗体设计系统主窗体设计 n n 主窗体是系统的控制中心,也是用户操作的主要窗体之一。在工程中选中空白主窗体是系统的控制中心,也是用户操作的主要窗体之一。在工程中选中空白窗体窗体FrmFrm_ _SlmismainSlmismain,按照第按照第4 4章的第章的第4 4节和节和6 6节设计主窗体菜单以及其它快捷按钮,节设计主窗体菜单以及其它快捷按钮,同时第同时第4 4章的第章的第4 4、6 6节也介绍了各菜单项和按钮的处理程序。主窗体的节也介绍了各菜单项和按钮的处理程序。主窗体的FormShowFormShow事件中,根据用户当前登录身份,即将登录用户名和当前时间在状态条中显示,事件中,根据用户当前登录身份,即将登录用户名和当前时间在状态条中显示,实现代码如下。实现代码如下。n nprocedure procedure TFrmTFrm_ _SlmismainSlmismain.FormShowFormShow(Sender:(Sender:TObjectTObject););n nbeginbeginn n StatusBar1.Panels1.Text:=StatusBar1.Panels1.Text:=当前用户当前用户当前用户当前用户+username;u