1、第一章 总论1.1 Delphi 6.0 简介Delphi6.0 是著名的 Borland(现在已和 Inprise 合并)公司开发的可视化软件开发工具。 “真正的程序员用 c,聪明的程序员用Delphi”,这句话是对 Delphi 最经典、最实在的描述。Delphi 被称为第四代编程语言,它具有简单、高效、功能强大的特点。和VC 相比, Delphi 更简单、更易于掌握,而在功能上却丝毫不逊色;和 VB 相比,Delphi 则功能更强大、更实用。可以说 Delphi同时兼备了 VC 功能强大和 VB 简单易学的特点。它一直是程序员至爱的编程工具。Delphi 具有以下的特性:基于窗体和面向对
2、象的方法,高速的编译器,强大的数据库支持,与 Windows 编程紧密结合,强大而成熟的组件技术。但最重要的还是 Object Pascal 语言,它才是一切的根本。 Object Pascal 语言是在 Pascal 语言的基础上发展起来的,简单易学。Delphi 提供了各种开发工具,包括集成环境、图像编辑(Image Editor) ,以及各种开发数据库的应用程序,如DesktopDataBase Expert 等。除此之外,还允许用户挂接其它的应用程序开发工具,如 Borland 公司的资源编辑器(Resourse Workshop) 。在 Delphi 众多的优势当中,它在数据库方面的
3、特长显得尤为2突出:适应于多种数据库结构,从客户机服务器模式到多层数据结构模式;高效率的数据库管理系统和新一代更先进的数据库引擎;最新的数据分析手段和提供大量的企业组件111 专业的客户/服务器开发工具客户/服务器是一种将任务进行分解,然后协同解决的计算模式。客户端的应用程序负责提出任务需求,服务器端的应用程序则为客户提供服务,例如数据查询、打印等。用 Delphi6.0 开发出的应用程序能够与数据库服务器完美地协同工作,构成客户/服务器计算模式。112 面向对象的编程在 Delphi6.0 中创建的窗口、菜单、数据窗口等都是对象。除了使用系统预先定义的对象外,开发人员可以自行构造新的对象,扩
4、展系统的预定义对象,将各种对象有机地组合起来就构成了Delphi 应用程序。113 Delphi 和 Object PascalObject Pascal 是 Delphi 的语言基础,Delphi 是 Object Pascal的加速引擎。软件开发工具在任何发展阶段都具有一个永远不变的目标:提高软件生产力。换句话说,就是最大程度为开发者提供方便,在最短时间内建立应用程序。例如,为了降低代码编写难度(对于近几年来才入门的程序员,汇编语言是晦涩难懂的,更不要说去编写代码了) ,最早的 C 语言和 Pascal 语言出现了;为了提高代码效率,面向对象技术应用到编程语言中;为了提高开发效率,可视化开
5、发工具出现了;为了实现跨平台应用,Delphi6 和 Kylix 出现了。Delphi 的精华是 VCL。离开了 VCL,开发者又回到了刀耕火种的计算机科学系第 3 页 共 39 页 年代。你可以试着将你编写的单元中的 uses 子句中由 Delphi 自动添加的如 SysUtils、Forms 等单元名删除,你会发现你编写的代码无法编译。VCL 封装了 Windows 消息机制,因此开发者可以方便地通过属性、事件、方法来控制对象;VCL 封装了数据库游标机制(准确地说是 BDE 封装的) ,因此用 Delphi 进行数据库应用开发的开发者完全可以对关系数据库的游标机制一无所知。Delphi
6、已经充分提供了积木元件(组件、类、标准例程) ,而开发者只需要加以利用就能够快速实现构想(应用程序) 。可见,快速应用开发(RAD)对于 Delphi 来说是当之无愧的114 Delphi 和 SQLSQL 语言作为关系数据库管理系统中的一种通用的结构查询语言, 已经被众多的数据库管理系统所采用,如ORACLE、Sybase 、Informix 等数据库管理系统,它们都支持SQL 语言。Delphi 与使用 SQL 语言的数据库管理系统兼容,在使用 Delphi 开发数据库应用程序时,我们可以使用 SQL 语言编程,支持 SQL 编程是 Delphi 的一个重要特征,这也是体现Delphi 作
7、为一个强大的数据库应用开发工具的一个重要标志。115 Delphi 的数据库特性及功能简介 直到目前为止,计算机软件的开发分为两个不同的体系,其中一个体系是使用传统的程序设计语言(如 Pascal、Basic 和 C等)开发数值控制、数值运算等软件,围绕它们的重点是算术、数据结构以及近年产生的面向对象技术。另一个体系则是通用的数据库管理软件领域(数据库应用程序的开发) 。这两个体系的发4展都极为迅猛,但是二者并没出现混合渗透迹象。如果使用数据库语言进行传统的算术编程,虽然也能完成相应的功能,但是其编程过程可能极为复杂。如果使用传统的编程语言进行数据库编程,通过调用专用的数据库应用程序接口函数和
8、过程,利用这些函数和过程提供的功能,可能也能做得比较完善,但这做起来大多是极其困难的。而 Delphi 结合了两个体系的优点,它结合了传统的编程语言 Object Pascal 和数据库语言的强大功能, 它即可以用于传统的算术编程又可以用于数据库编程,特别是 Delphi 具有强大的数据库功能,利用 Delphi 的数据库工具,我们根本不需要编写任何 Object Pascal 代码便可以创建一个简单的数据库应用。116 Delphi 对多种数据库管理系统的支持Delphi 在 Window3.1 以上版本的系统环境下运行,目前具有两个版本:Delphi 的标准版本和客户/服务器版本。标准版本
9、包含一个 Borland Database Engine 的局部拷贝,它允许用户创建能访问 dBASE、Paradox 和 Local InterBase 服务器的数据库应用, 它还支持具有 ODBC 接口的数据库。Delphi 的客户 /服务器版本包括 Borland SQL Link, 它能直接访问 ORACLE 、 SyBase 和Microsoft SQL Server,Informix 以及 InterBase 数据库服务器。Delphi 可以访问多种数据库管理系统的数据库,凭借窗体(Forms)和报表(Reports),BDE(Borland Database Engine)可以访
10、问诸如Paradox、dBASE、本地 InterBase 服务器的数据库,也可以访问远程数据库服务器上的数据库(如 ORACLE、SyBase、Informix 等客户/服务器数据库中的数据库),或任何经 ODBC(Open Database Connecticity) 可访问的数据库管理系统中的数据库。计算机科学系第 5 页 共 39 页 117 异常处理与程序调试在应用程序开发中如何检测、处理程序的运行错误是一个很重要的问题。在 Delphi 的集成开发环境( IDE )中提供了一个完善的内置调试器,可以帮助你发现大部分程序错误。但并不是所有的错误都可以被发现,而且当程序涉及到与外设的数
11、据交换或操作外设,如要求用户输入、读写磁盘等时,错误的发生是程序无法控制的,如输入非法字符、磁盘不能读写等。这些情况不仅会导致应用程序异常中止而且可能引起系统的崩溃。针对这些问题,Delphi 同时提供了一套强大的异常处理机制。巧妙地利用它,可以使你的程序更为强健,使用更为友好。6第二章 系统设计21 系统功能分析超市销售系统目前国内外做得较多,比较成熟,这个系统是毕业生毕业前的最后一次模拟,对毕业生的软件开发能力有很大帮助。本系统主要由以下几个功能组成:商品入库,用于将进来的商品录入到库里。商品销售,用于售货员销售商品。商品信息管理,现有库存、库存警报、商品报表三部分。查询,管理员根据自己的
12、需要进行查询,可按商品代号和商品名称查询。口令更改,用于员工更改自己的口令。员工信息维护,用于管理员修改员工的信息。计算机科学系第 7 页 共 39 页 22 系统功能模块设计根据系统功能要求可以将系统分解成几个子系统模块来分别设计应用程序界面,如图所示: 超市销售管理系统入库子系统销售子系统商品信息管理查询子系统口令更改子系统员工信息维护子系统入库子系统原库存无 原库存有8销售子系统前台销售界面 顾客清单商品信息管理库存警报商品信息报表现有库存顾客查询管理员查询查询子系统计算机科学系第 9 页 共 39 页 23 数据流程图数据流程图描绘了系统的逻辑模型,图中没有任何具体的物理元素,只是描绘
13、信息在系统中的流动和处理情况。对数据流的分析,主要是整体数据流、单元模块数据流。整体数据流概括为进入计算机操作员系统的操作过程和用户(各部门或个人)进入系统的数据流向。整体数据流:用户通过密码进入系统,分别对上述几大功能逐一实现,其中涉及到模块数据流分析。 根据上一节业务流程的分析以及业务流程图我们可以得出系统的数据流程。数据流图图例表示:数据的源点/终点 变换数据的处理数据存储 数据流10本系统各功能模块的数据流程图如下图所示:入库模块流程图:销售模块流程图:新进商品库存入库记录库存原有库存原无库 存 库 存销 售 销售信息计算机科学系第 11 页 共 39 页 商品信息管理模块流程图:查询
14、模块流程图:库存现有库存报进货报表库存警报报现有库存库存警报进 货管理员查询库 存 管理员查询结果12口令更改模块流程图:员工信息维护模块流程图:员工口令员工信息员工口令删 除口令更改员工信息增加计算机科学系第 13 页 共 39 页 第三章 数据库设计31 数据库需求分析数据库是信息管理的基础。数据库结构直接关系到各种功能的实现和程序运行的效率。进行数据库设计首先必须准确了解与分析用户需求(包括数据与处理) 。需求分析是整个设计过程的基础,是最困难、最耗费时间的一步。需求分析的结果是否准确地反映了用户的实际要求,将直接影响到后面各个阶段的设计,并影响到设计结果是否合理和实用。根据上一章的流程
15、图,可以列出以下各模块记录信息所需的数据项和数据结构:1入库信息管理入库记录:商品编号(SPNO) 、商品名称(SPNAM) 、经办人员(JBREN) 、进货数量(JHNUM) 、进货小计(inprice) 、备注(BEIZHU)2.销售信息管理销售记录:商品编号(SPNO) 、商品数量(SPNUM) 、经办人员(JBREN) 、商品名称(SPNAM) 、标准价格(BZJG) 、销售小计(XSXJ)3.商品信息管理商品信息记录:商品编号(SPNO) 、商品名称(SPNAM) 、本店库存量(BDKCL) 、默认成本(MORCB) 、供应商编号(GYSNO) 、商品分类(SPKIN) 、安全存量(
16、SAFCL) 、商品规格(SPGG) 、库存单位(KCDW) 、商品颜色(SPCOL) 、商品尺寸(SPSIZ) 、标准14价格(BEIZHU BZJG) 、会员价格(HYJG) 、批发价格(PFJG) 、备注(BEIZHU)4.员工信息管理员工信息:用户名(user) 、口令(password)32 数据库概念结构设计概念模型是对信息世界的建模,所以概念模型应该能够方便、准确的表示出信息世界中的常用概念。实体-关系模型(Entity-Relationship Module,简称 E-R 图)是数据库结构设计常用的方法。E-R 图提供了表示实体、属性和联系的方法。实体型:用矩形表示,矩形框内写
17、明实体名属性:用椭圆型表示,并用无向边与其相应实体连接起来联系:用菱形表示,菱形框内写明联系名,并用无向边与其有关实体连接起来,同时在边旁边标上联系的类型(1:1,1:n 或 m:n) 。对象类型的组成成份可以抽象为实体的属性。组成成份与对象之间是“is part of”的关系。实际上实体与属性是相对而言的,很难有截然划分的界限。同一事物,在一种应用环境中作为“属性” ,在另一种环境中就必须作为“实体” 。一般来说,在给定的应用环境中,属性不能再具有需要描述的性质。即属性必须是不可分的数据项,不能再由另一些属性组成。属性不能与其它实体具有联系。联系只发生在实体之间。计算机科学系第 15 页 共
18、 39 页 本系统中部分 E-R 图如图所示:1:m1:m 1:m1:m 库存入库信息 管理员商品销售信息安全存量本店库存量包含入库查询销售入库数量入库价格销售价格销售数量商品名称商品编号供应商编号1633 数据库结构实现商品信息表(SPXXB)结构:计算机科学系第 17 页 共 39 页 销售信息表(XSB)结构:进货信息表(JHZB)结构:18供应商信息表(GYSB)结构:计算机科学系第 19 页 共 39 页 第四章 详细设计41 登录界面为了提高系统的安全性,我们完全有理由相信,设置用户以及密码是必要的。用户登录界面很简单,首先在用户输入框输入用户名,再对应输入密码,程序将与用户数据库
19、连接,确认用户是其中一员,并输入了正确的密码,然后进入主界面,否则警告出错,让用户重新输入。界面设置如下:42 主界面主窗口界面主要是完成系统功能模块的划分。超市销售系统主窗口包括四个按纽,进货作业按纽、商品信息按纽、供应商信息按纽、销售作业按纽。界面设置如下:2043 入库子系统商品入库是将购进的商品进行入库。在入库时由入库员将商品信息输入到入库信息表中,然后系统将入库的商品的代号与库存里的商品信息比较,如果能找到相同的代号,则说明库存里有这种商品,只要相应增加这种商品的库存量。如果找不到,则说明原来库存里没有这种商品,则要增加这种商品的一系列信息,如商品代号、商品名称、进价等,界面设置如下
20、:计算机科学系第 21 页 共 39 页 44 销售子系统商品销售是将顾客购买的商品销售出去。在销售时,由销售员将顾客购买的商品代号输入到销售窗口中,系统自动根据商品代号把这种商品的相应信息反馈到数据窗口中,每一种商品都有一个小计,最后算出总计。最后点击“打印”便可打印出顾客清单了。销售界面界面设置如下:2245 商品信息管理子系统商品信息管理子系统包括三个小的基本功能,即:1现有库存,本功能是统计现在库存中所有的商品的信息,包括商品的代号,商品名,进价,售价,还有库存量等,主要是要库存量,因为后面的库存警报和进货报表都要建立在现在库存量的基础上。同样,点击“打印”按钮便可打印现有商品的库存信
21、息了。2库存警报,本功能是根据现有商品的库存量来判断哪种商品的库存量少于最小库存量,这就能提示管理员哪些商品需要进货。一开始打开窗口时,数据窗口内也是显示所有的库存商品信息,通过点击“安存不足”按钮便可查询库存量过少的商品信息了。3进货报表,本功能是显示要进货的商品的信息,它是建立在库存警报窗口中的过少的商品的信息上的。点击“打印安存不足”便可打印出进货报表,供进货员去进货。计算机科学系第 23 页 共 39 页 其功能界面设置如下:46 查询子系统查询功能实现管理员查询所需的商品信息。在商品信息界面的快速查询部分,管理员可以根据商品编号、商品名称、供应商编号、商品分类来查询相应的商品信息。界
22、面设置同上。47 口令更改子系统口令更改功能实现了员工更改自己的口令,在更改口令时,要求用户输入旧口令、新口令和确认新口令,用户必须输入正确的旧口令和两次相同的新口令,如果输入的旧口令不正确,则系统会弹出错误警告告诉用户旧口令错误,请用户重新输入旧口令。两样,如果两次新口令不一致,也会弹出警告窗口,提醒用户两次新口令不一样,请重新输入两次新口令。最后,点击“确认”就完成口令更改了。2448 员工信息维护子系统员工信息维护功能实现了管理员修改员工的信息。这也要求先用管理员用户名和口令登录,点击“增加”后,数据窗口会自动插入新的一行,管理员在数据窗口中输入员工的用户名和口令后按“保存”就完成增加员
23、工信息的功能了。同样,要删除一个员工的信息只要先选中这个员工的信息,按“删除”后,这个员工的信息就在数据窗口中删除了,再点击“保存”就可以了。49 帮助子系统任何一个系统都会有帮助系统,它用来解决用户的一些疑问,如用户对系统的功能及一些功能的使用方面可能有疑问,这时,可参考帮助系统提供的信息,能有效的给用户提供帮助。本系统的帮助系统对每一个子系统的功能及使用方法都有介绍,如用户有疑问或参考。第五章 各功能模块的部分源代码主界面代码:procedure TFMMAIN.BitBtn1Click(Sender: TObject);beginFMSPXXB.SHOW;end;当点击商品信息按纽时调用
24、 show 方法打开商品信息管理界面。计算机科学系第 25 页 共 39 页 procedure TFMMAIN.BitBtn2Click(Sender: TObject);beginFMGYSB.Show;end;当点击供应商信息按纽时调用 show 方法打开供应商信息管理界面。procedure TFMMAIN.BitBtn3Click(Sender: TObject);beginFMJH.Show;end;当点击进货作业按纽时调用 show 方法打开进货作业界面。procedure TFMMAIN.BitBtn4Click(Sender: TObject);beginFMXSB.SHOW
25、;end;当点击销售作业按纽时调用 show 方法打开商品销售界面。1入库子系统procedure TFMJH.BitBtn2Click(Sender: TObject);VARLOC1:BOOLEAN;LOC2:BOOLEAN;26N:REAL;Na:REAL;STR1:STRING;beginIF (EDIT1.Text=) OR (EDIT2.Text=) THENBEGINSHOWMESSAGE(请输入商品编号和进货数量!);ABORT;END;LOC1:=FMSPXXBD.TSPXXB.Locate(SPNO,EDIT1.Text,LOCASEINSENSITIVE);IF LOC1
26、=TRUE THENBEGINFMSPXXBD.TSPXXB.Edit;FMSPXXBD.TSPXXB.FieldByName(BDKCL).Value:=FMSPXXBD.TSPXXB.FieldByName(BDKCL).Value+STRTOINT(EDIT2.Text);FMSPXXBD.TSPXXB.Post;SHOWMESSAGE(新增商品数量成功!);END;IF LOC1=FALSE THEN计算机科学系第 27 页 共 39 页 BEGINIF (EDIT1.Text=) OR (EDIT2.Text=) OR (EDIT3.Text=) OR (EDIT4.Text=) O
27、R (EDIT5.Text=) OR (EDIT6.Text=) OR (EDIT7.Text=) OR (EDIT8.Text=) OR (EDIT9.Text=) OR (EDIT10.Text=) OR (EDIT11.Text=) OR (EDIT12.Text=) THENBEGINSHOWMESSAGE(新商品!请输入完全信息!);abort;END ELSEBEGINFMSPXXBD.TSPXXB.InsertRecord(EDIT1.Text,STRTOINT(EDIT2.Text),EDIT3.Text,STRTOFLOAT(EDIT4.Text),Edit6.TEXT,ED
28、IT7.Text,STRTOFLOAT(EDIT8.Text),EDIT9.Text,EDIT10.Text,EDIT11.Text,EDIT12.Text);SHOWMESSAGE(新增商品成功!);END;END;BEGINLOC2:=FMJHD.TJHZB.Locate(SPNO,EDIT1.Text,LOCASEINSENSITIVE);28IF LOC2=FALSE THENBEGINFMJHD.TJHZB.Active:=TRUE;FMSPXXBD.TSPXXB.Active:=TRUE;FMJHD.TJHZB.InsertRecord(EDIT1.Text,STRTOINT(ED
29、IT2.Text),EDIT3.Text,EDIT5.Text,Memo1.Text);FMSPXXBD.TSPXXB.FindKey(EDIT1.Text);N:=FMSPXXBD.TSPXXB.FieldByName(MORCB).AsFloat;STR1:=FMSPXXBD.TSPXXB.FieldByName(SPNAM).AsString;FMJHD.TJHZB.FindKey(EDIT1.Text);FMJHD.TJHZB.Edit;FMJHD.TJHZB.FieldByName(JHXJ).AsFloat:=STRTOFLOAT(Edit2.Text)*N;FMJHD.TJHZB
30、.FieldByName(SPNAM).Value:=STR1;FMJHD.TJHZB.Post;END;IF LOC2=True THENBEGINFMJHD.TJHZB.Active:=TRUE;FMSPXXBD.TSPXXB.Active:=TRUE;FMSPXXBD.TSPXXB.FindKey(EDIT1.Text);计算机科学系第 29 页 共 39 页 Na:=FMSPXXBD.TSPXXB.FieldByName(MORCB).AsFloat;FMJHD.TJHZB.FindKey(EDIT1.Text);FMJHD.TJHZB.Edit;FMJHD.TJHZB.FieldBy
31、Name(JHNUM).Value:=FMJHD.TJHZB.FieldByName(JHNUM).Value+STRTOINT(EDIT2.Text);FMJHD.TJHZB.FieldByName(JHXJ).AsFloat:=STRTOFLOAT(Edit2.Text)*Na+FMJHD.TJHZB.FieldByName(JHXJ).Value;END;END;当点击存盘按纽时,先检查商品编号和商品数量是否为空,为空就输出消息请输入商品编号和进货数量!,不为空就检查商品信息表中是否有记录用的是 Locate() ,有就直接存盘增加库存量,没有就要求输入完整的信息再存盘。2销售子系统pr
32、ocedure TFMXSB.BitBtn2Click(Sender: TObject);VARLOC3:BOOLEAN;LOC4:BOOLEAN;LOCOP:TLOCATEOPTIONS;30Nb:REAL;Nc:REAL;STR2:STRING;beginIF (EDIT1.Text=) OR (EDIT2.Text=) THENBEGINSHOWMESSAGE(请输入商品编号和数量!);ABORT;END;LOC3:=FMSPXXBD.TSPXXB.Locate(SPNO,EDIT1.Text,LOCOP);IF LOC3=TRUE THENBEGINFMSPXXBD.TSPXXB.Edit;FMSPXXBD.TSPXXB.FieldByName(BDKCL).Value:=FMSPXXBD.TSPXXB.FieldByName(BDKCL).Value-STRTOINT(EDIT2.Text);FMSPXXBD.TSPXXB.Post;END;IF LOC3=FALSE THENBEGINSHOWMESSAGE(无此商品!);