1、,面向对象的程序设计,第七章,Visual FoxPro,第七章 面向对象的程序设计,面向对象程序设计(简称OOP)技术最近几年在计算机领域得到了迅猛发展,它是程序设计方法的一场革命。与传统的结构化程序设计(面向过程程序设计)相比,它具有许多优点,其中最主要的是,面向对象程序设计是按照人类认识世界的方法和思路方式来解决问题。面向对象程序设计试图使程序设计环境适合于现实世界的问题,而不是象过程程序设计所要求的使现实世界的问题适合于程序设计语言。,. 面向对象程序设计与过程化程序设计的比较,. 过程化(结构化)程序设计及其优缺点结构化程序设计的设计方法,是将程序结构按功能划分成若干基本模块,这些模
2、块形成一个树形结构,自顶向下,逐步求精。程序设计时,使各模块之间的关系相对紧密。每一模块内部均由顺序、选择、和循环三种基本结构组成,其模块化实现的具体方法是使用了过程(子程序)。这样,一个较复杂的系统按功能分解成许多易于控制和处理的子系统、子任务,这些子系统、子任务都是可独立编程实现的子程序模块,而这些子程序均由分级的用户界面菜单实现调用。,结构化程序设计的优缺点,在大型软件系统设计中,由于软件系统本身的复杂性,要求必须许多人通力合作,采用工程化的方法进行开发和管理,这也对程序设计语言和程序设计方法提出了更高的要求。通过使用结构化程序设计方法,可以对整个任务进行清晰严格的划分,使每个程序员能明
3、确了解自己的工作任务以及与他人的接口。每个程序员可以独立地设计调试自己负责的模块,最终各模块也能够顺利地集成到整个系统中去。结构化程序设计方法,由于模块之间逻辑结构清晰,功能相对独立,满足了大型软件系统易维护性和可读性的要求。因此,结构化程序设计能够较好地满足大型软件系统的设计要求,是现代软件工程的基础。,结构化程序设计的优缺点,尽管结构化程序设计具有许多优点,但它仍然是一种面向数据和过程的设计方法,它把数据和过程分离为相互独立的实体。 程序员在编程时必须要时刻考虑所要处理的数据格式,对于不同的数据格式,即使要做同样的处理或对相同的数据格式要做不同的处理,都需要编写不同的程序,因此重用性不够好
4、。另一方面,当数据和过程相互独立时,总存在用错误的数据调用正确程序模块,或用正确的数据调用错误程序模块的可能性。因此,要使数据与程序始终保持相容等问题,结构化程序设计方法本身是无法解决的,这可借助于新一代设计方法面向对象的程序设计方法。,. 面向对象程序设计及其优越性,面向对象程序设计将数据及对数据的操作融为一体,作为一个相互依存、不可分割的整体来处理。它采用数据抽象和信息隐藏技术,将对象及对象的操作抽象成一种新的数据类型类,并且考虑到不同对象之间的联系和对象类的重用性。面向对象程序设计所追求的目标是将现实世界的问题求解尽可能简单化,采用符合人类处理问题的思维方式。它用“对象”表现事物,用“事
5、件”表示处理事物的动作,用“方法”表现处理事物的过程,用“消息”传递对象与对象之间的相互联系。,. 面向对象程序设计及其优越性,面向对象程序设计时,不再是单纯地从代码的第一行一直编写到最后一行,而是考虑如何创建对象,利用对象来简化程序设计,并提供代码的可重用性。同时面向对象程序设计也吸取了结构化程序设计的优点。 面向对象程序设计,可以支持先进的软件开发策略:编写可重用代码,编写可维护的代码,共享代码,优化已有的代码等。 有了高质量的可重用代码就能有效地降低软件的复杂性,提高软件开发效率。开发者在设计软件时可以利用一些已经精心设计好并且经过测试的代码,这些可重用的代码被组织和存放在程序设计环境的
6、类库中,使以后程序设计过程变得更简单。,. 面向对象程序设计及其优越性,面向对象程序设计方法具有模块化、信息封装与隐藏、抽象性、继承性、多态性等特点,它又解决了大型软件系统设计与管理中所需的软件可靠性、可重用性、可扩充性、可维护性及提高开发效率等问题。因此,面向对象程序设计能够更好地支持大型软件系统的开发。Visual FoxPro不但仍然支持标准的结构化程序设计,而且在语言上还进行了扩展,提供了面向对象程序设计的强大功能和更大灵活性。,面向对象程序设计的概念,. 面向对象程序设计的基本概念,面向对象技术为软件开发提供了一种新的思想,引入了许多新的概念,这些概念是理解和使用面向对象技术的基础和
7、关键。. 对象(Object)现实世界的实体事、物、概念等,都统称为对象。在面向对象系统中一切成分都是对象,大到整个系统、项目、数据库、表、表单,小到窗口、控件都被视为对象。对象是一个逻辑实体,它包括数据和完成处理所需要的程序代码,是数据和代码的组合。,. 对象,在VFP中称对象的特征和数据为“属性”,称由对象识别的一个动作为“事件”,称在对象上完成的操作过程为“方法”。定义了对象的属性、事件和方法就决定对象的外观和它的动作。因此,对象是属性、事件和方法的集合体,用户通过属性、事件和方法来处理对象。例如,一个按钮就是一个对象。按钮的名称、位置、大小、和颜色都是按钮对象的“属性”;用鼠标点击按钮
8、就产生按钮的Click(单击对象)“事件”,并驱动该事件的代码程序。如果程序中关闭数据表,并调用Release“方法”程序,该方法将关闭释放当前表单。,. 对象,综上所述,我们可以把对象理解为:对象是一个封装了属性、事件和方法的实体,对对象的操作是通过对象的属性、事件和方法来完成。属性描述了对象的状态、特征;事件是由对象识别的动作,一个事件产生后会触发相关联的代码,每个对象都有特定的事件;在事件代码中可以调用方法程序,方法程序也可以被别的方法程序调用。,. 类,“类”源于日常生活中类别、分类概念。同类实体具有相同的属性和行为特征。类是对一组相似对象的共同抽象描述,它将该组对象所具有的共同特征集
9、中起来,用于说明该组对象的性质和能力。可以看出,“类”是将相同属性和行为特征的对象,提取共同属性和特征而产生的,是对象抽象化的结果,是对象的兰图和框架。而“对象”是类的具体实例,它是将类所描述的共同特征赋予具体实体而形成的。因此,类与对象既有区别,又有联系,两者关系十分紧密。所有对象的属性、事件和方法都是在定义类时被指定,由于类是定义了对象特征、外观和行为的模板,所以对象由类生成,生成的对象也自然具有相同的属性、事件和方法。例如,由复选框类、单选按钮类可以生成各种形式的复选框、单选按钮。,. 面向对象程序设计的特性,与结构化程序设计相比,面向对象程序设计有许多突出特性,即抽象性、封装性、继承性
10、和多态性。抽象性一般而言,抽象是对复杂的实体的简明表示,它强调了我们所关心的或认为重要的信息,而将不重要的信息予以忽略。例,我们对电话的认识已经抽象化了,拨号、讲话、听音这就是我们印象中的电话,而不关心和了解电话内部的线路和工作原理。,面向对象程序设计的特性 抽象性,面向对象程序设计利用抽象性,提取一个类或对象与众不同的特征,而不对该类或对象的所有信息进行类和容器的层次结构处理,抽象性能够忽略对象的内部细节,隐藏不必要的复杂性。例如,在创建一个表浏览窗口类时,窗口中有一系列定位表记录指针的按钮,我们可以把这些按钮作为一个整体进行抽象,而不必关心其中的单个组件,以及它们相互之间是如何作用的。,面
11、向对象程序设计的特性 封装性,封装实际上是一种信息隐藏技术,抽象性通过封装得以实现。封装就是指将对象的方法程序和属性代码包装在一起。封装将操作对象的内部复杂性与应用程序的其它部分隔离开来。例如,我们将电话的零部件和线路封装在电话的外壳里,这样使用户看不到电话内部线路的复杂性,只专心拨号、讲话、听音,从而也产生用户对电话具有拨号、讲话、听音功能这种抽象化的认识。,面向对象程序设计的特性 继承性,例如,由基本类型的电话(拨号、讲话、听音功能),可以派生出电话传真机、移动电话、公用投币电话等,这些电话都继承了电话基本类型的拨号、讲话、听音功能,又添加了各自的独特功能。由于有了继承性,当我们把基本类型
12、的电话由拨号改为按键,其它类型的电话都可以改为按键,继承性使我们不必研究每种电话如何实现按键。继承性即子类延用父类特征的能力。一个子类可以拥有其父类的全部功能,然后在此基础上,可以添加其他控件或功能。继承性体现了类层次中的“共享”机制。,面向对象程序设计的特性 继承性,由于有继承性,就可以使得在一个类上所做的改动反映到它的所有子类当中,若发现类中有一个小错误,用户不必逐一修改各子类的代码,只需要在父类中改动,然后这个变动将会体现在全部子类中。这种自动更新可节省用户的时间和精力。若类的层次具有多层,则这种继承性还具有传递作用,即下层的子类可继承其以上各层父类的全部功能。,面向对象程序设计的特性
13、多态性,例:F1 F12功能键,不同的软件环境对每一功能键有不同的功能定义。同是一键在不同的软件中就会产生不同的操作,这就是多态性。每个对象不可能只是单独工作,完成某一任务可能要某些对象通过协同工作来完成,一个对象可以请求或命令另一个对象完成某一操作。对象之间是通过“消息”传递实现相互联系。向某个对象发送消息,就是要求该对象执行一个操作。一个消息只说明接受者应该执行哪种操作,而不说明怎样去执行这个操作,操作的具体执行由消息接受者确定。,面向对象程序设计的特性 多态性,所谓多态性是指同一个消息可以根据接收消息的对象不同采用不同的操作。也就说,当不同的对象收到相同的消息时将产生不同的操作。例如VF
14、P中的加“+”运算符,不仅可以进行数值相加,而且可以进行字符串相加。这完全取决于表达式中加法运算符“+”所操作的对象的数据类型。,. VFP中的基类,基类是系统内部已定义好的基本类,用户可以利用这些基类创建自己的对象,或派生出子类。下面给出VFP的基类:复选框、组合框、命令按钮、控件、自定义、编辑框、表头、图象、标签、线条、列表框、绑定型控件、容器控件、形状、微调、文本框、容器、表单集、表单、表格、列、页框、页面、工具栏、选项按钮组、命令按钮组、选项组、分隔符等。,VFP 中的基类,由基类可以创建对象,对象将继承该类的功能。每一个对象都会对特定事件作出响应,对一些最小事件(基本事件)的响应,各
15、类是共同的。事件 是一种预先定义好的特定动作,它由对象来识别。用户可以编写程序码对相应的动作进行响应。事件可以由操作者的一个动作产生,如单击鼠标或按下一个键;也可以由程序代码或系统产生。,VFP基类的最小事件集,每个基类都可能有各自的区别于其它基类的属性、事件或方法,但VFP基类都至少包含以下三个事件和四个属性。VFP的基类有以下最小事件集所有基类都具有的事件组成的集合,包含这三个事件:Init (初始): 当对象创建时激活。Destroy(破坏): 当对象从内存中释放时激活。Error (错误): 当类中的事件或方法发生错误时激活。,VFP基类的最小属性,VFP的基类都有各自属性,但还有最小
16、属性(最基本属性),所有基类至少包含以下四个属性:Class(类): 该类对象属于何类,返回派生对象的类名称。BaseClass(基类): 该类是由何基类派生而来,指定被引用对象的基类的类名。例如Form(表单),CommandButton(命令按钮)或TextBox(文本框)。ClassLibrary(类库): 该类从属于哪个类库,指定用户自定义类库的文件名。ParentClass(父类): 返回对象所属于的父类名。 若该类直接由VFP基类派生而来,则ParentClass属性值与BaseClass属性值相同,即父类为基类。,. 容器类和控件类,VFP的基类有两大主要类型,容器类和控件类。因
17、此VFP的对象也可分为这两大类型。容器类容器类中可以包含其他对象,这些对象可以是容器类对象,也可以是控制类对象,并允许访问这些对象。例如,若创建一个含有两个列表框和两个命令按钮对象的容器类,而后将该类作为一个对象加入到表单中。这样在设计时还可以对其中的任何一个列表框或命令按钮对象进行调整,如可以改变列表框的位置,可以给命令按钮加注标题。 此外,还可以在容器中添加新的对象,如可以给列表框加标签来标明列表框。容器类提供了一种将多个对象按需要进行组合的功能。容器类中的对象还可以是容器类的,这就形成了容器类对象的嵌套,因此容器类是允许有层次的。,容器类,VFP每个容器类所能包含的对象种类是有一定限制:
18、(容器所能够包含的对象)命令按钮组:命令按钮容器:任意控件 控件:任意控件自定义:任意控件、页框、容器和自定义对象表单集:表单、工具栏表单:页框、任意控件、容器或自定义对象表格列:表头和除表单集、表单、工具栏、计时 器和其他列以外的其余任一对象。表格:表格列 选项按钮组:选项按钮项目:文件、服务程序 页框:页面 页面:任意控件、容器和自定义对象 工具栏:任意控件、页框和容器,控制类,控制类也可以包含其他对象,这些对象在设计和运行时是作为一个整体对待进行修改或操作,而不能单独对其中的个别对象进行修改或操作。也就是说,控制类中的对象不能是容器类对象,只能是最基本的对象,不能再分隔为几个其它对象。容
19、器类与控制类的根本区别在于,容器类可以按层次访问容器类中的对象;而控制类的对象都是同一层的对象,不能再包含下一层对象。,. 扩展基类,用户可以对VFP的基类进行扩展,创建派生出满足自己需要的子类。在创建子类后,可以设置自己的默认控件属性(如显示的标题、文本颜色、背景颜色等)例如,我们可以由表单或表单集基类,创建具有自定义外观和方法的表单类,用它作为创建所有表单的模板。,扩展基类,除了由基类派生子类以外,还可以在基类的基础上,创建具有封装功能的控件。例如,假设需要一个按钮,在单击该钮时释放退出该表单。可以在命令按钮类的基础上创建一个类,将它的Caption 标题属性设置为 “退出”;并在按钮的C
20、lick事件(鼠标指针点击控件,此事件发生)的过程代码中添加 “THISFORM.Release” 方法(从内存中释放表单),这样就可以将这个新按钮作为控件对象添加到应用程序的任何表单中。另外,子类可以不限于由单个基类派生,可以基于多个基类创建新子类,可以在一个类的定义中添加多个控件类。,. 处理类和对象,我们知道“类”是将相同属性和行为特征的对象,提取共同属性和特征而产生的;“对象”是类的具体实例。同一类对象的属性、事件和方法都在定义类时被确定,而每一个由具体类创建的对象,除了继承了类的属性、事件和方法外,还需要定义自己独特的属性、事件和方法。在类设计器中创建类时,可以设置类的属性、事件和方
21、法。在表单设计器设计表单时引用类创建表单中的对象时,同时设置对象的属性、事件和方法。对类和对象设置属性、事件和方法是类似的。,.类和容器的层次结构,类分为容器类和控制类,对象分为容器对象和控制对象。容器类和容器对象(容器)都可以包含容器类对象和控制类对象。由此看来容器类和容器(对象)都具有嵌套层次,具有层次结构。但是类的层次结构和容器的层次结构是VFP中两个独立的范畴,因此他们的性质不尽相同。而它们在事件处理机制方面是完全不同的。,类和容器的层次结构,由于类具有继承性,在类层次结构中,若设有与控制相关联的事件、方法代码(程序),会按子类、父类逐层向上查找与事件相关联的事件方法代码,找到后则执行
22、。在容器层次结构中,各对象在创建时来自不同的类,而这些类之间不存在“子类”与“父类”之间的继承关系。因此容器的事件方法代码与他所包含的对象事件代码是相互独立无关的。所以在容器层次结构中,不具有逐层向上查找相关联事件方法代码的事件处理机制。,. 在容器层次结构中引用对象,对于容器中的对象,要处理它需要知道它相对于容器层次结构中的层次关系。在引用某个对象时,就需要标识出该对象在容器层次结构中的层次。如同在文件目录结构中,要访问一个文件就要标识出访问该文件的路径。VFP中引用对象可以有两种方式:绝对引用和相对引用。,在容器层次结构中引用对象,对象绝对引用 对象绝对引用是通过提供对象完整的容器层次来引
23、用对象。 例如:在嵌套的容器中,使命令按钮1(Command1)可用,使命令按钮2(Command2)禁用,可以通过设置命令按钮的Enabled属性来实现。 FormsetFormPageFrame. Page .Command1. Enabled=.T.(表单集表单页框页. 命令按钮Enabled=.T.) FormsetFormPageFrame. Page .Command2. Enabled=.F.(Enabled属性指定对象能否响应用户引发的事件,允许在运行时将对象设置启用(.T.)或被禁止(.F.)状态),对象相对引用,对象相对引用是通过使用一些属性和关键字,可以直接从对象某层次中
24、引用对象。对象相对引用时,要表示出从哪一级对象开始引用对象,使用的属性和关键字含义如下:Parent(父属性):引用该对象的所在直接容器的属性、方法或控制。THIS : 引用该对象本身(直接由对象本身开始引用)。THISFORM : 引用包含该对象的表单(由包含该对象的表单开始引用)。THISFORMSET : 引用包含该对象的表单集(由由包含该对象的表单集开始引用)。,对象相对引用,用于相对引用的属性和关键字,在容器层次结构中表示某个层次,其引用关系为: THISFORMSETTHISFORMTHISProperty (表单集表单对象属性) ParentObjectProperty (Par
25、ent对象属性)例如: THISFORMCommand1. Caption=”确定” 通过Caption属性设置命令按钮Command1的标题。而Command1是包含在表单中。 THISFORMSET.Form1.Command1. Caption=”确定” 设置表单集中Form1表单里的Command1命令按钮的标题属性。,. 设置属性,对象的属性既可以在设计对象时设置,也可以在程序运行时重新设置。 在设计对象时,通过属性窗口可以直接设置属性值,并且立即作用于对象。 在设计对象时可以设计对象某事件的代码程序,并在代码程序中也可以设置对象属性的代码。这样在运行时,当该事件发生后触发其代码程序
26、,将对对象属性重新设置。在运行时可以设置并可读取属性值的属性称“读写属性”;而在运行时只能读取属性值的属性称“只读属性”。用户在编程时可以将属性值赋给变量,也可以直接参与表达式运算等。,设置属性,设置属性值的语法是: ContainerObjectProperty=Value (即:容器对象属性值)例:(见:演示图片表单.SCX) THISFORMImage1Visible=.T. & 设置表单中的图像1可见 THISFORMImage2Visible=.F. & 设置表单中的图像2不可见 THISFORMBackcolor=7388700 &设置表单的背景颜色,设置属性,在属性设置时,可能要
27、为一个对象设置多个属性,或者为同一容器中的多个对象设置属性,都要给出相同的层次结构中的从属关系(类似路径)。为此VFP 提供了WITH ENDWITH,结构语句,简化了设置多个对象、多个属性的过程。例: WITH THISFORMSETForm1 .Image1Visible=.T. .Image2Visible=.F. .Backcolor=RGB(255,255,0) ENDWITH,. 调用对象方法,一个对象当识别到一个事件发生后,会对该事件作出响应,通过执行该事件的代码程序或调用方法程序实现某种操作。 例如,当用鼠标单击命令按钮时,触发命令按钮的Click事件,随即执行Click事件对
28、应的代码程序。一个对象有各种属性、事件和方法,VFP为各种对象的各种属性、事件和方法定义了默认的属性和代码程序(过程),用户不需要再一一全部进行定义。但是对象的关键属性、事件和方法需要用户根据需要在设计时定义它的属性值和过程,如果没有指定相关事件的属性值和处理程序,当事件发生时,该对象并不对事件产生反应。,调用对象方法,调用对象方法的语法: Object.Method 即,这里对象引用同样可以绝对引用或相对引用。 例:THISFORMBox(100,150) & Box方法在表单中画一个矩形THISFORMRefresh & Refresh方法刷新表单有些方法可以返回值,方法名后要有园括号。如
29、果方法要使用多个参数,要把这些参放到方法名后的园括号内,并用逗号将它们分开。 语法是:Parent. Object.Method( ),. 响应事件,当事件发生时,该事件的代码程序(过程代码)就将被执行,这是对事件的响应。对于控件类对象,它们能够识别的事件是固定的,用户不能用程序设计方法再产生其它事件,但是可以设计和调用与这些事件相关的过程代码。,响应事件,例如:对表单中标题为“确认”的命令按钮为其Click事件添加如下过程代码: SELECT RSDA APPENA BLANK REPLACE RSDA.姓名 WITH THISFORM. TxtName.Vaule THISFORM.Rel
30、ease & 调用从内存中释放表单方法程序这样,当用户单击该“确认”命令按钮时,将用TxtName文本框的Vaule属性值替换表的姓名字段,然后释放表单。,响应事件,事件的触发方式 事件有两种触发方式 第一种,是用户的干预触发事件,如点击鼠标,可以产生Click(单击)、DoubleClick(双击)、MouseMove(移动到)、DragDrop(托放)等事件,按键可以产生KeyPress(按键)事件,这是用户实际操作的情况。 另外,用户还可以通过MOUSE、KEYBOARD和ERROR命令来模拟鼠标、键盘操作和模拟错误,产生相应的事件。,事件的触发方式,MOUSE命令产生Click(单击)
31、、DoubleClick(双击)、MouseMove(移动到)、DragDrop(按键)事件, KEYBOARD命令产生KeyPress(按键)事件, ERROR 命令产生Error(错误)事件。第二种事件触发方式是VFP系统自动产生事件,这类事件占VFP事件的绝大部分。 例如,当创建对象时,都会自动产生Init(初始)事件;释放对象时,都会自动产生Destroy (释放)事件等。,响应事件,事件触发顺序 对于一个对象可以触发多个事件,而且事件触发也有先后顺序。了解事件的触发顺序,并为不同事件编写出相应的关联代码,是很重要的。 对于表单事件的顺序是Load(装载)、Init(初始)、Show(
32、显示)、Activate(激活)、GotFocus(得到焦点)。 表单被释放时的事件顺序是LostFocus(失去焦点)、Dcactivate(失去活动)、Destroy(破坏)、Unload(卸载)。,响应事件,容器层次中的事件处理在容器层次中,容器不处理所包含的控件相关联的事件,也就是容器事件的过程代码与控件过程代码相互独立。 例如,当用户单击表单上的命令按钮时,表单的Click事件不会发生,只有命令按钮的Click事件发生。当事件发生时,只有与事件相关联的最里层对象识别事件,较高层的容器不识别该事件。容器事件与控制事件是相互独立的。,响应事件,类层次中的事件处理当表单的控制对象(控件)基
33、于用户自定义类,在控件的一个事件发生时,若此事件有相关联的代码,则立即执行;否则在类层次中向上一层搜索事件代码,找到了就执行。若在类层次中一直未找到,即使在容器层次中有相关事件的过程代码,但是不属于该对象所属类链上的事件代码,也不会执行。在一个对象或子类的事件过程代码中,可以使用作用域操作符(:)调用一个父类的方法。,类层次中的事件处理,语法: : 即, : “:”操作符用来从子类方法内部执行父类方法。在创建子类时,由于类的继承性使子类自动从父类那里继承方法。在使用“:”操作符时,既能运行子类中的附加代码,又可执行父类的过程代码。否则,若没有使用“:”操作符调用父类代码,只会执行子类中定义的过
34、程代码。它阻止了父类属性、事件、方法继承性的传递。,响应事件,设计调试中对事件过程跟踪VFP为面向对象设计提供了方便的调试手段。在对象的运行过程中,通过对事件的跟踪,为设计和调试事件过程代码提供了依据。在VFP工具菜单中的调试器项里,可以通过事件跟踪来实现。每当类及对象相关联的事件发生时,事件跟踪都会把它们记录下来,帮助用户调试过程代码。在事件跟踪对话框中,选择开启事件跟踪选项,当事件追踪表中所列出的事件发生时,将记录在调试器输出窗口或指定文件中。,. 类的设计和使用,. 类的创建创建类可以有三种方法:()在项目管理器中选择类选项页,并选择项目管理器的新建按钮;()从系统文件菜单中选择新建命令
35、,再选择“类”,然后单击新建文件按钮;()在命令方式中使用CREATE CLASS命令。,类的创建,以上三种方式均弹出新建类对话框,在“类名”中输入新建类的名称;在“派生于”中选择新建的类派生于哪个基类或自定义类;在“存储于”文本框中输入一个文件名,表示将该类存储于哪个类库文件中(.VCX及.VCT) (和其它VFP文件一样,VFP的类库文件也是以.DBF文件格式存放信息)。可以将新建的类存储在已存在的类库文件中。最后按确定按钮进入类设计器进行类的设计。,类的创建,设计类时还可以为该类新建多个属性和新建方法程序。这些属性和方法属于类,而不属于类中的单个组件。 在系统的类菜单中选择新建属性项,为
36、该类新建属性。在新建属性对话框中,从“名称”文本框中输入新属性的名称;在“可视性”列表框中选择属性的类型。 其中“公共”选项表示属性既可以被子类继承,也可以被对象实例访问;“保护”选项表示属性不能被对象实例访问,只能被该类定义的方法程序或该类的子类所访问;“隐藏”表示属性只能被该类定义的成员(对象)访问,该类的子类也无法访问。 按添加按钮就将新属性加到当前类中。,类的创建,在系统类菜单选择新建方法程序选项后,可以在新建方法程序对话框中为类创建新的方法程序,同时可以指定该方法的“可视性”。在系统类菜单选择编辑属性/方法程序选项后,可以编辑该类所有属性和方法程序。,. 类的修改,在创建类之后,可以
37、对类进行修改,可以增加类的功能或修改类的错误。 对类的修改将被所派生的子类继承,并将影响基于该类的所有对象。在项目管理器中选中要修改的类,然扣单击修改按钮,将打开类设计器进行修改 。也可以用MODIFY CLASS命令打开类设计器。 注意,如果类已经被其它方法程序使用,不应该修改类的Name属性,否则可能找不到这个类。,. 使用自定义类,当要使用用户自定义类时,可以从项目管理器中将该类拖到类设计器或表单设计器中,可像使用标准操作一样地使用它们。如果将一个表单类拖到表单设计器创建新表单时,这就形成在表单中创建表单,这是不允许的,将提示是否建一个表单集存放这两个表单。这时可以先建表单集,再把原表单
38、删除。,. 创建可视类,如果用户所创建的新类基于控件类或容器类,则可以向它添加控件成为可视类。在类设计器中可以创建容器类和控制类,并添加多个控件来定义该类。在类设计器中可以设计调整每个对象的外观,使得类的组件很容易设计和维护。可视类用在表单中可以实现各种操作,以及输入、输出的作用。在类设计器还可以创建非可视类。,. 类浏览器,类是面向对象程序设计的基础,VFP除了提供了类设计器以外,还提供了另一个类的辅助设计工具类浏览器。 使用类浏览器可以帮助我们完成以下工作: (1) 浏览类库。显示类库或表单中的类和表,显示类属性和方法。查看、 使用和管理类及其用户定义的组件。 (2) 设计和管理应用程序组
39、件。 (3) 打开一个或多个类库文件,并在类库文件中查看类之间的层次关系。 类浏览器是一个可独立运行的程序,它有自己的窗口、界面、工具栏和快捷菜单,可以辅助用户完成类的查看和编辑等多种功能。,. 类浏览器简介,启动类浏览器启动类浏览器的方法:()单击工具菜单中的类浏览器项。()单击程序菜单中的运行菜单项,然后在打开对话框中选择“Browser”程序,并单击“运行”按钮。 ()在命令方式中使用 DO BROWESER命令。类浏览器窗口的组成类浏览器窗口由工具栏、类型框、类图标、类列表、成员列表、类说明框和成员说明框等组成。,类浏览器窗口的组成,()工具栏:包含多个类浏览器按钮,执行类浏览器命令。
40、打开打开一个已经存在的类库或表单。查看附加的文件 向类列表中添加其他类库或表单。查看类代码 显示选定类的代码。新类 打开新建类对话框,创建基于所选定类或某个已存在类的子类。重命名 更改选定类的名称、属性和方法程序。重定义更改选定类的父类。删除 删除选定的类。清除类库 彻底删除类库文件。,类浏览器窗口的组成,()类列表:以大纲形式显示包含在类库(.VCX)或表单(.SCX)中的类及子类。类名左边若有“”符号,表示其父类位于当前类列表中但未显示。查看父类可选择快捷菜单的选择父类,双击类名可启动类设计器对类进行修改。,类浏览器窗口的组成,()类型框在类型框的下拉列表中显示基类,允许选定或输入一个类的
41、类型来筛选类列表。同时也表示类浏览器当前筛选所选定的内容。类型框中可以输入单个筛选条件,也可以由逗号分隔多个筛选条件,筛选条件中允许包含通配符“*”和“?”用以表示筛选的类名。,类浏览器简介,()类图标代表所选的类,可以将图标拖到VFP主窗口,来创建基于该类的对象,一个用户定义的位图可以作为图标。()成员列表:显示从“类”列表中选定的类或表单的用户自定义属性和方法程序。类浏览器快捷菜单在类浏览器窗口上单击鼠标右键,可打开快捷菜单。,. 使用类浏览器管理类,利用类浏览器查看类定义的代码选择要查看的类,并选择工具栏查看类代码按钮。出现类代码只读浏览窗口。可以通编辑菜单的某些命令进行操作,但无法对类
42、进行修改。为类库添加一个子类可以采用以下步骤:()在类浏览器中打开类库;()选择要派生该子类的类,然后选择工具栏中的新类按钮;()在新建类对话框中,输入新子类名;()在类浏览器中定义该子类,然后保存;()类浏览器会显示出新子类。,使用类浏览器管理类,把类从一个类库复制到另一类库中ADD CLASS命令可以复制类,类浏览器也可复制类,步骤如下:()在类浏览器中,打开源类库;()从系统工具菜单中再打开一个类浏览器窗口,并选择目标库文件;()在源类库中选择要复制的类,用鼠标把类图标拖到目标库中的类库图标上或某个类图标上;()在打开的对话框中,选择“是”则移类,选择“否”可以复制类,选择“取消”防止对每个库进行修改。,使用类浏览器管理类,删除类、类库或表单在类列表中选择要删除的类、类库或表单,然后选择“删除”按钮。对类的删除来说,是在类库文件该类的记录上标注删除标记。 若再选择“清除类库”按钮,则将标有删除标记的类从磁盘中彻底删除。,使用类浏览器管理类,更改一个类的父类通过类浏览器工具栏中的“重定义”按钮,可以更改一个类的父类。具体步骤:()在类浏览器中打开类库;()在类列表中选择要重定义的类,然后选择重定义按钮;()在重定义对话框的“为”框中,输入新父类名。新父类与原父类必须是来源于同一基类。()在“基于”框中,选择或输入类库文件名。,