Visual FoxPro
1
i s u a l
F
V
o x P r o
Visual FoxPro
2
10.1 面向对象的概念
10.2 Visual FoxPro的面向对象支持
10.3 面向对象的程序设计方法
Visual FoxPro
3
10.1.1 对象与类
在 面 向 对 象 程 序 设 计 ( Object Oriented
Programming,简称为 OOP) 中, 对象 ( Object)
是组成程序的构件, 就好象在面向过程的结构化程
序设计方法 ( Structured Programming) 中的子程
序和函数的作用一样 。 在结构化程序设计方法中,
程序设计人员把一个待求解的问题自顶向下进行分
解, 以便形成一个个相对简单独立的子问题, 然后
用子程序或函数来解决这些子问题, 用子程序或函
数之间的数据通信来模拟这些子问题间的联系, 最
后把这些子程序或函数装配起来以形成解决问题的
完整程序 。
10.1 面向对象的概念
Visual FoxPro
4
在面向对象的程序设计方法中,程序设计人员不
是完全按过程对求解问题进行分解,而是按照
面向对象的观点来描述问题、分解问题,最后
选择一种支持面向对象方法的程序语言来解决
问题。在这种方法中,设计人员直接用一种称
之为“对象”的程序构件来描述客观问题中
“实体”,并用“对象”间的消息来模拟实体
间的联系,用“类”来模拟这些实体间的共性。
Visual FoxPro
5
1.对象 ( Object)
在 OOP方法中, 作为程序构件的, 对象, 是对现实世
界中一个实体的一种模拟工具 。 例如如要设计一个
某高校学生学籍管理软件, 所涉及到的实体包括
,学生,,, 课程,,, 专业, 等等 。 要模拟一个
活生生的学生, 需要使用一组特征数据 ( 如姓名,
籍贯, 性别, 身高, 年龄等等 ) 和一组行为规则
( 如该生对待某些外部事件的反映:受到表彰会怎
样反映, 受到批评会怎样反映, 受到屈辱会怎样反
映, 遇到同学的困难时会怎样反映等 ) 来模拟其静
态特征和动态特征 。
Visual FoxPro
6
OOP方法正是用一组称为“属性”的数据模拟所
描述实体(如学生)的静态特征、而用一组称为
“方法程序”的程序过程模拟该实体对一些“事
件”(如受到学校嘉奖)的反映。把模拟一个实
体的“属性”数据和“方法程序”通过一定的形
式进行“封装”就建立起了一个 OOP方法中的
对象。
当然,如果对被管理的成千上万个学生都这样一个
个完全独立地设计“程序对象”,其工作量将会
大得惊人,这实际上是不可能的。 OOP方法中,
通过另一种称为“类”的工具对这一问题给出了
一个巧妙的解决办法。
Visual FoxPro
7
2.类 ( Class)
,类, 是具有相同属性特征和行为规则的多个, 对象,
的一种统一描述 。 对于一个学校的全体学生, 描述
其特征的数据模式是相同的 ( 当然不同, 对象, 的
特征值会有不同 ) 。 行为规则有不同的地方, 也有
相同的地方 。 如果我们侧重于描述每个个体对一些
诸如观看球赛, 对待他人遇到意外事件的反映等等,
不同个体间的反映可能很不相同, 描述其反映的
,方法程序, 也许无法共享 。 但如果将行为的选择
加以一些限制, 将引起学生反映的外部事件归纳为:
Visual FoxPro
8
( 1) 一个新学年度到来时, 学生的整体反映应该是
缴费报导 。
( 2) 当一个学年度不及格科目超过学校规定时, 这
一部分学生应该留级或退学 。
( 3) 完成规定科目的学习并考试合格者, 学生的整
体反映是毕业离校 。
在一般管理信息系统中, 系统的使用者和设计者所关
心的问题正是这样一些共性问题而并非一些很个体
的问题, 这样设计者就可以对个体的行为进行分析,
归纳, 抽象, 形成整个群体的共同行为规范, 并把
这种共同的行为规范用程序设计语言描述成程序过
程, 和描述该群体的特征数据模式一起进行封装,
这样就完成了 OOP方法中一个, 类, 的设计 。
Visual FoxPro
9
在 OOP方法中,, 类, 是对现实世界的一种高度
抽象与概括, 而, 对象, 则是, 类, 的一个实例,
,对象, 一定具有其属, 类, 的共同特征与行为规则,
当然一个, 对象, 还可以具有其属, 类, 未曾规定的
特征和行为规则 。 这一点和现实生活是非常相同的,
这样的模拟和抽象比较符合人们的思维习惯, 这也正
是 OOP方法具有强大生命力, 能够获得越来越多的软
件工作者欢迎并得到众多计算机开发商支持的一个基
本原因 。
总之, 从程序设计者的角度观察,, 类, 是一个数
据模式和若干个程序过程 ( 称为, 方法程序,, 一般
一种行为用一个程序过程描述 ) 经封装而形成的一个
整体, 它是使用信息技术对现实世界的一种模拟与抽
象, 而, 对象, 则是, 类, 的一个实例, 用程序设计
语言来说,, 对象, 可以不精确的理解为对一个, 类,
赋值的结果 。, 对象, 是 OOP方法中组成程序一种构
件 。
Visual FoxPro
10
3.
,事件, 是由外部实体作用在, 对象, 上的一个动作 。
在现实生活中, 某人出生, 死亡, 其电话震铃, 设
定的闹钟响了以及过生日又长了一岁等等都称为一
个事件, 人们都会对这些事件做出一定的反映:如
电话震铃就要接听电话, 设定的闹钟响了可能就要
去干一件什么事情, 而过生日后可能要入学了等等 。在 OOP方法中, 作用在, 对象, 上的事件包括对象
的创立, 释放, 收到其他对象发来的, 消息, 等,
对于一些可视对象, 如命令按钮等, 其最常见的
,事件, 往往是一些鼠标动作, 如, 单击,,, 双
击,,, 拖放, 或修改对象数据等等 。 当作用在对
象上的某个设定, 事件, 发生时, 与该事件相联系
的, 方法程序, ( 当然假设对象的设计者设计了该
程序并与对象一同封装 ) 就运行并完成该程序的功
能 。 OOP就用这种机制来模拟对象对外部事件的反
映并进而完成由外部事件序列所规定的功能 。
Visual FoxPro
11
4.事件代码与方法代码
事件代码与方法代码都是定义在某个对象中的一个程
序过程, 有时也把两者统称为方法代码 。 但狭义地
说:事件代码可以由一个, 事件, 触发运行, 其过
程名与事件名相同, 而一般方法程序没有一个与之
对应的事件触发, 必须靠其他程序调用才能得以运
行 。 因为不能为对象建立新的事件, 所以一个对象
包含的事件代码是一定的, 不能增加, 而一个对象
中所包含的方法代码是可以任意增加的, 就象在一
个程序中可以使用任意多个过程和函数一样 。
Visual FoxPro
12
10.1.2 子类与继承
既然, 类, 是 OOP方法中对现实世界进行模拟与抽象
的一种工具, 而现实世界中的类是分层次的, 有大
类, 中类, 小类之分, 如人类是地球上所有人的总
属类, 在这个大的属类中, 按肤色可进一步分为黄
种人, 白种人, 黑种人等, 不同肤色的人除具有人
类这样一些共同的特征外, 还具有某个肤色的人种
所独有的特征, 在对人类进行研究时, 如果不注意
这些不同的特征, 研究就难以深入 。 OOP方法中,
用, 子类, 来模拟现实世界中的类的层次问题 。
Visual FoxPro
13
如果设计一个“类” CLASS_STUDENT来模拟华中大学
全体学生组成的集合后,还可以以 CLASS_STUDENT
类为基础来设计一个“子类”
CLASS_STUDENT_COMPUTER来模拟华中大学计
算机系的学生。从现实生活中说,华中大学计算机系
的学生应该具有其属类华中大学的学生的全部特征和
行为规则,同时还具有这个系的学生独有的东西,在
OOP方法中正是完全模拟了这一点,以
CLASS_STUDENT“类”为基础建立的“子类”
CLASS_STUDENT_COMPUTER会完全继承
CLASS_STUDENT“类”的全部数据模式和“方法程
序”,并且可以对这些数据模式和方法程序进行修改。
这里,“类” STUDENT_COMPUTER称为
“类” CLASS_COMPUTER的“子类”,而
CLASS_COMPUTER称为
CLASS_STUDENT_COMPUTER“父类”。在 OOP方
法中,“子类”将继承其“父类”的全部特征和方法
程序,当然,在“子类”中可以对这些继承的特征和
方法程序进行修改以对该“子类”进行更准确的模拟。
Visual FoxPro
14
注意, 在上面反复说, 子类, 继承其, 父类, 的全部
特征模式和方法程序而不说成拷贝其, 父类, 的特
征和方法程序是因为这样一个事实, 当对, 父类,
进行修改后, 这种修改会立即反映到所有以该, 父
类, 为基础而建立的全部, 子类, 中, 不管这些
,子类, 是在, 父类, 修改前还是修改后建立的 。
,子类, 对, 父类, 的继承如此, 以一个, 类, 为基
础建立的, 对象, 对所属, 类, 的继承也是如此 。
Visual FoxPro
15
如前所述, 当建立了, 父类, CLASS_STUDENT和
其, 子类, CLASS_STUDENT_COMPUTER后,
如果要建立一个, 对象, Object_Student来模拟计
算机系的某个学生, 可以用两种不同的方法来实现:
(1) 以 CLASS_STUDEN,类, 为 基 础 建 立, 对
象, Object_Student。
(2)以 CLASS_STUDENT_COMPUTER“类, 为基础建
立, 对象, Object_Student。
从前面的分析中读者很容易判断, 第二种方法建立的
对象 Object_Student应该对计算机系的学生有更准
确更完整的模拟 。
Visual FoxPro
16
10.2.1 Visual FoxPro 6.0 的类
如前所述, 组成 OOP程序的基本构件是, 对象,,
而对象是由, 类, 派生的, 因此, 把一个待求解问
题进行分析, 归纳, 抽象, 进而用, 类, 这种工具
对问题模拟, 并采用程序设计语言来完成, 类, 的
设计就是 OOP方法的一项重要工作 。 为方便从事应
用开发的软件设计人员, 一般支持 OOP方法的计算
机语言都提供了丰富的基本类 ( 称为基类 ) 供用户
直接使用 。 开发人员可以根据这些基类而派生自己
的子类以对具体问题进行更准确的模拟, 也可以直
接根据基类而派生, 对象, 。 图 10.1给出了 Visual
FoxPro 6.0中为用户提供的基类 。 在第 11章会详细
说明这些, 基类, 的作用和用法 。
10.2 Visual FoxPro6.0对面向对象方法的支持
Visual FoxPro
17
图 10.1
Visual FoxPro
18
现代应用系统一般都采用微软公司推荐的 Windows 界
面, 界面上面是菜单栏, 用户可以方便地选择所需要的功
能;主窗口是数据交互窗口, 用来输入问题的状态信息,
报告问题的处理结果;而在主窗口下面或右侧一般是一组
命令按钮, 供用户指示应用系统的操作步骤;为方便用户
的数据录入, 有时还有一些单选按钮, 复选框, 微调按钮
等等 。 在 OOP 方法中, 这些都被称为, 对象,, 而
Visual FoxPro 6.0 为这些应用系统常用的对象提供了相应
的模板 ——“基类,, 当应用系统的开发者对于这些, 基
类, 进行了足够的了解后, 就能在自己的开发工作中方便
自如地使用它们, 根据应用需求对它们进行改造 ( 这里的
,改造, 并不是修改 Visual FoxPro 6.0系统中所带的这些
,基类,, 而是根据这些, 基类, 派生, 子类,, 即进行
,子类, 的设计工作 ) 后形成, 子类, 或直接形成, 对
象,, 可以极大地提高开发工作效率, 增加系统的可靠性 。
Visual FoxPro
19
也许觉得应用这些, 基类, 难于模拟现实生活中
的一些客观事物的状态与行为特征, 如怎样模拟一
个学生的基本状态 ( 如姓名, 年龄, 专业等 ) 和其
主要行为特征 ( 注册, 登录课程成绩, 毕业离校
等 ) 。 实际上, 进行这些具体事物的模拟是要用
Visual FoxPro 6.0所提供的, 基类, 进行有效地组
合才能实现的, 学生的基本状态是用一组数据来描
述的, 设计者可以使用 Visual FoxPro 6.0 中所提供
的表格, 类, 或一组文本框, 类, 来模拟这组状态,
而针对学生的, 注册,,, 成绩登录, 和, 毕业离
校, 的每项工作可以用命令按钮类来模拟, 把这些
文本框 ( 或表格 ) 和一组命令按钮包装到一个根据
Visual FoxPro 6.0的, 基类, 表单或容器而派生的
,子类, 中, 就完成了模拟学生这一群体的子类设
计工作
Visual FoxPro
20
10.2.2 容器与控件
1,容器类
容器类可以包含其他对象, 并且允许访问这些对象 。
例如, 若创建一个含有两个列表框和两个命令按钮
的容器类, 而后将该类的一个对象加入表单中, 那
么无论在设计时刻还是在运行时刻, 都可以对该容
器中任何一个对象进行单独操作 。 不仅可以改变列
表框的位置和命令按钮的标题, 也可以在设计阶段
给这个容器添加新对象 。 例如, 可以给列表框加标
签, 来标明该列表框 。
Visual FoxPro
21
2.控件类
控件类的封装比容器类更为严密, 但也因此丧失了一
些灵活性 。 控件类没有 AddObject 方法程序 。 在该
,类, 中不能包含其他类, 最典型的控件类就是命
令按钮 。 容器类虽然在引用时可以视为一个整体,
但无论是在设计阶段还是在运行阶段, 其所包含的
对象都是可以识别并可以单独操作的 。
Visual FoxPro
22
容器类和控件类的比较
Visual FoxPro
23
3.容器中各对象的调用
在进行容器类, 子类, 或, 对象, 的设计时, 往往要
调用容器中某一特定对象, 这就要掌握 OOP方法中
对象的标识方法 。
(1)
容器中的对象仍然可以是一个容器, 一般把一个, 对
象, 的直接容器称为, 父容器,, 在调用特定的对
象时, 搞清该对象的, 父容器, 是至关重要的, 不
能把一个对象的间接容器错误地视为其, 父容器, 。
Visual FoxPro
24
(2)
每个对象都有一个名字 。 在给对象命名时, 只要保证
同一个, 父容器, 下的各对象不重名即可, 换句话
说, 对象使用的是局域名, 因此不能单独使用对象
名来调用对象,
Object1.Object2......
Object1, Object2 是 对 象 名 字, 其中 Object1 是
Object2 的, 父容器,, 这种格式所表示的是
Object2 而非 Object1,,对象, 与其, 父容器, 间
用一个小数点 (,) 分隔 。
Visual FoxPro
25
(3)
在进行对象调用时, 有几个经常使用的代词, 应理解
其含义并能熟练应用 。
This表示对象本身
Parent表示对象的, 父容器, 对象
ThisForm表示对象所在的表单
ThisFormSet表示对象所在的表单所属的表单集
Visual FoxPro
26
10.2.3 事件与方法
1,OOP方法中的事件
如前所述, 在 OOP方法中,, 事件, 是驱动蕴涵
在对象中的程序的的引擎, 一个事件有一个事件名,
一个事件与一个事件响应程序 ( 方法程序 ) 相关联,
当作用在一个对象上的事件发生时, 与这个事件相
关联的程序就获得一次运行 。
在一种程序设计语言中, 每种对象所能识别的事
件是固定的, 也就是说, 开发者不能自己规定一个
对象不能识别的事件并设计一段与该事件相联系的
程序, 这样即算该事件发生了, 由于对象不能识别,
因而也就无法触发程序并使之运行 。
Visual FoxPro
27
2.OOP方法中对象对事件的反映
当作用在对象上的一个事件发生时, 若没有与之相关
联的代码, 则不会发生任何操作 。 对于绝大多数事
件, 开发者都不必编写代码, 实际上只需对少数几
个系统中要用到的事件设计响应程序即可 。
事件的响应程序过程一般是一个过程, 用事件的名称
来命名 。
一段事件响应代码应置于何处, 是由事件发生的顺序
决定的 。 请注意:
表单中所有对象的 Init 事件将在表单的 Init 事件之前
执行, 所以在表单显示以前, 就可在表单的 Init 事
件代码中处理表单上的任意一个对象 。
Visual FoxPro
28
若要在列表框, 组合框或复选框的值改变时执行
某代码, 可将它编写在 InteractiveChange 事件 ( 不
是 Click 事件 ) 中, 因为一般而言, 对象的值的改变
并不触发对象的 Click 事件, 有时对象的值没改变,
而 Click 事件却会发生 。
当拖动一对象时, 系统将忽略其他鼠标事件 。 例
如, 在拖放操作中 MouseUp 和 MouseMove 事件不
会发生 。
Valid 和 When 事件有返回值, 默认为, 真,
(,T.) 。 若从 When 事件返回, 假, (.F.) 或 0,对
象将不能被激活 。 若从 Valid 事件返回, 假, (.F.) 或
0,不能将焦点从对象上移走 。
Visual FoxPro
29
3.方法程序的层次
( 1) 容器事件和对象事件
为对象编写事件代码时, 应注意以下两条基本规则:
① 容器不处理与所包含的对象相关联的事件 。
② 若没有与某对象相关联的事件代码, 则 Visual
FoxPro 在该对象所在类的层次结构中逐层向上检查
是否有与此事件相关联的代码 。
当用户以任意一种方式 ( 使用 Tab 键, 单击鼠标, 将
鼠标指针移至对象上等 ) 与对象交互时, 对象事件
被触发 。 每个对象只接收自己的事件 。 例如, 尽管
命令按钮位于表单上, 当用户单击命令按钮时, 不
会触发表单的 Click 事件, 只触发命令按钮的 Click
事件 。
Visual FoxPro
30
容器事件代码与其所包含的对象事件代码相互独立 。
若没有与命令按钮相关联的 Click 事件代码, 尽管有
与表单相关联的 Click 事件代码, 当用户单击按钮
时, 也不会执行与表单相关联的 Click 事件代码 。
这条规则也适用于表格控件 。 表格包含列, 列又包含
标头和文本框 。 当事件发生时, 只有与事件相关联
的最底层对象识别该事件, 高层的容器不识别这个
事件 。 图 10.6说明当用户在表格上移动鼠标时, 哪
个对象处理这个 MouseMove 事件
Visual FoxPro
31
表格对象上的事件
Visual FoxPro
32
这条规则对于按钮组对象或命令组对象有一个例外 。
如果为选项按钮组或命令按钮组编写了某事件代码,
而组中个别对象没有与该事件相关联的代码, 当这
个对象上的事件发生时, 将执行容器组的事件代码 。
例如, 有一个选项按钮组, 在它的 Click 事件中包含
了相关的代码, 而在选项按钮组的两个选项按钮中
只有 Option1 按钮拥有与 Click 事件相关联的代码 。
当用户单击 Option1 时, 与其相关联的 Click 事件代
码被执行, 不执行与按钮组相关联的 Click 事件代
码 。 而用户单击 Option2,因为没有与其相关联的
Click 事件代码, 系统将执行选项按钮组的事件代
码 。
Visual FoxPro
33
包含两个对象的选项按钮组
Visual FoxPro
34
当连续发生一系列事件时 ( 比如 MouseDown 事件后
面接着发生 MouseUp 事件 ), 若起始事件与某个
控件相关联, 那么整个事件队列都将属于这个控件 。
例如, 在一个命令按钮上, 按下鼠标主按扭并拖动鼠
标指针离开命令按钮, 尽管鼠标指针可能已在表单
上, 这个命令按钮的 MouseMove 事件还是不断产
生 。 当在表单上而不是在命令按钮上释放鼠标主按
扭时, 发生的 MouseUp 事件是与命令按钮相关联,
而不是与表单相关联 。
Visual FoxPro
35
( 2)
前面所讲的编写事件代码的第二条原则实际上是
讲的对象对其, 父类, 或, 父类, 的, 父类,
的事件代码继承问题,
若某个对象基于一个用户子类 ( 同样地, 这个类
本身也可能基于其他用户子类 ), 当一个事件
在该对象上发生时, Visual FoxPro 首先在该对
象中查看是否有与此事件相关联的代码 。 若找
到, 则执行它;否则, Visual FoxPro 将在类层
次中向上逐层检查 。 无论 Visual FoxPro 在类层
次的哪个地方找到该事件代码, 都执行它, 而
该层以上的代码将不会被执行 。
Visual FoxPro
36
按继承关系寻找对象的事件代码
Visual FoxPro
37
应该清楚,当某事件在一个对象上发生后, Visual
FoxPro只是从该对象开始向上寻找到与该对象的继
承关系最近的类的事件代码执行, 这意味着, 当为
某一个子类或对象设计一个事件响应程序后, 该对
象 ( 或子类 ) 的, 父类, 上原来定义的相应代码将
变得无效, 永远没有执行机会 。 如果只希望在原来
的代码中增加一些功能, 则必须在自定义代码中插
DODEFAULT( )
该语句表示执行执行原代码功能 。
Visual FoxPro
38
10.3 面向对象的程序设计方法
10.3.1 类的设计
1.用程序方法设计类
可以象设计其他程序一样在 。 prg程序文件中设计开
发者自己的, 子类,,
DEFINE CLASS ClassName1 AS ParentClass
\[OLEPUBLIC\]
\[\[PROTECTED | HIDDEN PropertyName1,
PropertyName2,..\]
\[Object.\]PropertyName = eExpression,..\]
\[ADD OBJECT \[PROTECTED\] ObjectName AS
ClassName2 \[NOINIT\]
Visual FoxPro
39
\[WITH cPropertylist\]\]...
\[\[PROTECTED | HIDDEN\] FUNCTION |
PROCEDURE Name\[_ACCESS | _ASSIGN\]
\[NODEFAULT\]
cStatements
\[ENDFUNC | ENDPROC\]\]...
ENDDEFINE
其中,用大写字母组成的单词是保留字,而用小写字
ClassName1:
ParentClass, 要创建的“类”的“父类”,即要创
建的类是由哪个“类”派生的,ParentClass既可以
是 Visuan FoxPro 中的一个“基类”,也可以是开发
Visual FoxPro
40
PropertyName1,PropertyName2:列举该类中要保护
或隐含的属性名称 。
ObjectName:如果创建的是一个容器对象, 这个子句
指出该容器中所含的其他对象, 该参数即是所加入
的对象名 。
ClassName2:加入的对象 ObjectName的, 父类, 名
称 。
CPropertylist:创建类的属性名 。
Name
CStatements:类中响应各种事件的方法程序或函数 。
Visual FoxPro
41
下面的程序定义了一个表单类 test,并在 test中加入了
一个文本框对象 text1,为 text1定义了一个响应按键
事件的方法程序 text1.KeyPress,为表单 test定义了
一个响应释放事件的程序 Destroy。 在该程序过程中,
没有描述表单 test 和其中的文本框 text1的属性, 也
没有说明这两个对象响应其他事件的方法, 由于
,子类, 对其, 父类, 的继承性, 实际上, 表单类
test具有一般表单的全部属性, 其中的文本框对象
也具有一般文本框的全部属性, 而且, 对于没有定
义响应程序的事件, 它们的反映方法和一般的表单
及文本框完全相同 。 这正是 OOP方法带给设计者的
好处, 只需要描述自己的不同之处, 一般的相同之
处全部由继承性获得 。
Visual FoxPro
42
DEFINE CLASS test AS FORM && 定义 Form 类的一个子类 Test
ADD OBJECT text1 AS TEXTBOX && 为 Test加入一个文本框对
象 Text1
PROCEDURE text1.KeyPress
KG*2PARAMETERS nKeyCode,nShiftAltCtrl
KG*2NODEFAULT
KG*2IF BETWEEN(nKeyCode,65,122) && 在 ′A′ 和 ′z′
This.Value = ALLTRIM(This.Value) + ″*″
ACTIVATE SCREEN && 将输出发送到 Visual FoxPro 主窗口
CHR(nKeyCode)
KG*2ENDIF
ENDPROC
KG*2PROCEDURE Destroy
KG*2CLEAR EVENTS
KG*2ENDPROC
ENDDEFINE
Visual FoxPro
43
2.用可视法方法设计类
(1)进入 Visual FoxPro
有两种方法可以进入类设计器 。
第一种方法,直接在菜单栏中进行操作, 点击, 文件,
菜单中的, 新建,, 指定文件类型为, 类, 。
第二种方法,需要使用 Visual FoxPro提供的另一个工
具, 项目管理器,, 如果已经进入了项目管理器并
建立了一个项目文件后, 就可在项目管理器中, 选
择, 类, 选项卡, 并单击, 新建, 命令按钮 。
Visual FoxPro
44
指定子类的有关信息
Visual FoxPro
45
为子类选择“父类”
新设计的类
Visual FoxPro
46
(2)
(3)


