1
第 八 章
面 向 对 象 的 程 序 设 计
目录
上页
下页
退出
2
本 章 目 录
第一节 面向对象的概念
第二节 Visual FoxPro 6.0中的类与对象
第三节 类与对象的程序设计方法
第四节 类和对象可视化设计方法
目录
上页
下页
退出
3
第一节 面向对象的概念
一、面向对象的概念
在面向对象的程序设计 (Object-Oriented Programming )
中,对象 (Object)是组成程序的构件, 就好像在面向过程
的结构化程序设计方法中的子程序和函数一样 。
在面向对象的程序设计方法中,程序设计人员不是完
全按过程对求解问题进行分解,而是按照面向对象的观
点来描述问题、分解问题,最后选择一种支持面向对象
方法的程序语言来解决问题。
目录
上页
下页
退出
4
1,对象 ( Object)
客观世界里的任何实体都可以被看作是对象 。 对象
可以是具体的物, 也可以指某些概念 。
从编程的角度来看,对象是一种将数据和操作过程
结合在一起的数据结构,或者是一种具有属性(数据)
和方法(过程和函数)的集合体。事实上程序中的对象
就是对客观世界中对象的一种抽象描述。
在面向对象程序设计中,,对象, 是对现实世界中
实体的一种模拟工具。如命令按钮、文本框、菜单、工
具栏等。
2,属性 ( Property)
所谓属性,就是对象的特性。在面向对象程序设计
中,每个对象都具有自己的属性。
目录
上页
下页
退出
5
3,事件 ( Event)
“事件, 是, 对象, 触发的行为描述,,事件, 是预先
定义的动作,由用户或者系统激活。常见的, 事件, 往往
是一些鼠标动作,如, 单击,,, 双击,,, 拖放, 或修
改文本框对象的数据等。
4.方法 (Method)
方法是与对象相关的过程,是指对象为完成一定功能
而编写的一段代码。当作用在对象上的某一个设定, 事件,
发生时,与该事件相联系的, 方法程序, (当然假设对象
的设计者已经设计了该程序并与对象一起封装)就运行并
完成该程序的功能。
5.事件代码与方法代码
事件代码与方法代码都是定义在某个对象中的一个程
序过程,一个对象包含的事件代码是一定的,不能增加,
而一个对象中所包含的方法代码是可以任意增加的。
目录
上页
下页
退出
6
6.类 ( Class)
“类, 是具有相同属性特征和行为规则的多个, 对象,
的一种统一描述。, 类, 是一个数据模式和若干个程序
过程经封装而形成的一个整体,它是对现实世界的一种
模拟与抽象,而, 对象, 则是, 类, 的一个具体实例。
7.子类与继承
在面向对象的方法里, 继承是指在基于现有的类创
建新类时, 新类继承了现有类里的方法和属性 。 此外,
可以为新类添加新的方法和属性 。 我们把新类称为现有
类的子类, 而把现有类称为新类的父类 。 一个子类的
成员一般包括:
( 1) 从其父类继承的属性和方法 。
( 2)由子类自己定义的属性和方法。
目录
上页
下页
退出
7
8,Visual FoxPro基类
Visual FoxPro基类 是系统本身内含的,并不
存放在某个类库中。用户可以基于基类生成所需
要的对象,也可以扩展基类创建自己的子类
在程序设计中, 可以使用 CREATEOBJECT函数
来直接生成基于某个类的对象 。 该函数的格式如
下:
CREATEOBJECT( <类名 >[,<参数 1>,<参数
2>,… ])
函数基于指定的类生成一个对象,并返回对象
的引用。
9,Visual FoxPro基类列表
目录
上页
下页
退出
8
类名 含义 类名 含义
ActiveDoc 活动文档 Label 标签
CheckBox 复选框 Line 线条
Column (表格)列 Listbox 列表框
ComboBox 组合框 Olecontrol OLE容器控件
CommandButton 命令按钮 Oleboundcontrol OLE绑定控件
CommandGroup 命令按钮组 OptionButton 选项按钮
Container 容器 Optiongroup 选项按钮组
Contorl 控件 Page 页
Custom 定制 PageFrame 页框
EditBox 编辑框 ProjectHook 项目挂钩
Form 表单 Separator 分隔符
FormSet 表单集 Shape 图形
Grid 表格 Spinner 微调控件
Header (列)标头 TextBox 文本框
HyperLink 超级链接 Timer 定时器
Image 图象 ToolBar 工具栏
类名 含义 类名 含义
活动文档 标签
线条
(表格)列 列表框
组合框 容器控件
选项按钮
容器 选项按钮组
控件 页
定制 页框
项目挂钩
表单 分隔符
表单集 图形
微调控件
(列)标头 文本框
超级链接 定时器
工具栏
类名类名 含义含义 类名类名 含义含义
活动文档活动文档 标签标签
线条线条
(表格)列(表格)列 列表框列表框
组合框组合框 容器控件容器控件
选项按钮选项按钮
容器容器 选项按钮组选项按钮组
控件控件 页页
定制定制 页框页框
项目挂钩项目挂钩
表单表单 分隔符分隔符
For Set 表单集表单集 图形图形
微调控件微调控件
(列)标头(列)标头 文本框文本框
超级链接超级链接 定时器定时器
工具栏工具栏
目录
上页
下页
退出
9
二、面向对象程序设计的基本特征
1,封装性
对象的封装性,就是指将对象的方法程序和属性代
码包装在一起。封装是借助类来实现的。
2,继承性
从一种现有的、普遍的类派生出的一种新的、具体
的类型的方法。现有的、普遍的的类叫做父类,也称基
类。新的、具体的类被称作子类,也被称作派生类。子
类继承父类的属性或方法。一个子类可以拥有其父类的
全部功能,并可在此基础上,添加其他功能。
3,多态性
所谓多态性实际上就是在运行时方法与对象的动态
绑定。多态性使得用户可以将所定义的方法应用于多个
对象,并使得程序更加容易扩充。
目录
上页
下页
退出
10
第二节 Visual FoxPro 6.0中的类与对象
一,Visual FoxPro 6.0的类
各种窗口、菜单栏、单选按钮、复选框等在面向
对象的设计中都称之, 对象, 。 Visual FoxPro 6.0对这
些常用的对象提供了丰富的基本类(基类)供用户直接
使用。根据实际需要对它们进行相应的改造以形成, 子
类, 或者直接形成, 对象,,以提高开发者的工作效率。
二、容器与控件
Visual FoxPro 6.0的基类共分为两个大类:容器类
和非容器类。
1,容器类
容器类可以包含其他对象,并且允许访问这些对象 。
表 8-1列出了每种容器类所能包含的对象 。
目录
上页
下页
退出
11
容器 包含的对象
命令按钮组 命令按钮
容器 任意控件
自定义 任意控件、页框、容器和自定义对象
表单集 表单、工具栏
表单 页框、任意控件、容 器或自定义对象
表格列 表头和除表单集、表单、工具栏、计时器和其它列以外的任一对象
表格 表格列
选项按钮组 选项按钮
页框 页面
页面 任意控件、容器和自定义对象
项目 文件、服务程序
工具栏 任意控件、页框和容器
表 8-1 容器类所能包含的对象
目录
上页
下页
退出
12
2,控件类
控件类的封装比容器类更为严密, 但也因此损失了
一些灵活性, 控件类中不能包含其他类, 最典型的就是
命令按钮 。
3,容器中各对象的引用
在进行容器类, 子类, 或, 对象, 的设计时,往往
要引用容器中某一个特定对象,这就要掌握面向对象的
标识方法。
(1)容器类中对象的层次
容器中的对象仍然可以是一个容器, 一般把一个
,对象, 的直接容器称为, 父容器,, 不能将一个对象
的间接容器错误地视为, 父容器, 。 图 8-1表示了可能
的一种容器类嵌套的状况 。
目录
上页
下页
退出
13
图 8-1 容器类的嵌套
(2 )对象使用局域名
每个对象都有一个名字,在给对象命名时,只要保
证同一个, 父容器, 下的各个对象不重名,即对象使用
的是局域名,因此不能单独使用对象名来引用对象,对
象引用的一般格式是:
目录
上页
下页
退出
14
Object1.Object2.…
Object1,Object2是对象的名字, 其中左边 Object1
是右边 Object2的, 父容器,, 这种格式所表示的是最
后一个对象的名字, 中间用小园点 (,) 分隔 。
如图 8-1中列容器中的控件名可以表示为:
Formset.Form.PageFrame.Page.Grid.Column.Cmd1
(3)几个代词的用法
代词 意义
This 表示对象本身
Parent 表示对象的“父容器”
ThisForm 表示对象所在的表单
ThisFormset 表示对象所在表单所属表单集
说明,这些代词只能在方法代码或事件代码中使用。
目录
上页
下页
退出
15
【例 8-1】 基于 Visual FoxPro的 FORM类生成一个对象,然
后访问该对象的一些属性和方法。
Oform=CREATEOBJECT("Form") &&生成一个空白表单
Oform.show &&显示表单
Oform.caption=”演示, &&修改表单的标题
?, 这是一个生成对象的演示程序, &&在表单上输出字符

