570 likes | 674 Views
第八章面向对象程序设计. 本 章 内 容. §8.1 面向对象程序设计基本概念 §8.1.1 对象与类 §8.1.2 属性、方法和事件 §8.1.3 面向对象程序设计的特点 §8.2 创建表单 §8.2.1 表单向导 §8.2.2 表单设计器 §8.2.3 “表单设计器”窗口和“表单设计器”工具栏 §8.2.4 创建表单实例 §8.2.5 设置数据环境 §8.2.6 引用层次结构中的对象 §8.2.7 自定义属性和方法. §8.1 面向对象程序设计基本概念. §8.1.1 对象与类. 1 .对象( Object )
E N D
第八章面向对象程序设计 本 章 内 容 §8.1 面向对象程序设计基本概念 §8.1.1 对象与类 §8.1.2 属性、方法和事件 §8.1.3 面向对象程序设计的特点 §8.2 创建表单 §8.2.1 表单向导 §8.2.2 表单设计器 §8.2.3 “表单设计器”窗口和“表单设计器”工具栏 §8.2.4 创建表单实例 §8.2.5 设置数据环境 §8.2.6 引用层次结构中的对象 §8.2.7 自定义属性和方法
§8.1 面向对象程序设计基本概念 §8.1.1 对象与类 1.对象(Object) 客观世界中独立存在的、能够区分的事物都可以看作对象。对象可以是具体事物,也可以指抽象概念。 对象的特征用属性(数据)来描述,对象的行为用方法(程序代码)来描述,对象是将数据和程序代码程结合在一起的数据结构。 对象中封装了数据和操作,每一个对象都具有自身的属性、方法和事件。 2.类 (1)类的概念 类(Class)是具有共同属性和操作的对象的抽象和概括,它抽取了该类对象的共性。 类是定义对象的的模板,反之对象是类的具体实例。
(2)类的划分 1)根据类的由来划分 ①基类:它是VFP 6.0系统预先定义的内置的类。VFP 6.0基类共有29个,“表单控件”工具栏中的按钮都是基类按钮。基类不存放在某个类库文件中。 ②自定义类:由用户创建的类。从基类可以派生出用户自定义类,从用户自定义类还可以派生出新的用户自定义类。自定义类存放在自定义类库中,类库文件的扩展为.VCX。一个类库可以存放一个或者多个自定义类。 2)根据类的包容性划分 ①容器类:能包含其他类的类。例如命令按钮组、选项按钮组和页框等。 VFP 6.0的容器及其可包含的对象见表8-1。
②控件类:不能包含其他类的类。例如命令按钮、文本框和标签等。②控件类:不能包含其他类的类。例如命令按钮、文本框和标签等。 使用容器类所创建的实例化对象是容器对象,使用控件类所创建的实例化对象是控件对象。 3)根据类的继承性划分 当基于现有的类创建新类时,新类就继承了现有的类的属性、事件和方法。新类称为子类,现有的类称为父类。
§8.1.2 属性、方法和事件 1.属性(Property) 属性用于描述对象的特征。 对象创建之后,VFP就赋予该对象各属性的默认值,用户可以修改对象属性的默认值,还可以添加对象的属性。 2.方法(Method) 方法用于描述对象的行为,是对象能够执行的操作,是系统内置的过程。方法所包含的程序对用户来说是不可见的。用户只需了解方法的名称和功能,遵循规定的格式调用方法,就能够完成相应的操作。 每个对象拥有各自的方法集合,且允许扩展对象的方法集合。对已有的方法,用户可以添加新的代码以扩充方法的功能,但VFP不允许修改和删除已有的方法。
4.事件(Event) 事件是能被对象识别和响应的预先定义的动作。每个对象都拥有一组固定的、由VFP预定义的事件集合,用户不能扩充对象的事件集合。事件的代码通常需要由用户来编写。 事件可由用户引发或系统引发。例如,单击命令按钮,则引发了命令按钮的Click事件;而计时器的Timer事件则由系统引发。 VFP 6.0总是处于等待事件发生的状态。某事件一旦被触发,系统就会执行该事件对应的过程代码,当然事件的过程代码需要由用户事先编写好。过程执行完毕,系统又处于等待状态。这种工作方式称为事件驱动的工作方式。 VFP 6.0的事件总是在不断地发生,但只有被编写了代码的事件才会产生某种操作,否则事件只是发生,而不会引起对象的任何变化。
§8.1.3 面向对象程序设计的特点 类具有三大特性:封装性、继承性和多态性。类的三大特性提高了代码的可重用性、易维护性和安全性。 1.封装性 封装性是指将对象的数据(属性)和操作(代码)隐藏起来,从而隐藏了对象内部的复杂性,只需通过简单的外部接口就能够访问对象。 封装性的优点如下: (1)隐藏了对象内部细节的复杂性,有利于程序的局部化,便于用户把精力集中于对象的设计。 (2)隐藏了对象的数据和操作的程序代码,有利于程序的安全。
2.继承性 继承是表示类与类之间的一种隶属关系。继承不仅仅是子类拷贝父类的属性、事件和方法,而且还继承父类的默认值。 子类不仅继承父类的属性、事件和方法,还可以添加自定义的属性和方法。 继承使对父类的修改自动反映到子类上,这将大大提高应用程序的开发效率。 3.多态性 多态性就是方法的名称相同,但允许所带的参数不同。用户根据不同的参数编写不同的代码。当调用该方法时,系统将根据传递来的参数而去调用相应的代码,从而实现使用同名方法调用不同程序代码的目的。 多态性提高了应用程序的可扩充性。
§8.2 创建表单 创建表单有2种方法:使用“表单设计器”或使用“表单向导”创建表单。“表单设计器”是创建和修改表单的工具,“表单向导”只能用于创建表单,而不能修改表单。 有开发经验的用户通常先用“表单向导”快速地创建一个表单,然后使用“表单设计器”进行修改和完善。使用这种方法创建表单,效率高且质量好。 §8.2.1 表单向导 1.打开“向导选取”对话框 (1)在“项目管理器”中打开“向导选取”对话框 (2)使用“工具”菜单打开“表单向导” 。
(3)使用“新建”按钮打开“表单向导” (4)单击工具栏中“表单向导”按钮,打开“向导选取”对话框。 “向导选取”对话框打开后,如图8-1所示。 图8-1 “向导选取”对话框
2.使用“表单向导”创建单数据源表单 【例8-1】使用表单向导创建一个维护职工简况表Zgjk.dbf的表单。 (1)打开“向导选取”对话框,选择“表单向导”选项,单击“确定”按钮,打开“表单向导”对话框(步骤1-字段选取)。在“数据库和表”列表框中,选择Zgjk.dbf表;在“可选字段”列表框中,选择所需的字段,并将其添加到“选定字段”列表框,如图8-2所示。 图8-2“字段选取”对话框
(2)单击“下一步”按钮,打开“表单向导”对话框(步骤2-选择表单样式)。在“样式”列表框中,选择“浮雕式”;在“按钮类型”选项组中,选择“文本按钮”,如图8-3所示。 (2)单击“下一步”按钮,打开“表单向导”对话框(步骤2-选择表单样式)。在“样式”列表框中,选择“浮雕式”;在“按钮类型”选项组中,选择“文本按钮”,如图8-3所示。 图8-3“选择表单样式”对话框
(3)单击“下一步”按钮,打开“表单向导”对话框(步骤3-排序次序)。在“可用的字段或索引标识”列表框中,选择“基本工资”,单击“添加”按钮,将其添加到“选定字段”列表框中,如图8-4所示。(3)单击“下一步”按钮,打开“表单向导”对话框(步骤3-排序次序)。在“可用的字段或索引标识”列表框中,选择“基本工资”,单击“添加”按钮,将其添加到“选定字段”列表框中,如图8-4所示。 图8-4“排序次序”对话框
(4)单击“下一步”按钮,打开“表单向导”对话框(步骤4-完成)。在“请键入表单标题”文本框中,输入“职工简况表维护”,如图8-5所示。(4)单击“下一步”按钮,打开“表单向导”对话框(步骤4-完成)。在“请键入表单标题”文本框中,输入“职工简况表维护”,如图8-5所示。 图8-5“完成”对话框
(5)单击“完成”按钮,打开“另存为”对话框。在“保存表单为”文本框中,输入“职工简况表维护.scx”,单击“保存”按钮。(5)单击“完成”按钮,打开“另存为”对话框。在“保存表单为”文本框中,输入“职工简况表维护.scx”,单击“保存”按钮。 (6)打开表单“职工表维护.scx”,适当调整表单控件的位置,然后保存表单。 (7)单击“常用”工具栏中的“运行”按钮,运行效果如图8-6所示。 图8-6 表单“职工表维护.scx”运行效果
3.使用“表单向导”创建一对多表单 【例8-2】创建一个按职工号排列的职工销售业绩的表单。 操作步骤如下: (1)打开“向导选取”对话框,在“选择要使用的向导:”列表框中,选择“一对多表单向导”选项,单击“确定”按钮,打开“一对多表单向导”对话框(步骤1-从父表中选定字段)。 在“数据库和表”列表框中,选择“Zgjk.dbf”表;在“可选字段”列表框中,分别选择“职工号”、“姓名”和“部门”3个字段 ,并将其添加到“选定字段”列表框,如图8-7所示。
(2)单击“下一步”按钮,打开“一对多表单向导”对话框的步骤2-从子表中选定字段。在“数据库和表”列表框中,选择“Xs”表;在“可选字段”列表框中,选择“商品编号”和“销售数量”字段,然后将其添加到“选定字段”列表框,如图8-8所。(2)单击“下一步”按钮,打开“一对多表单向导”对话框的步骤2-从子表中选定字段。在“数据库和表”列表框中,选择“Xs”表;在“可选字段”列表框中,选择“商品编号”和“销售数量”字段,然后将其添加到“选定字段”列表框,如图8-8所。 图8-8“从子表中选定字段”对话框
(3)单击“下一步”按钮,打开“一对多表单向导”对话框的步骤3-建立表之间的关系,如图8-9所示。(3)单击“下一步”按钮,打开“一对多表单向导”对话框的步骤3-建立表之间的关系,如图8-9所示。 图8-9“建立表之间的关系”对话框
(4)单击“下一步”按钮,打开“一对多表单向导”对话框(步骤4-选择表单样式)。在“样式”列表框中,选择“标准式”;在“按钮类型”选项组中,选择“文本按钮”,如图8-10所示。 图8-10“选择表单样式”对话框
(5)单击“下一步”按钮,打开“一对多表单向导”对话框(步骤5-排序次序)。在“可用的字段或索引标识”列表框中,选择“职工号”,单击“添加”按钮,将其添加到“选定字段”列表框,如图8-11所示。 图8-11“排序次序”对话框
(6)单击“下一步”按钮,打开“一对多表单向导”对话框的步骤6-完成。在“键入表单标题”文本框中,输入:职工销售业绩,如图8-12所示 。 图8-12“完成”对话框 单击“完成”按钮,打开“另存为”对话框,以“职工销售业绩.scx”为名称保存表单。
(7)打开表单“职工销售业绩.scx”,单击“常用”工具栏中的“运行”按钮 ,表单运行效果如图8-13所示。 图8-13 “职工销售业绩.scx” 表单运行效果 表单的上方显示一个职工的“职工号”、“姓名”和“部门”信息,表单的下方显示该职工销售的若干个商品的“商品编号”和“销售数量”的信息。
§8.2.2“表单设计器” “使用“表单设计器”创建表单的一般步骤如下: 打开“表单设计器”→[设置数据环境]→添加对象→ 设置对象的属性→编写事件代码→保存表单→运行表单。 有的表单要设置数据环境,有的表单不设置数据环境。 打开“表单设计器”常用的方法有3种。 1.使用“项目管理器”打开“表单设计器” 2.使用“新建”对话框打开“表单设计器” 3.使用命令打开“表单设计器” 在命令窗口中键入命令:CREATE FORM [<表单名>]
§8.2.3 “表单设计器”窗口和“表单设计器”工具栏 “表单设计器”用于创建新表单或修改已有的表单。“表单设计器”打开后,在VFP主窗口中,将出现“表单设计器”窗口、“属性”窗口、“表单设计器”工具栏和“表单控件”工具栏;在主窗口的菜单栏中增加了“表单”菜单,如图8-14所示。 图8-14 “表单设计器”窗口
1.“表单设计器”窗口 “表单设计器”窗口内嵌于VFP 6.0主容器中,“表单设计器”窗口中包含一个表单窗口。新创建的空白表单的默认名称为Form1。 2.“表单设计器”工具栏 “表单设计器”打开的同时还打开了“表单设计器”工具栏,单击“表单设计器”工具栏中的按钮,可以打开或关闭“表单控件”工具栏、“属性”窗口、“布局”工具栏、“数据环境”窗口和“代码”窗口等 。 3.“表单控件”工具栏 单击“表单设计器”工具栏中的“表单控件工具栏”按钮,可以激活或隐藏“表单控件”工具栏。 (1)“表单控件”工具栏中的按钮 “表单控件”工具栏中共有25个按钮,除了“选定对象”、“查看类”、“生成器锁定”和“按钮锁定”4个辅助按钮外,其余都是用于定义表单控件的按钮。
(1)向表单添加对象 单击“表单控件”工具栏中的某控件按钮,然后将鼠标移到表单窗口的合适位置,若单击鼠标,则添加默认大小的对象;若拖动鼠标,则添加指定大小的对象。 (2) 调整对象的大小和位置 若要调整对象的大小和位置,应先选定要调整的对象。 1)选定对象 在表单上选定对象的方法见表8-5,被选定的对象四周出现8个控点。
2)移动对象 先选定对象,然后用鼠标将对象拖动到合适的位置。用鼠标拖动的步幅是一个或者半个小方格。选定对象后,若用箭头方向键移动,则可以进行细微的位置调整。 3)调整对象大小 选定对象,然后用鼠标拖动对象四周的控点,可改变对象的宽度和高度。 4)复制对象 选定要复制的对象,单击工具栏中的“复制”按钮,将其复制到剪贴板,单击工具栏中的“粘贴”按钮,复制的对象就出现在表单的左上角,然后将复制的新对象拖动到表单的合适的位置。 5)删除对象 选定要删除的对象,然后按Delete键。 6)对象对齐 先选定要对齐的多个对象,然后 执行“格式”菜单中“对齐”命令的子命令进行对齐,或者单击“表单设计器”工具栏中的“布局”按钮,打开“布局”工具栏,然后使用“布局”工具栏中的按钮进行对齐。
4.属性”窗口 “表单设计器”打开后,一般“属性”窗口也打开了。如果看不到“属性”窗口,可单击“表单设计器”工具栏中“属性窗口”按钮,打开“属性”窗口。 “属性”窗口包含对象框、选项卡、属性设置框、属性列表框和属性说明框,如图8-17所示。 图8-17“属性”窗口
§8.2.4 创建表单实例 创建表单的一般步骤如下: 打开“表单设计器”→[设置数据环境]→添加对象→设置对象的属性→编写事件代码→保存表单→执行表单。 表单可以设置数据环境,也可以不设置数据环境。
【例8-3】创建一个如图8-19所示的表单,其功能为:输入圆的半径,单击“计算”按钮,即计算出圆的面积。 (1)设计界面 1)单击“新建”按钮,打开“新建”对话框,选择“表单”选项,单击“新建文件”按钮,打开“表单设计器”窗口。 2)单击“表单控件”工具栏中的“标签”控件,然后单击表单,表单上出现标签控件Lable1;用同样的方法创建标签控件Lable2。 3)单击“表单控件”工具栏中的“文本框”控件,然后单击表单,表单上出现文本框控件Text1;用同样的方法创建文本框控件Text2。 4)单击“表单控件”工具栏中的“命令按钮”控件,然后单击表单,表单上出现命令按钮控件Command1。
(2)设置对象属性 在“属性”窗口中,分别设置各对象的属性值见下表。 思考:为什么文本框Value的值要设置为0 ?
(3)编写事件代码 1)双击表单中的命令按钮Command1,打开“代码编辑”窗口。 2)在“过程”组合框中,选择Click事件。 3)在“代码”窗格中,输入如下代码 R=Thisform.Text1.Value Thisform.Text2.Value=3.1416*R*R (4)保存表单 1)单击工具栏中的“保存”按钮,打开“另存为”对话框。 2)在“另存为”对话框中,选择表单保存的位置,输入表单的名称“计算圆面积”。 3)单击“保存”按钮。
(5)执行表单 单击“常用”工具栏中的“运行”按钮。在“半径R=”所标示的文本框中,输入半径值,例如输入12,单击“计算”按钮,在“圆的面积=”所标示的文本框中,显示圆的面积计算的结果,如图8-6所示。 图8-6 计算圆的面积
§8.2.5 设置数据环境 数据环境指表单的数据源,数据源可以是表、视图和表间关系。数据环境建立后,当打开或运行表单时,数据环境所定义的表或视图即自动打开;关闭表单,表或视图也随之关闭。 【例8-4】创建一个表单,用于浏览职工简况和销售业绩。在表单上设置“上一条”、“下一条”和“退出”3个按钮。单击“上一条”或“下一条”按钮,则上下翻阅每一个职工基本简况和销售业绩;单击“退出”按钮,则关闭表单。 1.打开“数据环境设计器” 右击表单,在弹出的快捷菜单中选择“数据环境”命令,或在“显示”菜单中选择“数据环境”命令,即打开“数据环境设计器”窗口,并在VFP主窗口的菜单栏中增加一个“数据环境”菜单。
2.向“数据环境设计器”窗口添加表和表间关系2.向“数据环境设计器”窗口添加表和表间关系 (1)右键单击“数据环境设计器”窗口,在弹出的快捷菜单中选择“添加”命令,或在“数据环境”菜单中,选择“添加”命令,如果数据库已经打开,就会弹出“添加表或视图”对话框,如右图8-20所示。 (2)在“选定”选项组中,选择“表”;在“数据库中的表”列表框中,选择所需的Zgjk表,单击“添加”按钮,将其添加到“数据环境设计器”窗口中,如图8-21所示。 图8-20 “添加表或视图”对话框 图8-21 “数据环境设计器”窗口
(3)建立表间临时联系 在“数据环境设计器”窗口中,可以建立表间临时联系。方法为:将父表的关联字段拖放到子表的匹配索引标识上,前提条件是子表的索引项已经建立。 数据环境以及其中的表和表间联系都是对象,在“属性”窗口中,可以看到数据环境的对象名为DataEnviroment,表的对象名为Cursor1和Cursor2,表间联系的对象名为Relation。 3.创建字段映像 用鼠标将“数据环境设计器”窗口中的字段拖放到表单上,则在表单上生成相应的控件对象,这些控件对象与表中的数据便实现了数据捆绑。 若将“数据环境设计器”窗口中一个字段名拖放到表单上,则生成一个标签控件和另外一个控件(通常是文本框);若将“数据环境设计器”窗口中“ ”拖放到表单上,则生成表的全部映像控件;
(3)创建字段映像 若将“数据环境设计器”窗口中表的标题栏拖放到表单上,则生成一个表格控件。 使用以上介绍的方法,将Zgjk.表“”拖放到表单上,将Xs.表标题栏拖放到表单上,调整控件位置后,如图8-22所示 图8-22“表单设计器”窗口
4.添加控件对象 单击“表单控件”工具栏中的“命令按钮”控件,然后单击表单,在表单上创建命令按钮控件Command1,Command2,Command3。 5.设置对象属性 在“属性”窗口中,分别设置各对象的属性值见下表。
6.编写对象的事件代码 (1)双击表单中的命令按钮Command1,打开“代码编辑”窗口。 (2)在“过程”组合框中,选择Click事件。 (3)在“代码”窗格中,输入如下代码: Skip -1 &&指针倒退一个记录 if bof() &&假如到了表文件开始标记 Messagebox("已到文件开始标记") &&弹出提示框 This.Enabled=.F. &&"上一条"按钮失效 else &&假如还没有到表文件开始标记 This.Enabled=.T. &&"上一条"按钮有效 endif This.Parent.Command2.Enabled=.T. &&"下一条"按钮有效 ThisForm.Refresh &&刷新表单,以显示当前记录的内容
(4)输入命令按钮Command2的Click事件代码如下:(4)输入命令按钮Command2的Click事件代码如下: Skip &&指针前进一个记录 if eof() &&假如到了表文件结束标记 Messagebox("已到文件结束标记") &&弹出提示框 This.Enabled=.F. &&"下一条"按钮失效 skip -1 &&指针倒退一个记录 else &&假如还没有到表文件结束标记 This.Enabled=.T. &&"下一条"按钮有效 endif This.Parent.Command1.Enabled=.T. &&"上一条"按钮有效 ThisForm.Refresh &&刷新表单,以显示当前记录的内容 (5)输入命令按钮Command3的Click事件代码如下: ThisForm.Release &&释放表单
7.保存表单 (1)单击工具栏中的“保存”按钮,打开“另存为”对话框。 (2)输入表单的名称“职工简况和销售业绩 ”,然后单击“保存”按钮。 8.执行表单 单击“常用”工具栏中的“运行”按钮,表单运行效果如图8-26所示。 图8-26“职工浏览”表单运行效果
§8.2.6 引用层次结构中的对象 1.对象的层次关系 VFP的对象分为容器对象和控件对象。容器对象中可包含容器对象和控件对象,这样就形成了容器对象的嵌套层次关系,如图8-27所示。如果要引用层次结构中的某个对象,那么必须指明该对象在层次结构中的位置,即对象的地址。 图8-27 容器对象的嵌套层次关系
(1)绝对引用 绝对引用是从包含该对象的最外层容器对象开始,逐层描述到所引用的对象。 格式:[表单集名.]表单名.[容器对象名……].对象名.属性或方法 例如: ThisFormSet1.Form1.PageFrame1.Grid1.Column1.Text1.Value&&属性引用 ThisForm.Refresh&&方法引用 (2)相对引用 相对引用是从当前对象的位置开始,逐层(通常向下)描述到所引用的对象。 相对引用要使用引用关键字。引用关键字及其意义见下表。
格式:引用关键字.[容器对象名……].对象名.属性或方法格式:引用关键字.[容器对象名……].对象名.属性或方法 例如: This.Value &&当前对象的值属性 This.Command1.Caption&&当前容器对象中命令按钮的Caption属性 This.Parent.Caption&&当前对象的容器对象的Caption属性
§8.2.7 自定义属性和方法 1.自定义属性 【例8-5】创建一个用户登录系统的表单。用户输入用户名和口令,单击“确定”按钮,系统检测用户名和口令是否正确。如果正确,则允许打开系统,否则提示重新输入;如果三次输入错误,则关闭系统。在程序代码中,以Zgjk表中的“姓名”字段值为用户名,以Zgjk表中的“职工号”字段值为口令。 (1)设计界面 在表单上创建三个标签控件(Lable1、Lable2和Lable3)、一个文本框(Text1)、一个组合框(Combo1)和两个命令按钮Command1和Command2,如右图所示。 图8-28 表单窗口
(2)添加对象和设置对象属性 1)添加表单的新属性 ①选择“表单”菜单中的“新建属性”命令,打开“新建属性”对话框,如下图所示。 ②在“名称”框中输入新属性名“num”,然后单击“添加”按钮。 图8-29 “新建属性”对话框
2)在“属性”窗口中,分别设置各对象的属性值见下表。2)在“属性”窗口中,分别设置各对象的属性值见下表。
3)使用“生成器”设置对象的属性值 组合框的属性值可以使用“属性”窗口来设置,也可以使用“生成器”来设置。具体操作方法如下: ①右击组合框,在弹出的快捷菜单中选择“生成器”命令,打开“组合框生成器”对话框。 ②在“数据库和表”列表框中,选择Zgjk表;在“可用字段”列表框中,选择“姓名”,单击“添加”按钮 ,将其添加到“选定字段”列表框中,如图8-30所示。 图8-30 组合框生成器