1、6.1 面向对象程序设计概述1. 基本概念面向对象的程序设计是经过对类、 子类和对象等的设计来体现的, 类是面向对象程序设计技术的核心。类: 定义了对象特征以及对象外观和行为的模板。类的特征: 封装性: 隐藏了类中对象的内部数据或操作细节, 只看到外表信息。继承性: 任何类都能够从其它已有的类中派生, 新类保持了父类中的行为和属性, 但增加了新的功能。体现了面向对象设计方法的共享机制。多态性: 相同的操作可作用于多种类型的对象上, 并获得不同的结果。抽象性: 提取一个类或对象与众不同的特征, 而不对该类或对象的所有信息进行处理。基类: 系统本身提供的类称为基类。基类包括容器类和控件类。容器类是
2、其它对象的集合, 如表格、 选项按钮组;控件类是单一的对象, 不包含其它对象, 如命令按钮、 文本框。子类: 以其它类定义为起点, 对某一对象所建立的新类。新类将继承任何对父类所做的修改。类库: 存储类的文件, 每一个以可视方式设计的类都存储在一个类库中。类库文件的扩展名为 .VCX 。对象: 是类的一个实例, 包括了数据和过程。具有所在类所定义的全部属性和方法。VFP有两种对象: 容器对象和控件对象。属性: 控件、 字段或数据库对象的特性。事件: 由对象识别的一个动作。方法: 与对象相联系的由程序执行的一个处理过程, 即处理事件的一组代码。用户不能够为对象创立新的事件, 但能够创立新的方法程
3、序。2. Visual FoxPro 基类从下述 Visual FoxPro 基类中, 能够派生子类或创立对象。容器命令组控件微调标签表单命令按钮复选框OLE 容器控制线条表单集选项组列表框OLE 绑定型控制分隔符 #表格选项按钮 #文本框自定义形状标头 #页框组合框工具栏图象列 #页面 #编辑框计时器注: # 这些类是父容器的集成部分, 在类设计器中不能子类化。基类事件的最小集合事件说明Init当对象创立时激活。Destroy当对象从内存中释放时激活。Error当类中的事件或方法过程中发生错误时激活。基类属性的最小集合属性说明Class该类属于何种类型。BaseClass该类由何种基类派生而
4、来, 例如 Form、 Commandbutton 或 Custom 等ClassLibrary该类从属于哪种类库。ParentClass对象所基于的类。若该类直接由 Visual FoxPro 基类派生而来, 则 ParentClass 属性值与 BaseClass 属性值相同。容器类容器类能够包含其它对象, 而且允许访问这些对象。每种容器类所能包含的对象如下。容器能包含的对象命令按钮组命令按钮容器任意控件控件任意控件表单集表单、 工具栏表单页框、 任意控件、 容器或自定义对象表格列标头对象以及除表单、 表单集、 工具栏、 计时器和其它列对象以外的任意对象表格表格列选项按钮组选项按钮页框页面
5、页面任意控件、 容器和自定义对象工具栏任意控件、 页框和容器6.2 类的创立1. 创立类的方法(1)类设计器(2)表单设计器(3)编程方式2. 用类设计器创立类使用”类设计器”能够可视化地创立并修改类。 类存储在类库 (.VCX) 文件中。(1) 创立新类能够用三种方法(文件菜单、 项目管理器、 CREATE CLASS命令)打开类设计器并在其中创立新类, 且在设计时就能看到每个对象的最终外观。步骤: 单击文件菜单中的新建 选择类, 新文件 在对话框中给出新类的名称、 新类基于的类以及保存新类的类库 进入类设计器 根据需要在基类的基础上进行所需修改 关闭设计器并确定保存。(2) 为类指定设计时
6、的外观1) 为类设置一个工具栏图标在类设计器中从类菜单中选择类信息 打开类信息对话框, 在工具栏图标框中键入 .BMP 文件的名称和路径。附注: 工具栏图标的 .BMP 文件必须是 15 x 16 象素点大小。如果图片过大或过小, 它将被调整到 15 x 16 象素点, 图形可能变形。2) 为类设置一个容器图标打开类设计器从类菜单选择类信息 在容器图标框中键入将在表单设计器中的控件工具栏按钮上显示的 .BMP 文件名称和路径。(3) 创立类库能够用三种方法创立类库。1) 在创立类时, 在新类对话框的”存储于”框中指定一个新的类库文件。2) 使用 CREATE CLASS 命令, 同时指定新建类
7、库的名称。例如, 下面的语句创立了一个名为 myclass 的新类和一个名为 new_lib 的新类库: CREATE CLASS myclass OF new_lib AS CUSTOM3) 使用 CREATE CLASSLIB 命令。例如, 在命令窗口键入下面的命令, 能够创立一个名为 new_lib 的类: CREATE CLASSLIB new_lib(5) 修改类定义在创立类之后, 还能够修改它, 对类的修改将影响所有的子类和基于这个类的所有对象。也能够增加类的功能或修改类的错误, 所有子类和基于这个类的所有对象都将继承修改。 在项目管理器中选择所要修改的类或使用 MODIFY CL
8、ASS 命令进行修改。(6) 将表单和控件保存为类能够将表单或表单上的控件子集保存为类定义。如果打算创立基于表单的子类, 或在其它表单中重新使用这些控件, 可将表单作为类定义来保存。从文件菜单中选择另存为类 在另存为类对话框中, 选择当前表单或选定控件 在”类名”框中输入类的名称在文件框中输入保存类的文件名 选择确定按钮。3. 用编程方式创立类在程序窗口中建立一个定义类的程序文件(扩展名为.PRG), 然后执行该程序。4.将类添加到表单、 表单集和工具栏中(1) 注册一个类库从工具菜单中选择选项 在选项对话框中选择控件选项卡 选择可视类库并选择添加按钮 在打开对话框中选择要注册的类库并选择打开
9、 选择确定按钮。(2) 给子类增加功能使用作用域操作符 (:) 能够在子类上调用父类的代码, 引用父类的方法。调用父类方法的语法是: ParentClass:Method( )(3) 将属性和方法添加到类能够向新类中添加任意多的新属性和新方法。属性保存一个值, 而方法则保存调用时能够运行的过程代码。从类菜单选择新属性或新方法 在新属性对话框中键入属性或方法的名称 指定它是否受保护。5. 类浏览器(1) 类浏览器的作用可创立子类, 把类从一个类库复制到另一类库, 删除类和库文件, 重命名类或者重新定义类关系。注意: 如果要对类进行删除、 重命名或重定义, 则基于此类的表单可能不能正确运行。(2)
10、 添加一个子类在类浏览器中打开类库 选择要从中派生子类的类, 然后选择新类按钮 在新类对话框中输入新子类名 在类设计器中定义并保存子类。(3) 把类从一个类库复制到另一类库中在类浏览器中打开源类库 从工具菜单中打开类浏览器的第二个实例, 并选择目标库文件 在源类库中选择要复制的类, 然后在按住Ctrl键的同时, 把位于类列表上方的类图标拖到目的库中的类图标上。 若不同时按住Ctrl键则是移动。(4)把多个类从一个类库文件复制到另一个类库文件中在类浏览器中打开源类库 如果要筛选类列表, 则在类型框中键入筛选条件以限定想要从文件中复制的类 从工具菜单中, 打开类浏览器的第二个实例, 并选择目标库文
11、件 在源类库中, 选择要复制的类库文件, 然后在按住Ctrl键的同时, 把位于类列表上方的类图标拖到目标库中的类图标上。(5) 删除类、 类库或表单1) 在类浏览器中打开类库或表单。2) 在类列表中, 选择要删除的类、 类库或表单, 然后选择删除按钮。对类来说, 它在库中的记录标有删除标记, 下一次就可选择清除类库;对类库和表单来说, 文件是从磁盘中删除。(6) 重命名类库中的类, 在类浏览器中打开类库 在类列表中, 选择要重命名的类, 然后选择重命名按钮 在重命名类对话框中, 输入新的名称, 然后选单击重命名。注意: 如果对具有相关子类的类重命名, 则子类将不能引用从重命名类中继承下来的属性
12、。(7) 更改一个类的父类在类浏览器中打开类库 在类列表中, 选择想要重定义的类, 然后选择重定义按钮 在重定义对话框的为框中, 输入新的父类名。新父类与原父类必须是来源于同一基类 在基于框中, 选择或输入类库文件名。(8) 定制类浏览器可更改类浏览器的属性、 事件和方法。可经过程序来操作类浏览器: 1) 打开类浏览器将自动创立公共变量 _oBrowser,可使用此变量来引用或操作类浏览器表单, 如同对任何表单对象一样。2) 对要更改的类浏览器的属性进行设置。例如, 在打开类浏览器之前, 可经过下列命令把类浏览器的标题属性设置为 Hello: _OBROWSER.Caption = Hello
13、_OBROWSER.Left = 103) 打开类浏览器, 创立一个实例。例如, 为了打开类浏览器, 可输入代码: DO (_BROWSER)6.3 创立并处理对象1. 创立对象(1) 编程方式先创立一个类, 再用 CREATEOBJECT() 函数来创立。(2) 可视化方式用表单设计器创立。2. 引用对象引用对象时, 对象与对象之间、 对象与属性之间需用分隔符 . 进行分隔。(1) 绝对引用从容器的最高层引用对象, 给出对象的绝对地址。如: form1.text1.value(2) 相对引用在容器层次中相对于某个容器层次的引用。如: thisform .text1.value系统变量 _SC
14、REEN 表示屏幕对象, 与 ActiveForm 等组合能够在不知道表单名的情况下处理活动表单。3. 设置对象的属性(1) 能够在属性窗口中进行可视化设置(2) 能够在程序中用如下格式进行设置: 引用对象.属性 = 值如: thisform .text1.value=只要功夫深, 铁棒磨成针。想一次设置多个属性时, 能够采用WITH ENDWITH 语句。如: WITH form1.text1.Value=书山有路勤为径.ForeColor=rgb(255,0,0).FontSize=18.FontName=隶书.FontBold=.T.ENDWITH4. 调用对象的方法程序若对象已经创立,
15、 能够在应用程序的任何地方调用该对象的方法程序。调用方法程序的格式为: 引用对象.方法程序如: Form1.Show5. 对象对事件的响应当事件发生时, 该事件的过程代码就将被执行。用编程方式能够使用 MOUSE 命令产生 CLICK、 DOUBLECLICK、 MOUSEMOVE、 DRAGDROP 事件, 使用 ERROR 命令产生 ERROR 事件, 或使用 KEYBOARD 命令产生 KEYPRESS 事件, 除此之外不能用其它的程序设计方法产生其它事件, 但可调用与它们相关的过程。6.4 事件与方法1. VFP 中的事件VFP 中的常见事件分类事件类型事件名称鼠标事件Click Db
16、lClick RightClick DropDown DownClick UpClick键盘事件KeyPress改变控件内容的事件InteractiveChange控件焦点的事件GotFocus LostFocus When Valid 表单事件Load Unload Destroy Activate Resize Paint QueryUnload数据环境事件AfterCloseTable BeforeOpenTable项目事件QueryModifyFile 等OLE 事件OLECompleteDrag 等其它事件Timer Init Destroy Error 一些核心事件和触发时间事件触
17、发时间Load当表单或表单集被加载时产生Unload当表单或表单集从内存中释放时产生Init创立对象时产生Destroy从内存中释放对象时产生Click用户在对象上单击鼠标时产生DblClick用户在对象上双击鼠标时产生RightClick用户在对象上单击鼠标右键时产生GetFocus对象得到焦点时产生LostFocus对象失去焦点时产生KeyPress用户按键时产生MouseDown在对象上按下鼠标MouseUp在对象上松开鼠标MouseMove在对象上移动鼠标InteractiveChange.交互式改变对象值ProgrammaticChange可编程地改变对象值2. 事件循环VFP6.0
18、 中用 READ EVENTS 命令建立循环, 用 CLEAR EVENTS 命令终止循环。利用 VFP6.0 设计应用程序时, 必须创立事件循环, 否则不能正常运行。READ EVENTS 命令一般出现在应用程序的主程序中, 同时必须保证主程序调出的界面中有发出 CLEAR EVENTS 命令的机制, 否则程序进入死循环。3. 方法VFP6.0 中的常见方法名称调用语法功能AddObjectObject. AddObject (cName, cClass, )在运行时向容器对象中添加对象ClearObject.Clear清除组合框或列表框控件中的内容HideObject.Hide经过把Visible属性设置为 .F., 来隐藏表单、 表单集或工具栏ShowObject.Show把Visible属性设置为 .T., 显示并激活一个表单或表单集, 并确定表单的显示模式RefreshObject.Refresh重画表单或控件, 并刷新所有值ReleaseObject.Release从内存中释放表单或表单集QuitObject.Quit结束一个VFP6.0实例, 返回到创立它的应用程序。