Oform.release
【例 8-2】 如果 Form1中有一个命令按钮组 commandgroup1,
该命令按钮组有两个命令按钮,command1 和 command2,
label1是表单 form1上的一个标签控件。
目录
上页
下页
退出
16
如果要在命令按钮 command1的事件 ( 如单击事
件 ) 代码中修改该按钮的标题可用下列命令:
this.caption=”确定,
如果要在命令按钮 command1的事件代码中修改命令
按钮 command2的标题可用下列命令:
thisform.Commandgroup1.command2.caption=
"取消 "
或者
this.parent.command2.caption="取消 "
但不能写成下列命令:
thisform.command2.caption="取消 "
如果要在命令按钮 command1的事件代码中修改表单
的标题可用下列命令:
This.Parent.parent.Caption=”测试窗口,
或者 thisform.caption=”测试窗口,
目录
上页
下页
退出
17
二,Visual FoxPro 6.0中的事件与方法
1,Visual FoxPro 6.0中的事件
在面向对象程序设计中,,事件, 是对象触发的行
为描述,,事件, 是预先定义的动作,由用户或者系统
激活。一个事件有一个事件名,一个事件与一个事件响
应程序(方法程序)相关联,当作用在一个对象上的事
件发生时,与这个事件相关联的程序就获得一次运行。
每种对象所能识别的事件是固定的, 开发者只能为
指定的事件指定响应程序, 不能为对象添加新的事件,
对象的事件只能从其父类中继承 。
表 8-4中列出了 Visual FoxPro 6.0核心事件集。
目录
上页
下页
退出
18
事件 事件被激发后的动作
Init 创建对象
Destroy 从内存中释放对象
Click 用户使用鼠标主按钮单击对象
DblClick 用户使用鼠标主按钮双击对象
RightClick 用户使用鼠标辅按钮单击对象
GotFocus
对象获得焦点,由用户动作引起,如按 T ab 键或单击鼠标主按钮
,或者在代码中使用 S etF o cu s 方 法程序
LostFocus
对象失去焦点,由用户动作引起,如按 T ab 键或单击鼠标主按钮,
或者在代码中使用 S etF o cu s 方法程序使焦点移到新的对象上,
KeyPress 用户按下或释放键
MouseDown 当鼠标指针停在一个对象上时,用户按下鼠标按钮
MouseMove 用户在对象上移动鼠标
MouseUp 当鼠标指针停在一个对象上时,用户释放鼠标按钮
Valid
事后验证事件,当对象失去焦点前如果验证表达式的值为假 (,F, ),则
焦点离不开该对象
When
事前验证事件,当对象获得焦点前,如果验证表达式的值为假 (.F, ),则
该对象不能获得焦点
表 8-2 Visual FoxPro 6.0核心事件集
目录
上页
下页
退出
19
2,对象对事件的反应
当作用在对象上的一个事件发生时, 若没有与之相
关的代码, 则不会发生任何操作 。 开发者只需对少数几
个要用到的事件设计响应程序 。
事件的响应程序一般是一个过程,用事件的名称来
命名。系统对事件的响应有先后顺序 。
3,方法程序的层次
为对象编写事件代码时, 注意两条基本原则:
(1)容器不处理与所包含的对象相关联的事件。
例如:一个命令按钮位于表单上,当用户单击命令按
钮时,只会触发命令按钮的 Click事件,不会触发表
单的 Click事件。
目录
上页
下页
退出
20
(2)若没有与某对象相关联的事件代码,则 Visual
FoxPro在该对象所在的类的层次结构中逐层向上检查
是否有与此事件相关联的代码。若找到则执行此代码。
4.事件驱动模型
( 1)事件是面向对象方法中驱动程序的引擎。
( 2)事件的触发与停止。
事件的触发分为用户操作触发和在程序运行过程
中触发两种方式。典型的用户操作触发事件有用户单
击鼠标时触发 Click事件。程序运行过程中触发事件
表示在程序运行过程中自动触发,例如某对象的 Iint
事件,是在对象创建时程序自动触发。通常让程序允
许事件触发使用 READ EVENTS命令。如果不允许事件
触发可以使用 CLEAR EVENTS命令。
目录
上页
下页
退出
21
第三节 类与对象的程序化设计方法
1,用程序方法设计类
创建类的语法基本框架:
DEFINE CLASS ClassName1 AS ParentClass [OLEPUBLIC]
[[PROTECTED | HIDDEN PropertyName1,PropertyName2,..]
[Object.]PropertyName = eExpression,..]
[ADD OBJECT [PROTECTED] ObjectName AS ClassName2 [NOINIT]
[WITH cPropertylist]]...
[[PROTECTED | HIDDEN] FUNCTION | PROCEDURE Name[_ACCESS |
_ASSIGN]
[NODEFAULT]
cStatements
[ENDFUNC | ENDPROC]]...
ENDDEFINE
其中,用大写的字母组成的单词是保留字,而用小写字母组成的
单词是参数。语句中各参数的含义如下:
目录
上页
下页
退出
22
(1) ClassName1,要创建的, 类, 的名字。
(2) ParentClass,要创建的, 类, 的, 父类,,
ParentClass既可以是, 基类,,也可以是开发者自己
创建的的其它, 子类, 。
(3) PropertyName1,PropertyName2 …,列举该类中要保
护或隐含的的属性名称。
(4) ObjectName,如果创建的是一个容器对象,这个子句
指出该容器中所含的其它对象,这个参数是所加入的对
象的名字。
(5) ClassName2,加入的对象 ObjectName的, 父类, 的名

