
VFP第5章下面向对象程序设计.ppt
50页第5章对象模型对象模型和和事件模型事件模型9/9/20241苏州大学信息技术学院计算机工程系 徐云龙VFP支持两种开发模型:面向过程和面向对象支持两种开发模型:面向过程和面向对象结构化程序设计(面向过程)结构化程序设计(面向过程)–本质:功能设计(以功能为主进行设计)–方法:自顶向下、功能分解–优点:系统结构性强、便于设计和理解–缺点:但各模块间关系紧密,一旦功能需求变动导致维护困难6.1 面向对象的程序设计概述26.1.1 面向对象的程序设计方法(面向对象的程序设计方法(OOP))–方法:把世间万物都看成对象从内部结方法:把世间万物都看成对象从内部结构上模拟客观世界构上模拟客观世界–每个对象都有自己的属性和方法能对消每个对象都有自己的属性和方法能对消息做出反应息做出反应–程序就是一组对象,对象之间通过发送消程序就是一组对象,对象之间通过发送消息互相通知做什么息互相通知做什么6.1 面向对象的程序设计概述3面向过程和面向对象的区别区别:以计算机模拟猫捉老鼠的过程为例面向过程的做法: 程序员必须通过编程告诉计算机猫抓老鼠的每一个具体动作,如匍匐,加速,咬住等动作面向对象的做法: 程序员给猫发一个消息—“老鼠出现了” 。
猫就会自动去抓老鼠猫如何抓老鼠的动作还是得由程序员编码来实现,只不过代码的组织方式大不相同面向对象的方法更符合人的思维习惯6.1 面向对象的程序设计概述46.1.2 类和对象类和对象6.1.2 类和对象的区别类和对象的区别F类(CLASS,类型):定义了对象特征以及对象外观和行为的模板模板,它刻划了一组具有共同特性的对象F对象:是类的一个实例OOP中,程序由一个或多个类组成,在程序运行时视需要创建该类的各个对象(实例)F类是静态概念,对象是动态概念对象是基于某种类所创建的实例,包括了数据和过程例:猫可以定义为一个类,具有颜色,品种属性,具有 抓老鼠的方法 某个猫对象:白色波斯猫6.1 面向对象的程序设计概述51. 类类基类基类:VFP系统提供的内部定义的类,可提供给用户用于自定义类的基础(例如:表单、控件)子类子类:是以其它类定义为起点,为某一种对象所建立的新类子类将继承任何对父类所做的修改6.1 面向对象的程序设计概述6F对象(对象(Object))–每个对象都具有属性及与之相关的事件和方法6.1 面向对象的程序设计概述7F属性属性(Property) :: 定义对象的特征定义对象的特征-对象的属性由对象所基于的类决定-如猫的颜色,品种F方法方法(Method) ::是对象能够执行的一个操作是对象能够执行的一个操作–方法是与对象相关联的过程,也称方法程序–方法可由用户自己创建–例:SetColor()设置猫的颜色。
主人将它染发了)F事件事件(Event) ::对象可对该事件做出反应对象可对该事件做出反应–可编写相应的代码,对动作进行响应–事件可由用户的动作、程序代码或系统产生例:对于老鼠出现这个事件,猫能做出反应6.1 面向对象的程序设计概述86.2 6.2 基基 类类VFP基类派生子类子类子类96.2.1 VFP的基类的基类VFP提供的所有基类见p151 表5-1说明:该表中加*部分的类,只能使用,不能为它们创建子类基类可以分为容器类和控件类两种类型容器类,见表5-2,其余的都是控件类10基类的最小事件集(基类的最小事件集(重要重要))事 件说 明Init当对象创建时激活Destroy当对象从内存中释放时激活Error当类中的事件或方法程序运行中发生错误时激活激发顺序一般为:激发顺序一般为:Init Error Destroy11基类的最小属性集基类的最小属性集属性说明Class该类属于何种类型BaseclassBaseclass该类由何种基类派生而来(Form,commandbutton或custom等)Classlibrary该类从属于何种类库parentclassparentclass对象所基于的类。
若该类直接由VFP基类派生而来,则Parentclass属性值与baseclass属性值相同12F 容器类容器类(Container classes)是包容其他类的基类–容器可以包含其它对象–容器可以作为所包含的对象的父对象–允许访问包含的对象F 控件类控件类(Control classes)是可以包含在容器类中的基类–控件对象可以包含在容器中–不能作为其它对象的父对象F VFP的对象可分为容器对象容器对象和控件对控件对象象6.2.2 容器类与控件类容器类与控件类13F6.3.1 引用对象F6.3.2 设置对象的属性F6.3.3 调用对象的方法程序F6.3.4 对象对事件的响应6.3 处理对象处理对象146.3.1 引用对象引用对象F何时要引用对象何时要引用对象–当要设置或取得对象的某个属性的值时–当要执行对象的某个方法事件时F容器层次体系容器层次体系–容器与容器中的控件是上下层次的关系–一个应用程序的最高层次是 _screen或_VFP,最低层次是一个非容器类控件或是一个不包含任何控件的容器类控件–例如:_screen.caption=“我的表单”6.3 6.3 处理对象处理对象15层次体系示意图层次体系示意图表单集表单容器控件16表单集“表单集1”(该对象的Name属性为FormSet1)中包含2个表单“Form1”和“Form2”;表单“Form1”中包含2个文本框、1个选项按钮组、1个页框;页框中包含2个选项卡式页面Page1和Page2;页面“Page1”中包含1个表格“Grid1”;表格中包含2个列控件对象;列控件又包括标头和文本框控件。
17F绝对引用绝对引用–从容器的最高层次引用对象,给出对象的绝对地址从容器的最高层次引用对象,给出对象的绝对地址–例:引用表单例:引用表单Form1对象:对象:FormSet1.Form1 引用表格的第一列中的文本框引用表格的第一列中的文本框Text1对象:对象: FormSet1.Form1.Pageframe1.Page1.Grid1.Column1.Text1F相对引用相对引用–在容器层次中相对于某个容器层次的引用–相对引用通常运用于某个对象的事件处理代码或方法程序代码中,即在某个容器对象的事件处理代码或方法程序中对所包容的对象的引用,引用时可以直接使用其对象名–相对引用时,所涉及到的一些关键字(P153表5-5)F类似于文件系统中的绝对路径和相对路径类似于文件系统中的绝对路径和相对路径18关 键 字含 义ActiveFormActiveForm当前活动表单当前活动表单ActivePageActivePage当前活动表单中的活动页面当前活动表单中的活动页面ActiveControlActiveControl当前活动表单中具有当前活动表单中具有焦点焦点的控件的控件PARENTPARENT当前对象的直接容器当前对象的直接容器THISTHIS当前对象当前对象THISFORMTHISFORM包含当前对象的表单包含当前对象的表单THISFORMSETTHISFORMSET包含当前对象的表单集包含当前对象的表单集相对引用对象时所用的关键字(重要) 196.3.2 设置对象属性设置对象属性–每个对象都有属性,可以为对象设置属性–属性可以在设计时设置也可在运行时设置(如caption)–设计设计时修改属性在“属性”窗口中进行–程序代码程序代码中,用以下语法进行设置 对象名称 . 属性 = 值例:绝对引用FormSet1.Form1.Text1.Value=DATE()FormSet1.Form1.Text1.ForeColor=RGB(0,0,0)黑FormSet1.Form1.Text1.FontName=“黑体”20引用一个对象的多个属性和方法(引用一个对象的多个属性和方法(重要重要))如:with formset1.form1.text1 .Value=DATE() .ForeColor=RGB(0,0,0) .BackColor=RGB(192,192,192) .FontName=“黑体”endwith引用容器中的多个对象引用容器中的多个对象如:With Thisform.txtXh.backcolor=rgb(128,0,0).txtXm.backcolor=rgb(0,128,0)Endwith216.3.3 调用对象的方法程序调用对象的方法程序F方法程序是对象能够执行的一个操作,是和对象相联系的过程F调用语法<引用对象>.<方法程序>例1.释放表单:Thisform.release例2.显示表单Form1,并将焦点设置在文本框Text2上: FormSet1.Form1.show FormSet1.Form1.Text2.SetFocusF有返回值的方法程序以圆括号结尾有返回值的方法程序以圆括号结尾226.3.4 对象对事件的响应对象对事件的响应–事件是对对象识别的一个动作,可以编写相应的代码对此动作进行响应–用户不能用其他的程序设计方法产生其事件,但可以调用与这些事件相关的过程–常用的事件类u鼠标事件u键盘事件u表单事件u控件焦点事件u数据环境事件常用事件和方法的详细讲解留到设计表单时再讲。
常用事件和方法的详细讲解留到设计表单时再讲常用事件和方法的详细讲解留到设计表单时再讲常用事件和方法的详细讲解留到设计表单时再讲236.4 相关事件相关事件F核心事件集(表核心事件集(表5-6))6.4.1 核心事件核心事件 这些事件适用于大多数的对象(控件) 24表表6-6 核心事件集核心事件集事件事件被激发后的动作LoadLoad表单或表单集被加载到内存中表单或表单集被加载到内存中 UnloadUnload从内存中释放表单或表单集从内存中释放表单或表单集 InitInit创建对象创建对象DestroyDestroy从内存中释放对象从内存中释放对象 ClickClick用户使用主鼠标按钮单击对象用户使用主鼠标按钮单击对象 DblclickDblclick用户使用主鼠标按钮双击对象用户使用主鼠标按钮双击对象 RightclickRightclick用户使用辅鼠标按钮单击对象用户使用辅鼠标按钮单击对象 GotfocusGotfocus对象接收焦点,由用户动作引起对象接收焦点,由用户动作引起LostfocusLostfocus对象失去焦点,由用户动作引起对象失去焦点,由用户动作引起KeypressKeypress用户按下或释放键用户按下或释放键 MousedownMousedown当鼠标指针停在一个对象上时,用当鼠标指针停在一个对象上时,用户按下鼠标按钮户按下鼠标按钮 MousemoveMousemove用户在对象上移动鼠标用户在对象上移动鼠标 MouseupMouseup当鼠标指针停在一个对象上时,用当鼠标指针停在一个对象上时,用户释放鼠标按钮户释放鼠标按钮 interactivechangeinteractivechange以交互方式改变对象值以交互方式改变对象值 programmaticchangeprogrammaticchange以编程方式改变对象值以编程方式改变对象值 256.4 相关事件相关事件问题:容器和它包含的控件都设置了某事件的响应代码,系统如何处理这个事件。
为控件编写事件的处理代码时,应注意两条原则:两条原则: (1)容器不处理与所包含的控件相关联的事件 (2)如果没有与控件相关联的事件代码,Visual FoxPro将在类层次的更高层上检查是否有与此事件相关联的控件代码 6.4. 2 容器层次事件和类层次中的事件容器层次事件和类层次中的事件266.4 相关事件相关事件6.4. 2 容器层次事件和类层次中的事件容器层次事件和类层次中的事件例外:对于选项按钮组与命令按钮组来说,组中个别按钮如果没有编写事件处理代码,则当事件发生时将执行组事件的处理代码例如,在如图6-4所示的表单中有一个选项按钮组(设置Click事件处理代码),该选项按钮组中有二个选项按钮(选项按钮Option1有Click事件处理代码而选项按钮Option2无Click事件处理代码),则当用户单击Option1时执行与之相关联的事件代码,不执行按钮组的Click事件处理代码,但当用户单击Option2时执行按钮组的Click事件处理代码p128 图6-4 按钮组中的事件代码.scx) 276.4 相关事件相关事件F问题:程序的运行伴随着一系列的事件的产生。
如何查看这些事件的发生顺序FP156 表5-7 vfp中事件顺序,交互事件未列出F*对于表单,事件的激发顺序为: Load Init Activate Destroy Unload *对于表单上的某个控件,激发顺序为: InitWhenGotFocusValidLostFocusDestroy 6.4. 3 事件激发的顺序事件激发的顺序286.4.4 常用的事件常用的事件1.鼠标事件鼠标事件FMouseMoveMouseMove事件事件FClickClick事件事件FRightClickRightClick事件事件FDblClickDblClick事件事件292. 键盘事件键盘事件FKeyPressKeyPress事件事件303. 改变控件内容的事件改变控件内容的事件FInteractiveChangeInteractiveChange事件事件–在使用鼠标或键盘更改控件的值在使用鼠标或键盘更改控件的值时发生时发生314. 焦点事件焦点事件F焦点焦点(Focus)用以指出当前被操作的对象FGotFocusGotFocus事件事件–用任何方法使对象接受到焦点时发生用任何方法使对象接受到焦点时发生PROCEDURE Object.GotFocus [LPARAMETERS nIndex]FLostFocusLostFocus事件事件–当某个对象失去焦点时发生当某个对象失去焦点时发生325. 表单事件表单事件FLoadLoad事件(表单和表单集)事件(表单和表单集)–创建对象之前发生创建对象之前发生–Load事件发生在事件发生在Activate和和GotFocus事件之前事件之前FUnLoadUnLoad事件(表单和表单集)事件(表单和表单集)–在对象被释放时发生在对象被释放时发生–Unload事件发生在事件发生在Destroy事件和所有包含的对象被释事件和所有包含的对象被释放之后放之后337. 其他事件其他事件FTimerTimer事件事件 (用于计时器控件)(用于计时器控件)–当经过当经过Interval属性中指定的毫秒数时发生属性中指定的毫秒数时发生FInitInit事件事件 在创建对象时发生在创建对象时发生FDestroyDestroy事件事件–在释放一个对象实例时发生在释放一个对象实例时发生FErrorError事件事件–当某方法运行出错时发生当某方法运行出错时发生346.4.5 事件驱动和事件循环F事件驱动事件驱动——程序代码的执行总是由某个事件的发生而引发,执行顺序无法预料,而面向过程则是顺序执行。
Message-based,event-driven,也是面向对象编程模型采用的方法F*利用VFP进行应用程序设计时,必须创建事件循环(event loop)–READ EVENTS命令建立事件循环–CLEAR EVENTS命令终止事件循环–若陷入了死循环,可以按[ESC]键强制中断程序的运行356.5 方法F方法(程序)是对象能够执行的一个操作,由系统提供默认的实现代码F用户可以调用这些方法程序也可以为这些方法编写自己的实现代码F使用方法程序可以减少我们写代码的数量36常用的方法1. AddItem方法在组合框或列表框中添加一个新数据项,并且可以指定数据项索引2. RemoveItem方法从组合框或列表框中移去一项3. Release方法方法–Release 方法是从内存中释放表单集或表单–其调用语法为:thisform.Release37常用的方法 4. Hide/Show方法方法–Hide 方法是通过把 Visible 属性设置为“假”(.F.),隐藏表单、表单集或工具栏–其调用语法为:Object.Hide–表单被隐藏后,用户不可访问它的控件,但是这些控件仍然可用,并且可以在代码中访问它们。
虽然这些控件是不可见的,但这些保存在不可见表单中的控件仍然保留自己的 Visible 属性设置值5. Quit方法方法–Quit方法是结束一个VFP 实例,返回到创建VFP实例的应用程序–其调用语法为:ApplicationObject.Quit( )38常用的方法6. SetALL方法方法–SetAll 方法是为容器对象中的所有控件或某类控件指定一个属性设置–其调用语法为:Container.SetAll(cProperty, Value [, cClass])–参数cProperty要设置的属性Value属性的新值,Value 的数据类型取决于要设置的属性cClass指定类名 39小结FOOP的意思:面向对象程序设计的意思:面向对象程序设计F类和对象的区别:类和对象的区别:F对象具有:属性对象具有:属性、、方法方法、、事件F基类分为两种类型:容器类和控件类基类分为两种类型:容器类和控件类F基类的最小事件集和最小属性集基类的最小事件集和最小属性集F相对引用时常用的关键字相对引用时常用的关键字F事件激发的顺序事件激发的顺序F建立事件循环和中止事件循环建立事件循环和中止事件循环 的命令的命令40作业FP163 填空题 全部,直接写答案即可F选择题自己做在书上!41考过的等级考试考题1. 类( class )是面向对象程序设计的核心。
类具有许多特点,如抽象性、封装性、继承性等,其中 _______ 是指包含和隐藏对象信息(如内部数据结构和代码)的能力,使操作对象的内部复杂性与应用程序隔离开来422. Visual FoxPro系统提供的基类都有最小事件集(Destroy 、Error、 Init)从事件的激发顺序看, 最小事件集中 事件是最后激发的3. 在事件代码中相对引用当前表单集的关键字是 ________ 43F4. 假定表单(frm2)上有一个文本框对象text1和一个命令组按钮对象cg1,命令按钮组cg1包含cd1 和cd2两个命令按钮如果要在cd1命令按钮的某个方法中访问文本框对象text1 的Value属性,下列表达式正确的是 A.THIS.THISFORM.text1.ValueB.THIS.PARENT.PARENT.text.ValueC.PARENT.PARENT.text1.ValueD.THIS.PARENT.text1.Value445. Visual FoxPro 系统中基类的事件集合是固定的,不能进行扩充它的最小事件集合包括Init事件,Destroy事件和_______事件。
456. 根据对象能否包容子对象划分,对象可以分为 和控件类对象两种类型 467. Visual FoxPRO主窗口同表单对象一样,可以设置各种属性要将Visual FoxPRO主窗口的标题更改为“教学管理系统”,可以使用命令 =“教学管理系统” 478. 某表单Form1上有一个命令按钮组Cmg,其中有两个命令按钮(分别为cmd1和cmd2),要在Cmd1的Click事件代码中设置cmd2不可用,其代码为: THIS. .cmd2.Enabled=.F.489. 某表单中有一个命令按钮,该命令按钮的Click事件过程代码中含有一条命令可以将该表单中的页框pg1的活动页面改为第三个页面,该命令是THISFORM.pg1. =3 4910. 某表单中含有一个命令按钮要求运行表单时,单击该命令按钮可以调用表单的Init事件中的全部程序代码,则需要在命令按钮的Click时间中写入语句 50。
