📄 readme.txt
字号:
Prior() 移动记录指针到表的前一个记录。这些方法在工具栏命令按钮的 Click 事件代码中调用。
2. 管理用户对数据的访问。
itBaseForm 提供了记录管理功能,管理何时以及如何添加、删除和编辑记录。添加新记录:
此表单类的 IAllowNew 属性指定用户是否可以添加新记录,itToolbar 类的 Refresh() 方法代码检查此属性的设置,并相应地启用或废止 cmdNew 按钮,工具栏按钮 cmdNew 的 Click 事件代码调用此表单类的方法AddNew() 。
删除记录:
此表单类的属性 IAllowDelete 与属性IAllowNew 的工作方式非常相似,要删除一个记录,用户必须从“文件”菜单中选择“删除”命令,“文件”菜单中“删除”项的 SKIP FOR 表达式按照 IAllowDelete 的设置启用或废止此菜单项。如果想禁止某些用户删除或添加新记录,则可使用属性 IAllowDelete 和 IAlloewNew来达到安全性目的。
编辑记录:
属性 IAlloewEdits 指定用户能否编辑记录。例如: 在数据输入表单中,用户可以编辑还没有审核的记录,但当数据已审核后,则记录不能再修改。如果IAllowEdits 为 .F. ,则此表格在其自身的方法Refresh() 中被废止,并且在基于 One2ManyTextbox 类的文本框的方法 Refresh() 触发时,文本框也被废止。
itBaseForm 的以下方法也用于数据编辑管理:
DataChanged() 表单中的数据被修改时返回.T. ,此方法使用了GETFKDSTATE()并可以经过重写提供已编辑记录的更详细信息。
IsNewAndEmpty() 如果用户选定了添加一个新记录但还没有输入任何数据,则返回.T.
WriteBuffer() 当用户选择不离开控制保存时,确保当前控制的值被写入。
Restore() 如果用户不保存所做修改,则恢复原来的值。
Save() 调用 WriteBuffer() 保存对当前记录的修改值,并捕获保存数据时产生的错误。
AskToSave() 当用户离开当前记录时,检查是否已修改数据。如果已修改数据,则显示一个消息框,让用户确认保存所做修改。
3. 界面调整。
itBaseForm 管理以下的界面功能:
(a) 在窗口菜单中添加表单标题。
(b) 显示与表单关联的工具栏。
(c) 刷新表单。
(d) 适当时候显示沙漏标。
(e) 保存并恢复在各会话期之间表单的位置。
(a) 在窗口菜单中添加表单标题。
默认时,VFP 在“窗口”菜单中显示已有表单的表单名,而表单标题比表单名更合适。在类itBASEFORM 中包含了一个方法 AddToMenu() ,在Init中调用,它将表单的标题放入“窗口”菜单中。Unload 事件的代码调用RemoveFromMenu() 方法可从“窗口”菜单中移去此标题。
(b) 显示与表单关联的工具栏。
cToolBar - 保存与表单关联的工具栏名。此工具栏在本应用程序中对每一个表单都是相同的,但如果一个应用程序中有多个工具栏,那么此属性可以用来指定合适的工具栏。
在 itBaseForm 的 Init 事件中,其代码检查表单的cToolbar 属性,如果这个属性不空,则 Init 事件代码调用应用程序类中的 ShowNavToolbar() 方法 。
(c) 刷新此表单。
RefreshForm - 为重绘屏幕而锁定屏幕,刷新表单,并解锁屏幕。允许用户为表单指定自定义的刷新过程,其中还可以包含任何重新查询。
(d) 适当时候显示沙漏标。
WaitMode - 将鼠标光标设置为沙漏标表示后台处理正在进行。
(e) 保存并恢复在各会话期之间表单的位置。
RestoreWindowPos - 用 API 从 IT.INI中读取窗口的位置。它在此表单的 Init 事件中调用。
SaveWindowPos - 用 API 将窗口的位置写到IT.INI 中。它在此表单的 Destroy 事件中调用。
itBaseForm的子类:
itBaseForm 共有两个子类: itMaintForm 和 One2Many。
itMaintForm 包含一个页框,此页框带有两个页面:“数据输入”和“列表”。其中的“数据输入”页面为空,而“列表”页面则包含了一个表格,可以显示当前工作区的任何内容,本应用程序中表管理表单的创建方法如下:
1. 在表单设计器中建立 itMaintForm 的子类
2. 在数据环境中添加合适的表
3. 设置表单的 Caption 属性
4. 添加各种控制到“数据输入”页面并设置每个控制的 ControlSource 属性
5. 必要时定制在“列表”页面上的表格
BASECTRL.VCX 中的One2Many类包含了进货,销售和盘点表单的核心组件,因为进货,销售和盘点表单共享许多相同的组件,因此它们都从此类中继承。
数据查询表单
用于数据查询的表单都基于 itfrmQuery 类并与类itQueryToolbar 紧密地集成在一起。itfrmQuery 提供了下列功能:
1. 数据筛选
2. 报表打印
由于数据统计都是在系统设计初期在数据模型中建立了,所以数据查询时仅仅是将设计好的视图数据显示/打印出来。
itBaseForm 类功能描述
1. 表定位。
itBaseForm 包含以下表定位方法:
First() 移动记录指针到表的第一个记录。
Last() 移动记录指针到表的最后一个记录。
Next() 移动记录指针到表的下一个记录。
Prior() 移动记录指针到表的前一个记录。这些方法在工具栏命令按钮的 Click 事件代码中调用。
控制类函数
VFP 的大部分基本控制类都建立了子类,这样可以提供额外的默认功能和一致的外观。因为本应用程序必须在 800 x 600 显示方式下运行,所以这些控制的默认字体都设为 8 磅而不是 10 磅,以节约此表单的空间。此外,IT 中,只要成组的控制在不止一个地方出现,就创建一个类。
下列控制类存储在 BASECTRL.VCX 中:
itGrid
SumColumn 用于对表格的列自动求和。此类被添加到类 itMaintForm 中页框的“列表”页中。
itIFCombo
当用户在组合框中键入一个值时,事件KeyPress 的代码搜索相应匹配值,如果 LimitTolist 属性设为 .T. ,则用户只能选择列表中已有的项。组合框控制有一个 IncrementalSearch属性。此类中的已编码增量功能不同于默认功能,不同之处在于:不论用户的键入的速度如何慢,第一个字符之后的字符总是包含在搜索中,而且将用户还没有键入的匹配字符突出显示出来并可以由用户键入覆盖。
itLabel
属性 FontSize 设为 8 ,属性BackStyle 设为 0 - Transparent.
itTextbox
属性MaxLength 设为LEN(EVAL(This.ControlSource)),以阻止用户键入某些值, 这些值在存入一个表时会被截断。
itToolbarButton
标准工具栏命令按钮大小。
关于类的说明
在决定创建哪些类时,不仅考虑到当前的项目,而且还考虑到维护性和将来的项目,目的是在类中封装尽可能多的通用功能。这样做的结果造成基本类中包含了许多内部函数,并且集成在一起。这样,对于打开此项目查看其中内容的人来说,要理解本应用程序的工作方式就不那么容易了。因为 IT 的各组件集成化程度很高,因而不可能只从中抽出一到两个组件,将它们添加到另外一个以不同方式组织的项目中,并正常运行。但是,您可以通过生成适当类的子类,快速并方便地扩展IT ,或以同样的模型生成其它的应用程序。
开发人员本来可以创建一个自定义类,在类中定义对表操作的方法,并在表单类中或直接向表单中添加基于此类的对象,而不是将AddNew, Save, Delete, Restore和表定位方法添加到表单类中。这样做可以提供更多的灵活性,因为在以后的开发过程中,可以不考虑其父类,而将这些函数添加到任何表单中( 甚至添加到容器或控制类中)。但是另一方面,每次调用此方法时,都必须提供一个附加的引用层,而且如果此自定义类放在一个不同的.VCX 文件中,则此表单打开时,需要再打开一个文件。因为此类结构在生成表单之前就已清晰地勾划出来,并且所有与数据联系的表单都从 itBaseForm 继承而来,所以这些方法也就包含在 itBaseForm 中。
在 IT中,工具栏可以帮助用户取用对所有表单都可用的功能。另一种可供选择的方法是创建一个命令按钮类提供这一功能,并在每一个表单中添加一个基于此类的对象,这样做的好处是用户可以更容易地将此命令按钮与表单关联起来,也更容易地用键盘访问这些命令按钮。但是另一方面,由于在 Microsoft Office 中经常使用工具栏,因而用户非常熟悉工具栏。更重要的是工具栏不占用表单的任何额外空间,不会在已有很多控制的表单中继续添加任何多余控制,而且工具栏可以在运行时刻根据用户对软件使用的程度进行定制。
环境设置保存在一个类中,可以在一个单独的操作中设置和恢复。将环境设置存于一个类并在与 Destroy 事件关联的代码中恢复它们的一个好处是:测试系统崩溃时,可以很容易地恢复。发布 RELEASE ALL 可以触发事件Destroy,恢复原有的环境设置。
四. 代码的编写,测试与调试
数据库中的存储过程,类方法,表单方法,菜单,和程序代码编写时经过了测试和调试。
表单
IT 包含了表单类(存储于 .VCX 文件中) 和基于表单类的表单(存储于 .SCX 文件中)
下面列出了所有的表单(.SCX)文件。
IT 中的表单:
CHNGPSWD.SCX 用户口令维护表单
EMPLOYEE.SCX 员工维护表单
INV.SCX 盘存表录入表单
MEDICINE.SCX 商品维护表单
NEWMEDIC.SCX 输入商品表单
PAYMENT.SCX 付款方式维护表单
PURCHASE.SCX 进货单录入表单
QRYINV.SCX 盘存数据查询表单
QRYPURCH.SCX 进货数据查询表单
QRYSALES.SCX 销售数据查询表单
REBUILD.SCX 重建数据索引表单
SALES.SCX 销售单录入表单
SEARCH.SCX 数据查找表单
STOCKS.SCX 当前库存查询表单
大部分与数据无关的带控制表单(如: IntroForm 和About )作为类保存在 .VCX 文件中,并在需要时用CREATEOBJECT() 函数创建。有时一个与数据相联系的表单被作为一个类直接调用,例如,类 Login 中便包含了设置控制数据的属性,这些属性的默认值被设置为IT 的表和字段,其子类 LoginPicture直接在本应用程序中使用,但是没有任何表单(.SCX文件)基于此类。直接运行一个表单类的好处是创建和显示表单由两个独立操作完成:
oForm = CREATEOBJECT("IntroForm")
oForm.Show
这样安排后,便可以在对象创建之后显示之前,调整对象的属性设置。
在表单设计器中创建一个表单的好处是可以访问数据环境及其属性,事件,以及与数据环境对象相关联的方法,这对于设计和测试表单更为方便,因为可以直接从表单设计器或项目管理器中运行它们。
本应用程序中大部分与数据相联系的表单都在其数据环境中包含了表。如果本应用程序包含了一个允许用户同时更新多个表的表单,为此将创建一个视图。
报表
在 IT中,每一个报表在其数据环境中包含了一个本地视图。其中有几个报表允许用户为报表指定参数:
PSUMLIST.FRX 进货汇总表按日期
SSUMLIST.FRX 销售汇总表按日期
这些报表中,数据环境中的视图创建时带有参数。默认情况下,此报表的数据环境打开这些视图时,VFP 向用户显示一个通用对话框询问参数。为了自定义这种响应行为,数据环境的 AutoOpenTables 属性被设置为 .F.。 然后在数据环境的 Init 事件代码中,运行获取参数的自定义表单,接着调用数据环境中的方法OpenTables。
查询被认为是报表的来源,但报表中并不使用查询,因为它们要求有额外的 .QPR 文件进行维护和跟踪,而视图则包含在 .DBC 数据库文件中,可以在数据库设计器中显示和修改,还可以直接添加到数据环境中。但是,SQL SELECT 语句必要时仍要用到。
菜单和工具栏
本应用程序的主菜单定义在 MAIN.MNX 中,应用程序中的工具栏基于 BASECTRL.VCX 中的类 itToolbar和itQueryToolBar 。
菜单中的“清理”代码检查登录人的用户级别,释放此用户不能访问的菜单和工具栏,并在“文件”菜单的“返回 VFP” 菜单项代码中调用本应用程序对象的方法 Cleanup(),由它发布 CLEAR EVENTS 命令并恢复 VFP 菜单系统。
工具栏中各按钮的 Click 事件代码调用活动表单中的方法以实现相应功能,通过这种途径,与一个表单关联的功能与此表单封装在一起。
为使本应用程序中的菜单和工具栏协调工作,菜单项的代码一般调用工具栏中命令按钮的Click 事件代码。而Skip For 中的表达式可以按照工具栏中相关命令按钮状态启用或废止菜单项。
错误处理
错误处理的目的是对错误作出预测并尽可能在代码中防止其出现。例如,在运行 MAIN.PRG(在\IT\PROGS 中)而不是运行IT.APP (在 \IT 中)时,MAIN.PRG 中的代码被包含进来以调整相对路径的设置。在一个方法从本应用程序对象之外设置或读取其属性时,它首先要进行检查以确保该应用程序对象存在:
IF TYPE("oApp") == "O"
* 操作代码
ENDIF
如果选择一个控制会在某一特定位置引发错误,这个控制被废止。然而,不是所有错误都可以在代码中预见。必要时,错误处理可放入一个对象的 Error 事件代码中进行管理。当方法代码中出现一个错误时,VFP 查找与此对象 Error 事件关联的错误处理代码,如果在此对象级上没有为其 Error 事件编写代码,则此 Error事件代码从父类中继承,或层次结构中更上一级的类中继承,并运行找到的代码;如果在此类的层次结构中一直没有找到这样的代码,则 VFP 查找一个 ONERROR 例程;如果 ON ERROR 例程也没有找到,则显示默认的 VFP 错误消息。
IT 查找三类可在数据库级上出现的错误:违反字段规则,与主关键字冲突,触发器失败。由于 IT 中的表单已将缓冲方式设置为2-Optimistic(开放式),因此,这些错误唯一可能出现的时候是用户从一个记录移至另一个记录时(引起缓冲区数据被刷新)或保存已做修改的当前记录时。两者都通过表单级的方法进行处理(从 itBaseForm 继承到的方法),所以 VFP 首先在表单的 Error 事件中查找错误处理代码。
如果主关键字或字段规则发生冲突,则其错误信息被传送到与其相关的控制,这样,此控制的错误代码所显示的错误信息就比 VFP 的默认错误信息要更具体,而且可以恢复合适的旧值,并将焦点设置到合适的控制。
如果遇到其他错误,则“客户”表单将此错误传给其父类 itMaintForm,它可以从 itBaseForm 那里继承错误处理代码。如果此错误表示是触发器失败,则itBaseForm 的 Error 事件代码将显示存储在“客户”表单的aErrorMsg[ ] 属性中的相关错误消息:“插入触器失败”,“更新触发器失败”或“删除触发器失败”,(每个表单唯一的自定义错误消息可以通过初始化表单的Init 代码中 aErrorMsg[] 数组中的合适元素而生成),其他错误则只给出用户三个选项:退出,重试,忽略。
IT 中 itBaseForm 的RestoreWindowPos() 方法有一个 ON ERROR 设置:
ON ERROR llError = .T.
恢复窗口位置的代码检查 IIError 的值,如果在从 .INI文件中读取保存的窗口位置时出错,则此表单的位置由表单的默认 Top 和 Left 属性确定。
主程序
MAIN.PRG 中的代码是本应用程序的主程序,在运行本应用程序时首先执行 MAIN.PRG于中的代码,此代码用于:
1. 声明读写应用程序 .INI 文件的 API 函数。
2. 保存某些环境设置,这些环境设置(CURDIR(),PATH 和 CLASSLIB)必须在本应用程序对象实例化之前设置好。
3. 在用户运行 MAIN.FXP 而不是 IT.APP 时,调整路径。
4. 将类库设置为 GENERAL
5. 创建一个基于 GENERAL 的应用程序对象:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -