📄 readme.txt
字号:
*-- 申明
*-- 时间仓促,未彻底调试,错误在所难免,欢迎任何 BUG 报告和建议
*-- 进入口令 lzw
*-- 特点:完全面对对象编程方法,完整的关系型数据模型。
本文是一个进销存管理系统 IT 的技术文档。此程序是一个简单的进销存系统,本文档由以下几部分组成:
********************************************************
** 一. 系统分析 **
** 二. 设计数据库 **
** - 安全性 **
** - 数据完整性 **
** - 数据库维护 **
** 三. 设计并创建类 **
** - 应用程序级函数 **
** - 表单级函数 **
** - 控制级函数 **
** - 关于类的注释 **
** 四. 编写、测试和调试应用程序代码 **
** - 表单 **
** - 报表 **
** - 菜单和工具栏 **
** - 错误处理 **
** - 主程序 **
** 五. 技术说明 **
********************************************************
一. 系统分析
* 功能 -- 该程序应提供输入进货单,销售单及盘存表的功能,该程序要求用户在进入应用程序查看或编辑数据时,必须具备有效的口令,并以此来保证数据安全性。
* 界面要求-- 界面必须符合 Windows 95 标准,并尽可能直观漂亮。
* 系统需求 -- 此应用程序可以运行在 VFP 所需的最低处理器和最少内存上,屏幕显示应为800 x 600 象素。
二. 设计数据库
设计数据库的关键问题是:
* 创建表结构和关系
* 实现安全性
* 维护数据的完整性
- 安全性
数据库的安全性包括对数据访问的限制。未授权的用户不能访问其中的表,还有一些用户则不能访问此数据库的某些部分。例如,您也许不希望让数据输入人员直接修改数据库内容。在实现安全性时,表 Employe 中添加了两个字段:Group_ID 和 Password ,在一个用户可以访问此数据库的信息之前,他或她必须在登录表单中表明自己是一名员工,并提供正确的口令。当一个用户登录时,IT 可以从字段 Group_ID 的值中获知用户的访问级别。
由于许多应用程序中都需要登录表单,因此在BASECTRL.VCX 中为登录表单创建了一个类: Login ,此表单类包含了供用户键入其标识和口令的文本框。类属性用于指定存放口令的表和字段,“确定”命令按钮的 Click事件调用通用代码验证用户键入的口令。根据用户是否已输入了正确的口令,此表单对属性 uRetVal 进行设置。
登录表单为一个独立应用程序提供了一级安全性,但是,因为任何有 VFP的用户都可打开此数据库并在应用程序之外查看或修改其中的数据,所以它的数据并不是真正安全的。在一个实际的系统中,可借助网络安全性和/或数据安全性来增强这种安全性。而在本示例
应用程序中,为了让所有 VFP 用户都可以在程序内外访问其中数据,为此,登录用户名和口令必须对任何想登录到应用程序中的人都是可知的,而且对数据也不进行加密。
- 数据完整性
保护数据完整性包括确保授权用户不能进行某些添加、修改或删除数据的操作,这些操作将导致数据库的某些部分无效或不准确。
数据库级的数据完整性管理主要是检查一个用户是否在应用程序的表单中或直接在"浏览"窗口中修改值,因此,数据完整性以参照完整性和强制性商业规则的形式在数据库中实现。
参照完整性
参照完整性是在数据库级上应用“参照完整性生成器”实现的。对于数据库中的所有父表,当一个关键字值改变时,其子表也要改变(级联更新);当用户删除 Sales表中的一个记录时,表 SaleItem中与其相关的记录也被删除(级联删除);如果其他父表的子表中还有相关的记录,则不能删除此父表中的记录(删除限制);用户也不能在子表中插入与父表记录不匹配的记录(插入限制)。
除SaleItem外,每一个表都有一个主关键字,VFP要求此字段不能是NULL值,也不能是空值,而且能自动防止在此字段中输入重复值,因此,没有必要编写防止重复关主键字值的代码。但是,为使这一功能更易于用户使用,可以用存储过程NewID() 为大多数表的主关键字生成新值。每一个表的下一个关键字值保存在Setup表中, NewID 返回此值,并计算下一个可用关键字的新值,NewID()是该系统中各表的主关键字的默认值(在“表设计器”中设置)。
存储过程 NewID()生成系统中的唯一标识号,并返回表的主关键字的默认值。NewID()中的代码打开SETUP.DBF,查找"表名"字段中的表别名,读取"关键字值"字段中的当前值,并将其加 1,然后写回到SETUP.DBF,加 1 前从"关键字值"字段读取的那一个值则作为记录的主关键字的值返回。注意存储过程 NewID()也可以接受一个别名作为参数,此技术同样也可以用于维护那些不用作主关键字的增量值。要修改存储过程可以先用 OPEN DATABASE 命令打开数据库,然后执行MODIFY PROCEDURES命令调出编辑窗口;另外,也可以使用 MODIFY DATABASE 命令,然后单击工具栏上的“存储过程”按钮。
表单级有效性检查
表单级数据有效性检查是通过启用和废止某些控制,以限制用户对数据的访问。可以在表单级为所有数据联系型表单设置开放式行缓冲。
数据输入表单为显示在表格控制中的表设置了开放式表缓冲。当用户决定他们不保存所做的修改时,开放式行缓冲和开放式表缓冲可用来还原记录。
- 数据库维护
为了让用户重索引表并检查数据库的有效性,本应用程序添加了“重新生成”表单,此表单使用了 REINDEX和 VALIDATE DATABASE 命令。
除使用 REINDEX 命令外,您还可以用 TAG() 和KEY() 函数提取索引表达式,然后用 DELETE TAG ALL删除所有索引标识,再用 INDEX ON 命令重新生成所有的索引,这样可以减小 .CDX 文件。
三. 设计并创建类
IT 中创建了两个类库,并在大部分VFP的基类基础上建立了子类,这样可以使本应用程序的基本"观感"方便地通过组件进行维护。此外,一般的功能也尽可能多地在类一级包含进来,以方便类的维护和重用。
在开发 IT 过程中的一些重要决定涉及到要加入哪一级的功能:
* 应用程序级
* 表单级
* 控制级
Application 类功能
GENERAL.VCX 中创建了一个通用的应用程序类:Application ,它所具有的功能使其能够用于任何应用程序,这些功能包括:
1. 显示启动屏幕
2. 应用程序运行时保存 VFP 环境
3. 为应用程序建立环境
4. 应用程序退出时恢复 VFP 环境
5. 运行与应用程序相关的主菜单并建立事件循环
6. 管理应用程序工具栏
7. 管理用户登录过程
8. 管理表单
Application 类的功能描述
1. 当应用程序运行时,应用程序对象将保存 VFP 环境。VFP 环境包括 SET 命令的设置,如PATH,TALK,CARRY,等等。在 Application 类的 Init事件代码中向 Application 中添加了一个新的对象,该 对象是基于 GENERAL.VCX 中的类 Environment。在Environment类的 Init 事件代码中,已有的 VisualFoxPro 的环境设置被保存到类的属性中,以便以后恢复使用。此外,该代码还将 VFP 的主窗口标题保存到Apllication 类的属性 cOldWindCaption 中。当释放一个基于 Application 类的对象时,可以恢复这些已保存的设置。
VFP 中另一个环境设置包括在运行一个应用程序时活动的标准工具栏。Application 的方法ReleaseToolbars()将系统工具栏的名称保存到Application 类中的属性 aToolbars 的元素中,同时还保存它们在运行应用程序时是打开还是关闭的信息。Application 的 Init 事件代码还可以将当前系统菜单压入菜单栈中,以便以后恢复。
2. 应用程序对象可以为应用程序建立运行环境。
Application 类的 Init 事件代码中其他部分可以建立运行环境,此代码可以:
* 调用 Environment 类中的方法 Set() ,设置类和过程库,设置是否显示已删除的记录(CLASSLIB,PROCEDURE,DELETED),并设置其他特定应用程序的环境设置。
* 为应用程序打开数据库。
* 调用方法 ReleaseToolbars() 释放运行应用程序时活动的所有系统工具栏。
* 用保存在 Application 类中 cMainWindCaption属性的值设置 VFP 的主窗口标题。
3. 应用程序退出时,应用程序对象可以恢复 VFP 的原有环境。
Application 类中方法 Cleanup() 的代码可以恢复VFP 的主窗口标题,关闭数据库,清除窗口,发布命令 CLEAR EVENTS,恢复初始菜单,并调用方法ShowToolbars() 重新打开在 IT.APP 运行前已显示的系统工具栏。
当发布 CLEAR EVENTS 命令时,程序继续执行 READEVENTS 并且MAIN.PRG 中的代码释放 oApp。释放此应用程序对象时,将发生 Environment 类中的 Destroy 事件,因为它是 Application 类的一个成员。Enviroment 对象的 Destroy 事件代码将调用 Environment 对象中的方法 Reset(),恢复 VFP 的环境设置,此环境设置是在创建这个 Environment 对象时就已经存在的。
4. 此应用程序对象运行与本应用程序相关的主菜单并建立事件循环。
一旦 Application 对象建立起来,MAIN.PRG 中应用程序类的 Do() 方法就将被调用,Do() 方法将运行主菜单程序并发布命令 READ EVENTS。
5. 应用程序对象管理应用程序工具栏。
表单级的属性指示与每个表单关联的工具栏,在这一个应用程序中,仅有一个工具栏,所以此属性对于本应用程序中的所有表单都是相同的。本应用程序中的表单调用类 Application 中的方法显示ShownavToolbar() 显示此工具栏。本应用程序知道此工具栏是否已经存在,并只在必要时才显示它, 同时增加属性 cFormInstanceCount的值,当释放最后一个表单时,此表单的事件 Destroy调用本应用程序中的方法 ReleaseNavToolbar(),减少nFormInstanceCount 值,并移去此工具栏。
6. 本应用程序对象管理用户登录过程。
大部分应用程序的安全性即提供了一些登录过程的表单,类 Application 中的方法 Login() 调用方法DoFormRetVal(),传送登录屏幕的类名。用户登录时,类Application 的一个属性 cUserLevel,保存此用户的用户级类型,此属性用于菜单清理代码中移去那些此用户不能查看的菜单项。
7. 本应用程序对象管理表单。
除了报表中用于为报表设置值范围的表单外,IT 的其它表单均通过类 Application中的方法显示, 方法 DoForm() 接受一个表单的名,并将一个参数或选地传给此表单,而方法 DoFormRetVal()接受一个表单类的名,并返回此表单指定的一个值。
表单类的功能
IT 包括以下三类表单:
1. 可以返回值的模式表单(如:“登录”表单)
2. 用于数据输入的表单
3. 一般表单 (如:“关于”和“介绍”表单).
下面的列表描述了 IT 中的表单类及其层次结构:
itFormRetVal
- IntroForm
- Login
itBaseForm
- itMaintForm
- One2Many
About
itfrmQuery
可以返回值的模式表单
所有返回值的表单都从某种程度上派生自BASECTRL.VCX 中的 itFormRetVal。
所有数据输入表单类都基于 BASECTRL.VCX 中的itBaseForm 。
itFormRetVal 提供了以下功能:
1. 活动时防止访问其它组件。
属性 WindowStyle 设置为 1- Modal。为给用户提供一个可见的提示,使基于此类的表单都是对话框,下列属性设置如下:
BorderStyle 2
MaxButton .F
MinButton .F
2. 返回一个用户确定的值。
添加了一个属性,保存从对话框返回的值: uRetVal。
子类总是通过调用 Application.DoFormRetVal 实例化。
数据输入表单
用于数据输入的表单都基于 itBaseForm 类并与类itToolbar 紧密地集成在一起。itBaseForm 提供了下列功能:
1. 表定位
2. 管理用户对数据的访问
3. 界面协调
itBaseForm 类功能描述
1. 表定位。
itBaseForm 包含以下表定位方法:
First() 移动记录指针到表的第一个记录。
Last() 移动记录指针到表的最后一个记录。
Next() 移动记录指针到表的下一个记录。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -