详细设计的结果基本决定了最终程序的质量。为软件的质量,延长软件的生存期,软件的可测试性、可维护性提供重要的保障。详细设计的目标不仅是逻辑上正确地实现每个模块的功能,还应使设计出的处理过程清晰易读。 由前一阶段产生的系统功能模块图,我为系统的主要部分设计了如下程序流程图:通过以上步骤,基本上完成了对整个系统的总体设计,接下来所要做的就是软件的编码工作。系统总体设计的好坏直接影响着下一步工作,只有在这一阶段设计出好的模块图和程序流程图,才能更有利于编码,产生好的软件系统。 第五章 系统应用程序设计 §5.1 系统窗体模块组成 §5.2 数据模块窗体的设置 在编写数据库应用程序时,经常要遇到这样的情况,即好多组件、窗体同时访问相同的数据源,如果为每一个组件或者窗体都设置一个数据源将是十分耗时的工件,而且要保证这些数据源的确是相同的也需花一番功夫。那么,能不能将这些数据源集中管理,最好是做成一个统一的模块,需要时就将该模块引入而不必直接操作数据源本身呢?数据模块(DataModule)是解决这个问题最好的答案。简单说来,数据模块是用来集中管理数据源的一个窗体,该窗体可被需要的地方随时引入。 图5.2给出了本程序的数据模块(datamoduleform)窗体图,除报表窗体外所有的数据存取组件和数据源组件都在此数据模块中进行了定义。值得一提的是,设置了数据库Database组件,该组件引入了系统所需的唯一的数据库tsxs,Database组件的DatabaseName属性设置为tsckgl。tsxs数据库已在ODBC配置程序中进行了设置。其他的数据存取组件都是基于此数据库组件创建的,这样做的好处是,当数据库的别名或者其他信息改变之后,只需修改Tdatabase组件的AliasName属性即可。 另外,在本系统的数据模块窗体图中,我大多采用的AODQuery组件而没有采用BDE组,这主要是基于对ADO组件的了解。在Delphi的学习中我对ADO组件了解的更加清楚,使用也较BDE更为熟练,而且,ADO组件的功能也较BDE更为强大,所以在这里大多采用ADO组件来进行数据库联接。同时我也使用了BDE组件中的Table,因为在某些时候BDE有着其自身特有的优越性。 主窗体功能模块的实现 file://主窗体程序代码 public file://在程序的起始部分,定义快捷按钮点击事件 Procedure Popup1Handler(Sender:Tobject); Procedure Popup2Handler(Sender:TObject); ********************************************************************** procedure Tmainform.Popup1Handler(Sender: TObject); begin file://快捷按钮1(点“按出版社分类”按钮产生)的点击事件 with datamoduleform.MainQuery do begin file://打开数据模块窗体的MainQuery,对BookRecord表进行操作 close; file://关闭MainQuery SQL.Clear; file://清除SQL属性中的SQL命令语句 SQL.Add(‘select * from BookRecord where Publisher=:Pub‘); file://添加新的SQL语句 Parameters.ParamByName(‘Pub‘).Value:=(Sender as TMenuItem).Caption; open; file://重新打开MainQuery end; end; ********************************************************************** procedure Tmainform.SpeedButton1Click(Sender: TObject); Var s1,s2,s3,s4,s5 :String; file://设立5个变量以方便实现模糊查询 begin file://主窗口库存查询按钮事件 with datamoduleform.MainQuery do begin close; SQL.Clear; SQL.Add(‘select * from BookRecord‘); SQL.Add(‘where BookID Like :BookID and BookName Like :Name and Author Like :Author and Publisher Like :pub and BookType Like :BookType‘); file://使用Like语句来实现模糊查询 if Edit1.Text<>‘‘ then s1:=‘%‘+Edit1.Text+‘%‘ else s1:=‘%‘; Parameters.ParamByName(‘BookID‘).Value:=s1; file://给变量s1赋值 if Edit2.Text<>‘‘ then s2:=‘%‘+Edit2.Text+‘%‘ else s2:=‘%‘; Parameters.ParamByName(‘Name‘).Value:=s2; file://给变量s2赋值 if Edit3.Text<>‘‘ then s3:=‘%‘+Edit3.Text+‘%‘ else s3:=‘%‘; Parameters.ParamByName(‘Author‘).Value:=s3; file://给变量s2赋值 if Edit4.Text<>‘‘ then s4:=‘%‘+Edit4.Text+‘%‘ else s4:=‘%‘; Parameters.ParamByName(‘Pub‘).Value:=s4; file://给变量s2赋值 if Edit5.Text <>‘‘ then s5:=‘%‘+Edit5.Text+‘%‘ else s5:=‘%‘; Parameters.ParamByName(‘BookType‘