有时需要添加新的属性, 方法是, 在 Visual Fox Pro
的菜单栏中, 选择, 类, 菜单中, 新建属性, 选项,
在出现的中, 指定要添加的属性名称, 并单击, 添
加, 按钮, 就完成的新属性的添加工作, 往后就可
以如前面说明的一样设置该属性了 。
Visual FoxPro
47
选择要设置属性的类
在这里设置属性值
在这里选择属性
属性选项卡, 下面只出现与
选项相关的属性
属性意义说明
设置类的属性
Visual FoxPro
48
(4)
代码设计是类设计工作的关键, 进入类的代码设计窗

② 在类上单击鼠标辅按扭, 在弹出窗口选择, 代码,
Visual FoxPro
49
为类添加新属性
Visual FoxPro
50
10.3.2 对象的设计
对象是类的一个实例, 这种实例在不同位置含义不完
全相同, 所赋予的操作命令也有所不同, 例如在一
般程序中的对象, 实际上是某个类的一个变量, 而
在容器类中添加的对象则是这个类的一个成员对象,
虽然都称为, 对象,, 但添加这两种不同含义的
,对象, 的命令有所不同, 但其含义又有很多相似
之处 。
Visual FoxPro
51
下面主要说明在程序中设计和使用对象的方法, 至于
用可视化的方法设计对象过程, 和类的设计过程基
本相同, 在下一章的表单设计与应用, 还会重点介
绍, 本章对此从略 。
1.创建与释放对象
( 1)
所谓创建对象, 就是在内存中建立一个内存变量 。 对
象只有创建后才能使用, 使用命令创建对象的一般
格式是:
<对象名 >=CreateObject(″类名 ″)
功能,在内存中建立一个对象 。
参数说明:
对象名,要建立的对象的名字 。
类名,要建立的对象的父类 。
Visual FoxPro
52
( 2) 对象变量的分类
和普通变量一样, 对象变量也有全局变量, 局部
变 量 和 私有 变 量之 分, 其 对 应的 说 明符 是:
PUBLIC,LOCAL,PRIVATE。 局部变量和私有
变量都随着创建对象的程序的结束而自动释放, 而
全局变量则会留存在内存中直到用显式的命令清除
对象 。 私有类型是对象变量的默认类型 。
( 3)
Release <对象名 >
Visual FoxPro
53
2,对象的属性设置
对象的属性可以在对象设计阶段设置, 也可以在
对象运行过程中进行修改 。 设置对象属性的语句格
<对象名,属性名 >=<属性值 >
WITH <对象名 >
属性名 1=属性值 1
..............
属性名 n=属性值 n
ENDWITH
Visual FoxPro
54
例 10.3 HTST 用面向对象的方法设计一个程序, 计算:
( 1) S=1+2+3+4+....+100
( 2) S=1+1/2+1/3+....+1/100
这个问题因为非常简单, 无需使用这里所讲的 OOP方
法就可以很快设计出传统的结构化程序, 而且, 就
本例而言, OOP方法比结构化设计方法要麻烦很多 。
这里只是希望通过一个简单的例子, 建立一个用
OOP方法设计程序的完整实例 。
Visual FoxPro
55
为 解 决 这 个 问 题, 本 例 中 设 计 了 一 个 子 类
Myadd_Class,它包含 3个属性和两个方法程序, 说
3
S
N
R1:求和方法标志, 当 R1=1时, 求整数和, 为其他
值,
S_sum
S_show:显示属性 S,即显示求和结果 。
点击查看程序请
Visual FoxPro
56
3.AddObject( ) 方法
在容器对象中添加对象应使用 AddObject( ) 方法,
格式是:
<容器对象名 >.AddObject(<对象名 >,<类名 >,\[,<参数
1>,<参数 2>...\])
功能,在已经建立的容器对象中加入一个由类名派生
的对象 。
Visual FoxPro
57
例 10.4 设计一个表单对象,并在表单上加入一个文
本框对象和一个命令按钮对象。
表单是 Visual FoxPro中最常用的一种对象,在下一章,
会详细说明怎样使用一种可视化的表单设计工具来
设计表单,如果使用可视化的方法来完成这个例题
会非常简单,但现在还是用纯粹的程序设计来解决
这个问题。
Visual FoxPro
58
** 建立一个表单对象, 表单中包含一个文本框和一个
MyForm=CreateOBject(′FORM′) && 建立一个表单
MyForm.Caption=′包含一个文本框和一个命令按钮
的示例表单 ′ &&
MyForm.AddObject(′文本框 ′,′TextBox′) && 加入一
MyForm.AddObject(′命令按钮 ′,′CommandButton′)
&&
Visual FoxPro
59
MyForm.文本框,Visible=.T,WB&& 设置文本
MyForm.文本框,Top=10DW&& 设置文本框距顶
MyForm.命令按钮,Visible=.T.
MyForm.命令按钮,Top=50
MyForm.Show(1)DW&&
Visual FoxPro
60
用程序建立的表单