(6) Cpropertylist,创建类的属性名。
(7) Name,创建类中的过程或函数名。
(8) Cstatements,类中响应各事件的方法程序或函数。
目录
上页
下页
退出
23
实例,
DEFINE CLASS test AS FORM &&定义一个子类 Test,它的基类是 Form
ADD OBJECT text1 AS TEXTBOX
&&在子类 Test中增加一个文本框对象 text1
PROCEDURE text1.KeyPress &&对象 text1的 KeyPress方法程序
PARAMETERS nKeyCode,nShiftAltCtrl
NODEFAULT &&不执行父类 TEXTBOX中的相应代码
IF BETWEEN(nKeyCode,65,122) && 在 'A' 和 'z' 之间
This.Value = ALLTRIM(This.Value) + "*"
ACTIVATE SCREEN && 将输出发送到 Visual FoxPro主窗口中
CHR(nKeyCode)
ENDIF
ENDPROC
PROCEDURE Destroy &&从内存中释放时
CLEAR EVENTS &&不允许触发事件
ENDPROC
目录
上页
下页
退出
24
2,用程序方法设计对象
设计好了一个类,则可在此基础上创建该类的对象。
( 1)由类创建对象
创建对象就是在内存中建立一个变量。对象变量(简
称为对象)只有在创建后才能使用,使用命令方式创建
对象的一般格式是:
ObjectName=CreateObject("ClassName" )
功能,在内存中创建一个对象
例如, FrmForm1 = CreateObject ("FORM")
&&用基类 FORM创建一个对象 FromForm1
FrmTest=FrmTest = CreateObject("Test")
&&上面一条命令成立的前提是我们已在前面的例子
中已经创建了一个 Test的类
目录
上页
下页
退出
25
( 2)对象的属性设置
对象创建以后就可以对它的属性进行设置和修改 。
设置和修改属性的语句格式是:
格式 1:
Parent.Object.Property=Value
格式 2:
WITH <对象名 >
属性名 1=属性值 1
属性名 2=属性值 2
……
属性名 n=属性值 n
ENDWITH
要同时设置一个对象的多个属性时,用第二种方法
更加方便快捷。
目录
上页
下页
退出
26
( 3) 对象方法程序的调用
调用对象的方法程序的语法如下:
Parent.Object.Method
例如:要调用显示 frmform1表单对象的 Show()方法, 则
代码形式如下:
FrmForm1.Show()
( 4) 对象变量的的分类
与普通变量一样,对象变量也有全局变量、局部变
量和私有变量之分,其对应的说明符也是 PUBLIC、
LOCAL,PRIVATE。 局部变量和私有变量都随着创建对象
的程序结束而自动释放,而全局变量则会留存在内存中
直到用显式的命令释放对象。
( 5)对象变量的释放
Release <对象名 >
目录
上页
下页
退出
27
( 6)在容器对象中添加对象
在容器对象已经创建后,要在容器对象中添加
对象应使用 AddObject()方法,格式是,
<容器对象名 >.AddObject(<对象名 >,<类名 >,[<参
数 1>,<参数 2>…… ])
该方法在已经建立的容器对象中加入一个由
类名派生的对象,对象就成为容器的一个成员。
目录
上页
下页
退出
28
第四节 类和对象可视化设计方法
一, 用类设计器设计类的一般步骤
1,进入类设计器
有两种方法可以进入类设计器。
( 1)在系统菜单栏中单击, 文件, 菜单中的, 新建, 命
令,在, 新建, 对话框中指定文件类型是, 类,,
单击, 新建 文件, 按钮。
( 2)已经进入项目管理器,就可以在项目管理器中,选
择, 类, 选项卡,并单击, 新建, 命令按钮。
两者都将进入一个统一的界面(如图 8-2所示)
目录
上页
下页
退出
29
图 8-2 新建类对话框
2,指定子类的名称, 父类和存储类的文件名 。
图 8-2中有 3个文本框中的内容需要设计者根据设
计确定相应信息:
( 1)类名:每一个类都有一个名称,只要按照一般的
命名规则给子类取一个名字即可( cdm_test)。
目录
上页
下页
退出
30
图 8-3 派生于其他子类对话框
( 2)派生于:指定子类的, 父类, 。由下拉列表框中可
选 择相应的 Visual FoxPro中的基类 (CommandGroup)
就 可以了。如果需要用一个非基类的类作为子类的
,父 类,,可以单击派生于后面的命令按钮 进入
图 8-3 所示的对话框进一步选择。该对话框的左半
部分用于 选择, 父类, 所在的文件,右半部分选择
,父类, 。
目录
上页
下页
退出
31
( 3)存储于:指定子类的存储文件 (默认扩展名,vcx,),
所指定的文件可以存在,也可以不存在。当指定了一个
已经存在的类文件时,Visual FoxPro把新建的类加入该
文件,否则,Visual FoxPro建立一个新的类文件。一般
我们都是将相关的类存储于一个文件中,很少将每一个
类单独用一个文件存储。这个文本框后的命令按钮 也
是用于选择子类存储文件。如图 8-4所示。
图 8-4 子类存储对话框
目录
上页
下页
退出
32
完成以上操作后,已经设计出了一个子类,该类与
其, 父类, 具有相同的属性和事件代码,也可以理解为
是父类的一个拷贝,如图 8-5所示。
图 8-5 类设计器窗口
目录
上页
下页
退出
33
3.子类属性设置
( 1)修改子类的属性
新设计的类 cmd_test继承了其父类 CommandGroup全部的属性,
要重新设置 cmd_test的属性值,需进入属性设置窗口 (见图 8-6)。
方法是:将鼠标移到 cmd_test上并单击右键,在弹出的快捷键中
选择, 属性, 。或在系统菜单栏中,选择, 显示, 菜单中的
,属性, 选项。
图 8-6 子类的属性设置容器
目录
上页
下页
退出
34
属性 可 从, 父类, 那里获得继承值。这里只设置
ButtonCount为 4。
最常见的属性有:
Name, 描述类的名称。
Caption,类的标题。
FontName:类所用字体。
FontSize:类所用字号 。
(2) 添加新属性
当子类为了某个特殊的需要, 还可以在子类
中添加新的属性 。
方法是:选择, 类, 菜单中, 新建属性, 选项,
在 出现的 界面中,指定要添加的属性名称,并单
击, 添加, 按钮,完成新属性的添加工作 。
目录
上页
下页
退出
35
4,代码设计
代码设计是类设计工作中的关键,进入类代码设计
窗口的常用方法有两种:
( 1)双击类的图形。
( 2)在类上单击鼠标右键,在弹出的快捷菜单中选择
,代 码, 。
两种方法都会出现图 8-7所示的界面。
图 8-7 代码设计窗口
目录
上页
下页
退出
36
操作方法:
( 1)在, 对象, 列表框中指定为哪个对象设计代
码。
( 2)在, 过程, 列表框中指定为所选对象设计哪
个事件或 方法设计代码。大窗口是代码设计
窗口,在这里设计 类方法程序。图 8-7所示的
就是为对象 Command1的 Click过程设计的代码。
目录
上页
下页
退出
37
二、类浏览器的基本操作
1,类浏览器
要启动类浏览器可采用两种方法:
( 1)从, 工具, 菜单栏中选取, 类浏览器, 选项。
( 2)在命令窗口输入命令,DO( _BROWSER)
两者都弹出一个如图 8-8所示的窗口。
图 8-8 类浏览器窗口
目录
上页
下页
退出
38
2,类浏览器的常用基本操作
( 1)创建新类或删除类
下面用创建 Cmd_test的子类 Cmd_test1为例来演示, 类
浏览器, 的基本操作 。
①首先用上述两种方法之一进入类浏览器。
②单击(打开按钮) 进入, 打开, 对话框,选择确定要
操作的类库。
③ 选中类库中 Cmd_test类, 再单击 (新类按钮 ) 打开, 新
建类, 对话框 。
④在, 新建类, 对话框中, 类名, 一栏中输入要新建的子
类名, Cmd_test_1”,再单击, 确定, 按钮,就进入了类
设计器。, Cmd_test_1”的设计过程从略,设计完毕后
如图 8-9所示 。
目录
上页
下页
退出
39
图 8-9 类浏览器窗口
( 2)删除类或类库:
① 先选取该类或类库。
② 单击右键,选择快捷菜单中的, 移去, 按钮,系统
将 所选取的类或类库删除。
目录
上页
下页
退出
40
( 3) 利用类浏览器查看类基类和父类 。
( 4) 查看类定义代码 。
在类浏览器窗口中,选择要查看的类,然后单击查 看
类代码按钮,弹出如图 8-10所示的类定义代码窗口 。
图 8-10 类代码浏览窗口
41