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