Visual FoxPro第5章程序设计基础.ppt
Visual FoxPro程序设计教程第5章 程序设计基础l5.1 程序设计概述程序设计概述l5.2 结构化程序设计(结构化程序设计(重点重点)l5.3 面向对象的程序设计面向对象的程序设计5.1程序设计概述l什么是程序?什么是程序?程序是一个指令序列,指令是计算机能够识别和程序是一个指令序列,指令是计算机能够识别和执行的命令。执行的命令。l程序的作用是什么?程序的作用是什么?用来处理数据,程序的输入对象成为用来处理数据,程序的输入对象成为“输入数据输入数据”,程序的结果为,程序的结果为”输出数据输出数据”。l如何编写程序?如何编写程序?采用编程语言来编写,如,采用编程语言来编写,如,Java,C,C+,VFP,VB等等,等等,这些统称为编程语言。这些统称为编程语言。采用编程工具,如采用编程工具,如.NET2005,Visual FoxPro 6.0等。等。l程序设计的概念程序设计的概念 利用系统所有提供的设计工具,按照程序设计语利用系统所有提供的设计工具,按照程序设计语言的规范描述解决问题的算法并进行程序编写的言的规范描述解决问题的算法并进行程序编写的过程。过程。l程序设计的方法程序设计的方法结构化方法结构化方法(SP)面向对象的方法面向对象的方法(OOP)结构化设计l产生的原因产生的原因 早期的程序设计,早期的程序设计,编写很随意使用编写很随意使用“goto”语句语句可以任何的跳转到程序的任何地方。使得程序的可以任何的跳转到程序的任何地方。使得程序的可读性差,难以维护。可读性差,难以维护。l结构化设计的规则结构化设计的规则自顶向下自顶向下逐步求精逐步求精限制使用转移语句限制使用转移语句(goto语句语句)l结构化程序设计的三种结构:结构化程序设计的三种结构:顺序、分支顺序、分支和循环和循环面向对象程序设计l设计思想设计思想 认为世界是由各种对象构成,一个较复杂的对象可以由多认为世界是由各种对象构成,一个较复杂的对象可以由多个简单的对象组成,因而采用编程语言来描述对象。个简单的对象组成,因而采用编程语言来描述对象。某一类对象的集合抽象为类,如某一类对象的集合抽象为类,如“学生学生”,“教师教师”都是都是类,而某一个具体的学生,如类,而某一个具体的学生,如“张三张三”是是“学生学生”这个类这个类中的一个对象。中的一个对象。类中包含一些对象的属性和行为类中包含一些对象的属性和行为(方法方法),如,如,“学生学生”中中包含属性:学号,姓名,系等,包含行为:选课,上课等包含属性:学号,姓名,系等,包含行为:选课,上课等行为。行为。对象与对象之间通过消息来联系。对象与对象之间通过消息来联系。lOOP的三个重要特性:的三个重要特性:封装性封装性继承性继承性多态性多态性lOOP与与SP的比较的比较 OOP更接近人的解决问题的思路,能够节省编程更接近人的解决问题的思路,能够节省编程的时间,可应付复杂的软件项目。但是在的时间,可应付复杂的软件项目。但是在OOP也也是以是以SP为基础的,类中的方法就是以为基础的,类中的方法就是以SP的思想编的思想编写的。写的。下面是一个完整的下面是一个完整的VFP过程化程序,可以引出几个过程化程序,可以引出几个基本概念。基本概念。*功能说明:求圆形的面积。功能说明:求圆形的面积。*文件名:文件名:RR.PRG CLEAR SET TALK OFF INPUT 请输入圆的半径,半径请输入圆的半径,半径=TO R S=PI()*R*R?半径为半径为+ALLTRIM(STR(R)+的圆,面积的圆,面积=,S SET TALK on RETURN 5.2 结构化程序设计1、从形式上看,VFP的程序是由若干有序的命令行组成,且满足下列规则:一个命令行内只能写一条命令,命令行的长度不一个命令行内只能写一条命令,命令行的长度不得超过得超过2048个字符,命令行以回车键结束。个字符,命令行以回车键结束。如果一行写不下一条语句,可以换行,但必须加如果一行写不下一条语句,可以换行,但必须加“;”2、从功能上看,程序可以分为三个部分:第一部分是程序的说明部分第一部分是程序的说明部分第二部分是进行数据处理的部分第二部分是进行数据处理的部分第三部分是程序的控制返回部分第三部分是程序的控制返回部分5.2.1 创建、修改程序文件l过程化程序设计基本操作过程化程序设计基本操作(1)建立和修改程序文件。建立和修改程序文件。使用菜单命令使用菜单命令“文件文件”-“新建新建”,选择程序,选择程序 使用工具栏上面得使用工具栏上面得“新建新建”按钮按钮 在项目管理器中选择在项目管理器中选择“代码代码”页面,在选择页面,在选择“程序程序”,然后选择,然后选择“新建新建”在命令窗口执行如下命令:在命令窗口执行如下命令:MODIFY COMMAND Filename|?(2)运行程序运行程序 运行程序的三种方法:运行程序的三种方法:当程序处于编辑窗口时,点击当程序处于编辑窗口时,点击“!”按钮按钮在项目管理器中选择某一程序,点击在项目管理器中选择某一程序,点击“运行运行”在命令窗口使用在命令窗口使用DO命令,格式:命令,格式:DO ProgramNameWITH ParameterList 期中期中ProgramName为程序文件名为程序文件名,with子句指子句指定参数。定参数。当程序运行,系统会自动生成一个当程序运行,系统会自动生成一个“伪编译伪编译”程序程序(.FXP)。执行时,实际上执行的是。执行时,实际上执行的是.FXP文件。文件。例例 用户通过VFP的命令窗口建立上例程序文件。在VFP的命令窗口中输入下条命令后按回车键。MODIFY COMMAND RR打开程序编辑窗口在程序编辑窗口中输入程序代码用Ctrl+W存盘退出编辑窗口,或单击程序编辑窗口上的【关闭】按钮,在弹出的对话窗口中确定存盘,生成RR.prg文件。5.2.2 顺序结构l所谓顺序结构,是指程序运行时按照语句排所谓顺序结构,是指程序运行时按照语句排列的先后顺序,一条接一条地依次执行。列的先后顺序,一条接一条地依次执行。语句A语句B例例5.1 store 4.12 to p s=p*p*3.14?圆面积为:,s例例5.2 下面程序的功能是显示一个字符串在另下面程序的功能是显示一个字符串在另一个字符串中的位置。一个字符串中的位置。C=“Visual FoxPro”CC=“Fox”?AT(CC,C)&显示结果为显示结果为85.2.3 分支结构l所谓分支结构,是指程序在运行过程中,所谓分支结构,是指程序在运行过程中,根据条件执行不同的操作。在根据条件执行不同的操作。在VFP中,有两中,有两种实现分支结构的语句:种实现分支结构的语句:IFELSEENDIF语句语句 DO CASEENDCASE语句语句(1)IFELSEENDIF语句 格式:IF ELSE ENDIF根据根据 的结果决的结果决定程序执行语句的顺序。如定程序执行语句的顺序。如果结果为果结果为.T.T.,则执行,则执行 1,执行完了就执行,执行完了就执行ENDIFENDIF后面的语句;如果结后面的语句;如果结果为果为.F.F.则执行则执行 2,然后执行,然后执行ENDIFENDIF后面的后面的语句。语句。IF前的语句Lexp语句组1语句组2Endif后面的语句.F.T.IF语句的流程图语句的流程图例例5.3下列程序的功能是根据变量下列程序的功能是根据变量x的值决定的值决定变量变量y的值的值(为为1或或-1)。if x0 y=1 else y=-1 endif 等价于等价于y=-1If x0 y=1Endif例例5.4 下面程序的功能是解决一元二次方程。其中,下面程序的功能是解决一元二次方程。其中,PARAMETERS语句用于接收程序的参数语句用于接收程序的参数(三个参三个参数数a,b,c分别对应于一元二次方程的系数。分别对应于一元二次方程的系数。)parameters a,b,c if a=0 =Messagebox(“二次项目系数不能为零!二次项目系数不能为零!”,48,”错误显示对话框错误显示对话框”)return endif delta=b*b-4*a*c if delta0?“方程有两个不等的实根:方程有两个不等的实根:”?(-b+SQRT(delta)/(2*a)?(-b-SQRT(delta)/(2*a)else if delta=0?”方程有两个相等的实数根:方程有两个相等的实数根:”?-b/(2*a)else?”方程有两个复根:方程有两个复根:”real_part=-b/(2*a)&实部实部 img_part=sqrt(-delta)/(2*a)&虚部虚部?ALLTRIM(STR(real_part)+”+”+ALLTRIM(str(img_part)+”i”?ALLTRIM(STR(real_part)+”-”+ALLTRIM(str(img_part)+”i”endif endif 因为上面的程序,定义了三个参数,所以因为上面的程序,定义了三个参数,所以执行程序时需要用执行程序时需要用”WITH”子句给出三个子句给出三个参数的值,如求方程参数的值,如求方程X2+2X-8=0的根:的根:DO abc with 1,2,-8 其中其中abc为程序文件的名称,为程序文件的名称,1,2,-8分为别分为别为给参数为给参数a,b,c指定的值。指定的值。2.DO CASE ENDCASE语句语句 If语句只能判断最多两种情况,即语句只能判断最多两种情况,即“二分支二分支”。若。若要判断多于两种可能的情况,有两种方法可以实要判断多于两种可能的情况,有两种方法可以实现:现:在在IF语句中再嵌套语句中再嵌套IF语句语句 采用采用DO CASEENDCASE语句语句 但是当嵌套的但是当嵌套的IF语句太多时,会使得程序的结构语句太多时,会使得程序的结构不清晰。所以当有多种判定的情况时,采用不清晰。所以当有多种判定的情况时,采用CASE语句。语句。CASE语句的格式:语句的格式:DO CASE CASE lExpression1 Commands1 CASE lExpression2 Command2 CASE lExpressionN CommandN OTHERWISE Commands ENDCASE程序执行时,首先从第一个程序执行时,首先从第一个CASE开始,判断其后的条开始,判断其后的条件表达式件表达式lExpression1,如,如果为果为.T.。就执行语句。就执行语句Commands1然后直接执行然后直接执行ENDCASE之后的语句,否之后的语句,否则就进行第二个则就进行第二个CASE语句语句进行判断,依次类推。如果进行判断,依次类推。如果所有的所有的CASE语句后面的条语句后面的条件都为件都为.F.,就执行,就执行OTHERWISE后面的语句后面的语句(如果有)。(如果有)。DO CASELexp1Lexp2Lexpn其他语句组语句组1语句组2语句组3ENDIF后面的语句DO CASE语句的流程语句的流程图图例例5.5 用用DO CASE语句实现例语句实现例5.4中程序的功能。中程序的功能。parameters a,b,c if a=0 =Messagebox(“二次项目系数不能为零!二次项目系数不能为零!”,48,”错误显示对话框错误显示对话框”)return endif delta=b*b-4*a*c do case case delta0?“方程有两个不等的实根:方程有两个不等的实根:”?(-b+SQRT(delta)/(2*a)?(-b-SQRT(delta)/(2*a)case delta=0?”方程有两个相等的实数根:方程有两个相等的实数根:”?-b/(2*a)case delta64 and nc0 p=left(c,1)+p c=substr(c,2)enddo?cc+”的反序为的反序为”+p例例5.11 下列程序的功能是将由任意字符下列程序的功能是将由任意字符(包括汉字包括汉字)组成的字符串进行反序显示:组成的字符串进行反序显示:store abcdef to c,cc p=space(0)do while len(c)0 if x127 i=2 else i=1 endif p=left(c,i)+p c=substr(c,2)enddo?cc+”的反序为的反序为”+p例例5.12 下列程序的功能是统计字符串中大、小写英文字母的个数。下列程序的功能是统计字符串中大、小写英文字母的个数。clear c=“Visual FoxPro”cc=c Nmax=0 Nmin=0 do while“”c do case case asc(left(c,1)64 and asc(left(c,1)96 and asc(left(c,1)123)Nmin=Nmin+1 endcase c=subs(c,2)enddo wait wind“大写字符的个数:大写字符的个数:”+str(Nmax,2)+”小写的个数:小写的个数:”+str(Nmin)例例5.13 下列程序的功能是对表达式下列程序的功能是对表达式1/(123)+1/(234)+1/(n(n+1)(n+2),进行求和,进行求和,并且要求计算结果精度小于并且要求计算结果精度小于0.0000001 clear nS=0 i=1 do while.T.nS=nS+1/(i*(i+1)*(i+2)if 1/(i*(i+1)*(i+2)0.0000001 exit endif i=i+1 enddo 3.SCANENDSCAN循环结构循环结构 SCANENDSCAN构建的循环仅用于处理表的记录。若构建的循环仅用于处理表的记录。若对表中的所有记录执行某一操作,可以使用该语句。随着对表中的所有记录执行某一操作,可以使用该语句。随着记录指针的移动,记录指针的移动,SCAN循环对每条记录执行相同的命令循环对每条记录执行相同的命令组。格式:组。格式:SCANScope FOR lExpression1 Commands ENDSCAN例例5.14 下列程序的功能是显示所有籍贯为下列程序的功能是显示所有籍贯为”江苏江苏“的学生姓名和籍贯。的学生姓名和籍贯。clear use xs scan for 江苏江苏$jg?xm,jg endscan5.25 过程与用户自定义函数 用户可以将经常执行的具有某种功能的一用户可以将经常执行的具有某种功能的一段程序代码独立出来,将其作为一个过程段程序代码独立出来,将其作为一个过程或用户自定义函数,在需要该功能的时候或用户自定义函数,在需要该功能的时候调用这个过程或函数。调用这个过程或函数。*以下程序的功能是求圆的面积以下程序的功能是求圆的面积parameters RS=R*R*3.14return s*以下程序时求圆柱的体积以下程序时求圆柱的体积Parameters R,HS=R*R*3.14V=s*h?圆柱的体积为:圆柱的体积为:Vl函数与过程的区别函数与过程的区别函数与过程都是用于处理某一功能函数与过程都是用于处理某一功能函数有返回值,但过程没有返回值。函数有返回值,但过程没有返回值。但在但在VFP中,两者没有区别只是定义的形式不同。中,两者没有区别只是定义的形式不同。1.过程与自定义函数的定义过程与自定义函数的定义 创建过程或函数时,需要使用关键字创建过程或函数时,需要使用关键字PROCEDURE或或FUNCTION语句进行定义。语句进行定义。过程的定义格式:过程的定义格式:PROCEDURE ProcedureName PARAMETERs ParameterList Commands RETURNeExpression ENDPROC其中,其中,ProcedureName为过程的名称,为过程的名称,ParameterList为为参数的列表,参数的列表,RETURN后面为返回的值,后面为返回的值,eExpression缺缺省时返回为省时返回为.T.。l将上面的求圆面积的程序改为过程:将上面的求圆面积的程序改为过程:PROCEDURE jsCircle Parameters R S=R*R*3.14 return s ENDPROC函数定义的基本语法格式:函数定义的基本语法格式:FUNCTION FunctionName PARAMETERS ParameterList Commands RETURNeExpression ENDFUNCl将圆的程序在改为函数将圆的程序在改为函数 FUNCTION jsCircle Parameters R S=R*R*3.14 return s ENDFUNC例例5.15 下列自定义函数下列自定义函数ntoc()的功能是将一个的功能是将一个09之间的阿拉伯数字转换为一个之间的阿拉伯数字转换为一个“零零九九”之间的中之间的中文字符。例如,文字符。例如,ntoc(7)的返回值为的返回值为“七七”。function ntoc parameters pDigit local cString cString=“零一二三四五六七八九零一二三四五六七八九”return substr(cString,pDigit*2+1,2)endfunc2.过程与自定义函数的调用过程与自定义函数的调用 在调用过程或自定义函数时,可以使用在调用过程或自定义函数时,可以使用DO命令,也可以命令,也可以使用函数的调用方式。使用函数的调用方式。区别:区别:在于以函数的形式调用时有返回值。在于以函数的形式调用时有返回值。Do命令执行过程或函数的语法格式为:命令执行过程或函数的语法格式为:DO ProcedureNameIN ProgramName with ParameterList 其中,其中,IN子句用于指出过程或函数所在的文件,子句用于指出过程或函数所在的文件,with子句子句用于指定执行过程或函数需要的参数,必须和定义过程中用于指定执行过程或函数需要的参数,必须和定义过程中的参数要一样。的参数要一样。在调用某个过程或自定义函数时,也可以在调用之前通过在调用某个过程或自定义函数时,也可以在调用之前通过SET PROCEDURE TO命令打开该过程文件。假如文件的命令打开该过程文件。假如文件的名为名为procs.prg,则命令如下:,则命令如下:SET PROCEDURE TO procs.prg 当在当在DO命令后使用函数名或过程名时,命令后使用函数名或过程名时,Visual FoxPro按按照以下顺序查找函数或过程:照以下顺序查找函数或过程:在包含在包含DO命令的文件中查找。命令的文件中查找。在已打开的过程文件中找。在已打开的过程文件中找。在运行链中查找,即查找从最近运行的程序到首次运行的程序。在运行链中查找,即查找从最近运行的程序到首次运行的程序。在独立程序中找。在独立程序中找。l在求圆柱体积的程序中调用求圆面积的过程在求圆柱体积的程序中调用求圆面积的过程.parameters r,h s=jscircle(r)v=s*h?圆柱的体积为圆柱的体积为,v子程序或过程调用及返回示意图子程序或过程调用及返回示意图 例例5.16 下列程序用于计算下列程序用于计算S=1!+2!+3!+4!+5!s=0 for i=1 to 5 s=s+fjc(i)endfor?s function fjc parameters x p=1 for n=1 to x p=p*n endfor return p endfunc5.3 面向对象的程序设计l回顾面向对象设计基本思想回顾面向对象设计基本思想 认为世界是由各种对象构成,一个较复杂的对象可以认为世界是由各种对象构成,一个较复杂的对象可以由多个简单的对象组成,因而采用编程语言来描述对象。由多个简单的对象组成,因而采用编程语言来描述对象。某一类对象的集合抽象为类,如某一类对象的集合抽象为类,如“学生学生”,“教师教师”都是都是类,而某一个具体的学生,如类,而某一个具体的学生,如“张三张三”是是“学生学生”这个类这个类中的一个对象。中的一个对象。类中包含一些对象的属性和行为类中包含一些对象的属性和行为(方法方法),如,如,“学生学生”中包含属性:学号,姓名,系等,包含行为:选课,上中包含属性:学号,姓名,系等,包含行为:选课,上课等行为。课等行为。对象与对象之间通过消息来联系。对象与对象之间通过消息来联系。5.1 类和对象概述 面向对象程序设计是通过对类、子类和对象的设面向对象程序设计是通过对类、子类和对象的设计来体现的。计来体现的。l什么是类,类与对象的区别是什么?什么是类,类与对象的区别是什么?类是某一类对象的抽象集合,是对象的设计蓝图。类是某一类对象的抽象集合,是对象的设计蓝图。对象是属于某类的一个实例。对象是属于某类的一个实例。类是一个静态的概念,对象是动态的概念类是一个静态的概念,对象是动态的概念,程,程序在运行的过程中需要用类创建对象,执行对象序在运行的过程中需要用类创建对象,执行对象中的方法和属性。中的方法和属性。l对象的相关特征对象的相关特征 属性:定义对象的某个特征,如人的体重,身属性:定义对象的某个特征,如人的体重,身高,汽车的颜色,载重等。高,汽车的颜色,载重等。方法:是对象能够执行的某一个操作,现实世界方法:是对象能够执行的某一个操作,现实世界中的对象的行为,在程序设计中用方法来实现,中的对象的行为,在程序设计中用方法来实现,比如选课。比如选课。事件:是由对象识别的一个动作,可以编写相应事件:是由对象识别的一个动作,可以编写相应的代码对此动作进行响应。如,用户点击鼠标,的代码对此动作进行响应。如,用户点击鼠标,选中某一个按钮,点击某个按钮,都会引发相应选中某一个按钮,点击某个按钮,都会引发相应的事件,的事件,注意:对象的事件集是固定的,用户不注意:对象的事件集是固定的,用户不能创新新的事件。能创新新的事件。事件源某一事件调用事件处理方法引发事件的对引发事件的对象,如被点击象,如被点击按钮按钮某个对象事件的某个对象事件的集合是固定。集合是固定。来处理引发的事件来处理引发的事件lVfp中的面向对象主要用于创建用户图形界面上,中的面向对象主要用于创建用户图形界面上,如如表单表单,按钮按钮等等5.3.2 基类Vfp中,类可以分为三大类:基类、子类和用中,类可以分为三大类:基类、子类和用户自定义类。户自定义类。l基类:是基类:是vfp系统内部定义的类,不要用户系统内部定义的类,不要用户创建创建l子类:在某一个类的基础上创建的类,如子类:在某一个类的基础上创建的类,如在在person类的基础上创建,类的基础上创建,student类,那类,那么么student类就是类就是person类的子类类的子类l用户自定义的类:除了系统自带的基类,用户自定义的类:除了系统自带的基类,用户也可以根据需要自己创建类。用户也可以根据需要自己创建类。l根据基类是否能够包含其他类,又可以将根据基类是否能够包含其他类,又可以将基类分为:基类分为:容器类容器类和和控件类控件类。容器类:可以包含其他类的基类,如表单,页框,容器类:可以包含其他类的基类,如表单,页框,命令按钮组等。命令按钮组等。控件类:可以包含在容器类中的基类,如,按钮,控件类:可以包含在容器类中的基类,如,按钮,文本框等。文本框等。l根据是否可见,基类又分为根据是否可见,基类又分为可视类可视类和和非可非可视类视类 可视类:用户可以看见的,具有一定得外观的类,可视类:用户可以看见的,具有一定得外观的类,如按钮,表单如按钮,表单 非可视类:没有外观,用户不可见,如非可视类:没有外观,用户不可见,如Timer计计时器。时器。5.3.3 处理对象 当通过某个类来创建了对象之后,就可以设置或当通过某个类来创建了对象之后,就可以设置或获取对象的相关属性,调用对象中的方法了,这获取对象的相关属性,调用对象中的方法了,这称之为称之为“处理对象处理对象”。1.引用对象引用对象 在引用对象时,首先要弄清楚对象所在的层次关在引用对象时,首先要弄清楚对象所在的层次关系,即对象被包含在哪一个容器中,该容器又被系,即对象被包含在哪一个容器中,该容器又被包含在哪一容器中。如同我们访问磁盘上的某个包含在哪一容器中。如同我们访问磁盘上的某个文件一样。文件一样。在引用对象时,容器与对象之间用在引用对象时,容器与对象之间用“.”隔隔开,下面看个例子。开,下面看个例子。l表单集表单集formSet1中包含了两个表单中包含了两个表单form1和和form2;l表单表单form1中包含两个文本框中包含两个文本框Text1和和Text2,一,一个选项按钮组个选项按钮组optionGroup1、一个页框、一个页框pageFrame1;l页框页框PageFrame1中包含两个页面中包含两个页面page1和和page2;l页面页面Page1中包含一个表格中包含一个表格Grid1;l表格中包含两列表格中包含两列Column1和和Column2。(1)绝对引用绝对引用绝对引用是指从容器的最高层到被引用的对象,所绝对引用是指从容器的最高层到被引用的对象,所有对象都被一一列举出来,如引用表单有对象都被一一列举出来,如引用表单Form1中中表格表格Grid1中第一列的列表头的对象中第一列的列表头的对象:formSet1.Form1.PageFrame1.Page1.Grid1.Header1注意:注意:当表单的名称与表单文件的名称不同名时,当表单的名称与表单文件的名称不同名时,引用表单中的对象,一定要用表单的文件名,如,引用表单中的对象,一定要用表单的文件名,如,表单名:表单名:Form1,而表单的文件名为:,而表单的文件名为:abc,则,则引用表单中对象引用表单中对象Text1时,要用时,要用abc.Text1。(2)相对引用相对引用相对引用是指在容器层次中相对某个容器层次的引相对引用是指在容器层次中相对某个容器层次的引用,一般用在某个控件的事件处理代码中。经常用,一般用在某个控件的事件处理代码中。经常使用使用This,ThisForm,ThisFormset等。等。如,要在选项按钮组如,要在选项按钮组OptionGroup1的某个事件代的某个事件代码中引用文本框码中引用文本框Text1,则可以使用如下的相对引,则可以使用如下的相对引用之一:用之一:This.PARENT.Text1;ThisForm.Text1;ThisFormSet.Form1.Text1 此外,当我们不知道当前要处理的对象的名称时,此外,当我们不知道当前要处理的对象的名称时,可以使用可以使用ActiveForm和和ActiveControl的组合来的组合来使用:使用:_SCREEN.ActiveForm _SCREEN.ActiveForm.ActiveControl其中,其中,_SCREEN表示屏幕对象,即系统的主窗口。表示屏幕对象,即系统的主窗口。2.设置对象属性设置对象属性 每一个对象都有相关的属性,那么如何获取这些每一个对象都有相关的属性,那么如何获取这些属性的值呢?以及如何给这些属性设置新值呢?属性的值呢?以及如何给这些属性设置新值呢?获取对象的属性值获取对象的属性值 格式:变量格式:变量=引用的对象引用的对象.属性属性 s=label1.caption设置对象的属性设置对象的属性 格式:引用的对象格式:引用的对象.属性属性=值值 如,如,label1.caption=“你好你好”又如,给又如,给Text1文本框的值,和前景色,背景色,字体设置文本框的值,和前景色,背景色,字体设置属性:属性:FormSet1.Form1.Text1.Value=Date()FormSet1.Form1.Text1.ForeColor=RGB(0,0,0)FormSet1.Form1.Text1.BackColor=RGB(192,192,192)FormSet1.Form1.Text1.FontName=“黑体黑体”如果给同一个对象的多个属性赋值可用如果给同一个对象的多个属性赋值可用withendwith语句。语句。with FormSet1.Form1.Text1 .Value=Date().ForeColor=RGB(0,0,0).BackColor=RGB(192,192,192).FontName=“黑体黑体”endwith3.调用对象的方法调用对象的方法 对象中除了包含一些属性外,还包含一些方法,对象中除了包含一些属性外,还包含一些方法,这些方法说明了该对象具有哪些功能。调用对象这些方法说明了该对象具有哪些功能。调用对象方法的格式为:方法的格式为:引用对象名称引用对象名称.方法名方法名 如,如,FormSet1.Form1.Text2.SetFocus FormSet1.Form1.Refresh注意:如果方法程序具有返回值,则需要在方法后注意:如果方法程序具有返回值,则需要在方法后面加面加”()”,需要参数的方法,参数也必须写在,需要参数的方法,参数也必须写在()中。中。如,如,s=form1.A.F(5)4.对事件的响应对事件的响应 当对象的某个事件发生,该事件的处理程序将被当对象的某个事件发生,该事件的处理程序将被执行,来处理该事件,但如果没有编写该事件的执行,来处理该事件,但如果没有编写该事件的处理程序,则不会发生任何操作。处理程序,则不会发生任何操作。5.3.4 事件模型l核心事件核心事件 见表见表5-6。l容器层次与类层次中的事件容器层次与类层次中的事件 容器不处理与所包含的控件相关联的事件;容器不处理与所包含的控件相关联的事件;如果没有与控件相关的事件代码,如果没有与控件相关的事件代码,vfp将在类层将在类层次的更高层次上检查是否与此事件相关联的控件次的更高层次上检查是否与此事件相关联的控件代码。代码。表单有表单有Click事件处理方事件处理方法程序法程序没有没有Click事件处事件处理方法程序理方法程序虽然,虽然,Form1具有具有click事件处理方法,而事件处理方法,而Commad1按钮没有,但是按钮没有,但是Form1是容器,因而不会处理是容器,因而不会处理Commad1按钮的按钮的click事件。事件。但是也有两种特殊情况,就是但是也有两种特殊情况,就是选项按钮组选项按钮组和和命令按钮组命令按钮组。当某一个选项按钮被单击时,如果有自己的当某一个选项按钮被单击时,如果有自己的Click事件的事件的处理程序,则执行自己的,否则如果选项按钮组存在处理程序,则执行自己的,否则如果选项按钮组存在click事件处理程序,则执行选项按钮组的。事件处理程序,则执行选项按钮组的。Option1具有click事件处理方法,将label控件输出“你好”Optiongroup1也click事件处理方法,将label控件输出“你坏”Option2没有cilck事件处理方法,当它被单击时只能调用其容器Optiongroup1中的方法。3.事件激发的顺序事件激发的顺序 见表见表5-7.4.常用的事件常用的事件 在在vfp中,常用的事件可以归类于中,常用的事件可以归类于鼠标事件鼠标事件,键盘键盘事件事件,表单事件表单事件,控件焦点事件控件焦点事件,数据环境事件数据环境事件等类型。等类型。(1)鼠标事件鼠标事件 鼠标事件主要有:鼠标事件主要有:click事件事件(即鼠标的单击事件即鼠标的单击事件),RightClick事件事件(鼠标右击事件鼠标右击事件),DblClick事件事件(鼠标的鼠标的双击事件双击事件)。(2)键盘事件键盘事件与键盘相关的事件主要有与键盘相关的事件主要有KeyPress事件,当事件,当按下并释放某个键盘键时引发该事件。按下并释放某个键盘键时引发该事件。(3)改变控件内容的事件改变控件内容的事件 InteractiveChange事件:使用键盘或鼠标改变事件:使用键盘或鼠标改变某个控件的值时,引发该事件。某个控件的值时,引发该事件。ProgrammaticChange事件:在程序代码中改事件:在程序代码中改变某个控件的值时,引发该事件。变某个控件的值时,引发该事件。(4)焦点事件焦点事件 焦点焦点(Focus)用以指出当前被操作的对象。与焦点相关的用以指出当前被操作的对象。与焦点相关的事件主要有事件主要有GotFocus事件,事件,LostFocus事件,事件,when事件事件和和Valid事件。事件。GotFocus事件,当某个对象获得焦点时,引发该事件。注意,只事件,当某个对象获得焦点时,引发该事件。注意,只有当对象的有当对象的Enabled属性和属性和Visible属性均为属性均为.T.时对象才能获得焦时对象才能获得焦点。点。LostFocus事件,当对象失去焦点时,引发该事件。事件,当对象失去焦点时,引发该事件。when事件,在对象接受焦点之前引发该事件。事件,在对象接受焦点之前引发该事件。Valid事件,在对象失去焦点之前引发该事件。事件,在对象失去焦点之前引发该事件。四个事件的顺序为:四个事件的顺序为:when事件,事件,gotFocus事件,事件,Valid事件,事件,lostFocus事件。事件。(5)表单表单(集集)事件事件 表单事件指在表单上操作引发的事件。主要事件为:表单事件指在表单上操作引发的事件。主要事件为:Load事件,事件,Active事件,事件,Unload事件,事件,Paint事件和事件和Resize事件等。事件等。在创建对象在创建对象(表单、表单集、控件表单、表单集、控件)之前发生之前发生load事件,因事件,因此不能在此不能在load事件的处理程序中操作控件。事件的处理程序中操作控件。当表单,表单集或页对象被激活时引发当表单,表单集或页对象被激活时引发Active事件。事件。当对象被释放时引发当对象被释放时引发Unload事件。事件。(6)数据环境事件数据环境事件 数据环境包括了与表单或报表相关的表和视图,以及它们数据环境包括了与表单或报表相关的表和视图,以及它们之间的关系。与数据环境有关的事件主要有之间的关系。与数据环境有关的事件主要有BeforeOpenTables事件和事件和AfterCloseTables事件。事件。BeforeOpenTables事件发生在于表单或报表的数据环境事件发生在于表单或报表的数据环境相关的表和视图打开之前。相关的表和视图打开之前。AfterCloseTables事件发生在表单的数据环境中释放表或事件发生在表单的数据环境中释放表或视图后。视图后。(7)其他事件其他事件创建对象时引发创建对象时引发Init事件,注意容器中对象的事件,注意容器中对象的Init事件在容事件在容器的器的Init事件之前发生,因此在容器的事件之前发生,因此在容器的Init事件中可以处理事件中可以处理容器中包含的对象。容器中包含的对象。当释放一个对象时发生当释放一个对象时发生Destroy事件。容器的对象的事件。容器的对象的Destroy事件在它所包含的对象的事件在它所包含的对象的Destroy事件之前发生。事件之前发生。当某个方法在运行出错时引发当某个方法在运行出错时引发Error事件。事件。