上一讲心铃和大家一起建立了一个VFP的应用程序,但若要深入地理解程序是如何工作的,乃至编写具有自己风格的应用程序,还必须了解一些VFP程序设计的基础知识。本讲主要介绍VFP中面向对象的有关内容。
一.对象
在VFP中,包含在应用程序中的表单及各种控件都是对象。对象是包含数据和代码的实体。在程序设计中,用属性、事件和方法来说明对象,属性就是对象的数据,事件和方法则是对象中包含的代码。
属性
每个对象都具有属性,属性表明了对象的一些基本特征,如大小、颜色、所处的位置等。表5.1列出了命令按钮对象的部分常用属性:
表5.1 命令按钮的常用属性 | |
属性 | 说明 |
Caption | 显示在按钮上的标题 |
Name | 按钮对象的名称 |
FontName | 按钮的字体名 |
ForeColor | 前景颜色 |
表5.2 命令按钮的典型事件 | |
事件 | 说明 |
Init | 对象被创建时激活 |
Click | 单击对象时激活 |
MouseDown | 按下鼠标按钮时激活 |
事件
事件是一种预先定义好的特定动作,被用户或系统激活,每个对象都可以对事件的动作进行识别和响应。在多数情况下,事件是由用户的交互行为产生的,例如,对一部电话来说,当用户提起听筒时,便激发了一个事件,同样,当用户拨号打电话时也激发了若干事件。事件集合是固定的,用户不能进行扩充。表5.2列出了命令按钮的典型事件。
方法
方法实际上就是对象的内部函数,每个类型的对象都有它自己的方法集。例如在命令按钮对象中,调用Move方法可以移动按钮的位置。与事件不同的是,方法可以由用户进行扩展。表5.3列出了表单对象的常用方法。
表5.3 表单对象的常用方法。 | |
方法 | 说明 |
Refresh | 重画表单和控制,刷新表单中的所有值 |
Show | 显示表单 |
Hide | 隐藏表单 |
请用以下任一种方法打开我们在上一讲建立的“学生情况”表单。
在项目管理器的“学生情况”表单项上双击。
先选中“学生情况”表单项,然后在单击“修改”命令按钮,或回车。
先选中“学生情况”表单项,然后在VFP菜单上选择“项目/修改文件”。
如果项目管理器处于最小化的状态,还可以试试鼠标右键。
在表单中“学号:”字样处单击,在它的周围会出现一系列的小方块,这说明它是一个对象。现在我们来看看它的属性,用鼠标右键单击“学号:”,在弹出的快捷菜单中选择“属性”,屏幕上将出现如图5.1所示的“属性”窗口。用鼠标右键单击“属性”窗口的标题区,在弹出的快捷菜单中,可以选择您喜欢的显示方式。
属性窗口由包含五个卡片的页框组成:
全部:显示所有的属性、事件和方法。
数据:只显示对象数据的源、输入格式、长度,字段是否只读等。
方法程序:只显示方法和事件。其中有“Event”的项是事件,其余的是方法。
布局:只显示颜色、可视性、字体,以及其它一些与对象外观相关的一些属性。
其他:只显示类信息,拖动方式,状态的允许与禁止,对象名以及其它的一些内容。
每个页框上的每一页的属性列表依赖于所选的对象类型。对对象进行选择的方法有两种:可以直接在对象上单击,也可以从对象名列表中挑选。例如,在表单的背景中的任意处单击,表单的名字Form1将出现在对象名框中。
二.处理对象
当一个对象被选中时,如果要改变它的属性,则先在“属性”窗口的属性列表中选择要改变的属性,然后在属性值设置框中输入或选取一个值即可。
用对象编程的大量工作是了解存在哪些属性,可以赋予什么值,基于所赋予的值将会产生什么效果。例如,透明的对象允许背景颜色透过来,不透明的对象具有自己的背景颜色。仅仅通过把对象的BackStyle属性从不透明改为透明,就可以很任意地修改一个对象的外观和特性。
当然有时候,我们也需要在程序中以命令方式来处理对象,在这种情况下,首先需要知道对象相对于容器层次的关系。如图5.2所示,FormSet1是一个表单集对象,Form1是包含在FormSet1中的一个表单对象,Txt1和Group1是包含在Form1中的文本框对象和选项按钮组对象,Opt1和Opt2是包含在Group1中的选项按钮对象。其中FormSet1、Form1和Group1叫做容器对象,而Txt1和Opt1、Opt2叫做控制对象。容器对象可以包含其他的对象,而控制对象则不能。对于Txt1对象,我们可以用如下形式访问:
FormSet1.Form1.Txt1
若要访问Opt2对象,需用如下形式:
FormSet1.Form1.Group1.Opt2
在容器层次中访问对象时,还可以通过快捷方式访问到对象,下表列出了可以快捷访问对象的关键字:
关键字 | 引用关系 |
THIS | 该对象本身 |
THISFORM | 该对象所在的表单 |
THISFORMSET | 该对象所在的表单集 |
Parent | 包含该对象的直接容器 |
假使在对象Txt1中要访问对象Group1,则可以使用:
THISFORM.Group1 或者THIS.Parent.Group1
其中,THIS就代表Txt1对象,THISFORM和THIS.Parent都是指表单Form1对象。
以命令方式设置对象属性的语法形式为:
Object.Property = Value
还以图5.2为例:
FormSet1.Form1.Txt1.Enabled = .f. &&使Txt1不可用
有时需要同时设置一个对象的多个属性,这时我们可采用WITH…ENDWITH结构,如:
WITH FormSet1.Form1.Txt1 .Visible = .t. &&使其可见 .Enabled = .t. &&使其可用 .backcolor = rgb(192,192,192) &&使其背景为浅灰色ENDWITH三.响应事件和调用方法
当对象的事件发生时,该事件的过程代码就被自动执行,例如用户单击命令按钮,将产生一个Click事件,命令按钮的Click事件代码被执行。
下面几点需要特别强调说明一下:
事件一般是由用户的交互方式触发的,如单击或双击鼠标,按下键盘上的键,也有些是被系统触发的,象计时器控制中的Timer事件。
在没有事件发生时,用户也可以显式地调用与事件相关的过程,如语句:
Parent.Object.Activate将使Activate事件代码被执行,但事件并不发生。
对象的方法需要显式地被调用,且可以在程序的任何地方。下面的语句调用Show方法来显示表单,并设置输入焦点在命令按钮上:
FormSet1.Form1.ShowFormSet1.Form1.ComdBut1.SetFocus如果在调用方法式需要传递参数,应该将参数包括在方法名后的圆括号中,如果是调用方法后有返回值,即使没有传递参数,在方法名后也要加圆括号。示例如下:
THIS.Move(100,50) &&传递参数给方法
THIS.Caption=THISFORM.GetNewCaption() &&方法的返回值作为对象的新标题
四.对事件的进一步讨论
VFP提供了比较全面的事件处理机制,使得程序员能够较容易地为用户设计基于事件驱动的、内容更丰富的交互环境。为了达到这一点,必须对VFP的事件模型有深入的了解。
1.VFP中的事件
每一个类都有自己的事件集合,不同的类有不同的事件种类,如计时器具有Timer事件,而其它的类则没有,但也有一些事件是大多数类都具有的,下表是一些通常使用到的、大多数类都具有的VFP核心事件:
事件 | 何时被激活 |
Init | 对象被创建时 |
Destroy | 对象从内存中释放时 |
error | 类中的事件或方法过程中发生错误时 |
Load | 表单或表单集被加载到内存中 |
Unload | 从内存中释放表单或表单集 |
Click | 用鼠标左键单击对象 |
GetFocus | 按TAB键或单击对象,或在程序中调用SetFocus方法,使对象接受输入焦点 |
LostFocus | 对象失去输入焦点 |
InteractiveChange | 以交互方式改变对象的值 |
表5.5 VFP核心事件 | |
2.容器与对象事件
在实际应用中,控制对象一般都被包含在容器对象中,如命令按钮、文本框包含在表单中,页面控制包含在页框中等,那么当用户单击命令按钮时,是命令按钮的Click事件被触发,还是表单的Click事件被触发,或者是两个对象的Click事件都被触发?
实际上,当事件发生时,只有与事件相关联的最里层对象识别该事件,更高层的容器不识别这个事件。因此当用户单击命令按钮时,只有该命令按钮的Click事件被触发,而包含命令按钮的容器——表单,则不识别这个Click事件。即使该命令按钮没有与Click事件相关联的事件代码,而表单有自己的Click事件代码,也不会执行表单的事件代码。
有一个例外的情况,如果为选项按钮组或命令按钮组容器编写了事件代码,而组中的按钮没有相应的事件代码,则当按钮的事件发生时,将执行按钮组的事件代码。如果组中的按钮有相应的事件代码,就不执行组的事件代码而执行按钮本身的事件代码。
3.事件的顺序
基于事件驱动的编程技术不同于传统的过程化程序设计,程序的执行顺序不是在设计时确定的,而是取决于事件的顺序。有时一个用户动作只触发一个事件,而有些情况下会有多个事件接连发生,如包含多个对象的表单被启动运行的时候,这样的情况下,了解事件发生的顺序是很重要的,否则就无法确定该往哪个事件中写入代码。
下面列出当启动运行VFP的表单时有关对象的事件顺序,其他的事件依赖于用户的动作或系统的反应(如计时器的Timer事件)。
对象 | 发生的事件 |
数据环境Data environment | BeforeOpenTables |
表单集FormSet | Load |
表单Form | Load |
数据环境中的临时表Data environment cursors | Inti |
Data environment | Inti |
表单中的对象Objects | Inti |
Form | Inti |
FormSet | Inti |
Activate | |
Form | Activate |
Objects | When |
GotFocus | |
Message | |
Valid | |
Lostfocus | |
Destroy | |
Form | Unload |
FormSet | Unload |
Data environment | AfterCloseTables |
Destroy | |
Data environment cursors | Destroy |
表5.6 运行表单时的事件顺序 | |
通过本讲的讲述,相信大家已初步熟悉了VFP中的面向对象的有关内容。您可以试着用“属性”窗口来修改“学生情况”表单和它包含的对象的属性,只有多加练习才能加深理解。OK,See you later!
心铃
猫猫的心里话
加菲猫的VFP|狐友会社群接收投稿啦
加菲猫的VFP,用VFP不局限VFP,用VFP混合一切。无论是VFP,还是JS,还是C,只要能混合起来,都可以发表。
商业模式,销售技巧、需求规划、产品设计的知识通通可以发表。
暂定千字50元红包,,优秀的文章红包更大,一经发表,红包到手。
如何帮助使用VFP的人?
用VFP的人,有专业的,有非专业了,很多人其实是小白,问出的问题是小白,如果问题不对,我们引导他们问正确的问题。无论如何请不要嘲笑他们说帮助都不看,这么简单的问题都不会,嘲笑别人不行,而无法提出建设性答案,是很low的。
我们无论工作需要,还是有自己的软件,都是是需要真正的知识,如何让更多人学习真正的VFP知识呢,只需要点赞,在看,能转发朋友圈就更好了。
加菲猫的vfp倡导用"VFP极简混合开发,少写代码、快速出活,用VFP,但不局限于VFP,各种语言混合开发"。
我已经带领一百多名会员成功掌到VFP的黑科技,进入了移动互联网时代,接下来我们要进入物联网领域。
2025年狐友会社群会员继续招募中
社群会员获取的权益有:
祺佑三层开发框架商业版(猫框),终身免费升级,终身技术支持。
开放的录播课程有:
微信小程序,微信公众号开发,H5 APP开发,Extjs BS开发,VFP面向对象进阶,VFP中间层开发。
源码类资源有:
支付组件源码,短信源码,权限组件源码,一些完整系统的源码。这个可以单独出售的,需要的可以联系我。
会员也可以实现群内资源对接,可以接分包,合作等各项商业或技术业务