VisualFoxPro实用教程(第2版)(十一五国家规划)第03章程序设计基础.ppt_第1页
VisualFoxPro实用教程(第2版)(十一五国家规划)第03章程序设计基础.ppt_第2页
VisualFoxPro实用教程(第2版)(十一五国家规划)第03章程序设计基础.ppt_第3页
VisualFoxPro实用教程(第2版)(十一五国家规划)第03章程序设计基础.ppt_第4页
VisualFoxPro实用教程(第2版)(十一五国家规划)第03章程序设计基础.ppt_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章程序设计基础,3.1 数据类型 3.2 操作符和表达式 3.3 流程控制 3.4 过程和自定义函数 3.5 变量的作用范围 3.6 数据库的存储过程和触发器,3.1 数据类型,VFP中,存储数据有下列方式: (1) 表的记录。表打开后,通过引用字段名就可得到对应该字段当前记录的内容(值)。通过交互方式和操作表的命令可修改字段在记录中的内容。 (2) 对象。 (3) 常量、变量和数组。在程序设计时经常要用这些数据元素存储数据。 这些记录、对象、常量、变量和数组称为存储数据的容器。,3.1.1 常量,常量是一个数据项,该数据项在程序运行过程中保持不变。 一般常量 一般常量就是直接描述的常量。下列常量都是一般常量: 数值型常量: -25, 128.43, 0。 字符型常量: 01002, “王 红”, 128.43, 。表示空串。 日期型常量: 2000.08.19, , CTOD(“06/18/99”)。表示空日期。字符串表示日期常量时需用CTOD()函数进行转换,字符串表示日期的格式与当前系统默认的日期格式一致。当前系统默认的日期格式可通过SET DATE TO命令进行设置。 逻辑型: 真为.T., .Y.。假为.F. , .N.。 2. 符号常量 符号常量就是在程序中为一个符号先定义一个值, 程序中凡使用该值的地方就写上该符号常量。编译该程序时,编译程序将程序出现该符号常量中的地方用定义的值直接代替。符号常量又称编译常量。 使用符号常量的好处是当值需要改变时只需改变符号常量定义的值即可。 注意: 程序中不能对符号常量重新赋值,符号常量不是变量。 符号常量定义: #DEFINE符号常量名 值 例如,#DEFINE PI 3.14159,3.1.2 变量,1. 变量赋值 变量赋值的语句有下列两个: 格式:变量名=值 STORE 值 TO变量名表 有些命令对变量不需事先声明就可直接赋值。赋值的同时该变量就被创建,变量类型取决于赋予的值的类型。 【例Ex_VFPStore】变量直接赋值。 SET TALK OFF USE RY!工资情况 SUM 技能工资, (岗位工资+浮动工资)*1.2 TO JN, GWFD FOR 编号 ”01” ? JN,GWFD USE 运行后,结果自动产生变量JN和GWFD,并存放技能工资和 (岗位工资+浮动工资)*1.2累加值,3.1.2 变量,2. 变量的引用 在程序中变量可直接用变量名引用其值。如果当前打开的表中有与变量同名的字段名,这时用M.变量名引用该变量, 而字段名可直接引用。 【例Ex_Muse】变量的引用。 USE 基本情况 编号=”04012” &给内存变量“编号”赋值 &给字段名为“编号”赋值使用REPLACE或UPDATE命令 ? 编号 &显示1号记录编号字段的内容 ? 基本情况.编号 &显示1号记录编号字段的内容 ? M.编号 &显示04012 下面列出字段值的引用和对象属性的引用方法: 变量的引用: M.内存变量名 字段值的引用: 数据库名!表名.字段名 对象属性的引用: 对象名.属性名 把这些引用统一起来,都可以认为是对象引用,可把M和表都看成对象。 例如: #DEFINE PI 3.14159 S=PI*8*8 THISFORM.TEXT1.VALUE=S,3.1.2 变量,3. 显示变量 格式: DISPLAY MEMORY LIKE 文件名框架 NOCONSOLE TO PRINTER PROMPT | TO FILE 文件名 格式: LIST MEMORY LIKE 变量名框架 NOCONSOLE | TO FILE 文件名 可用LIKE 变量名框架限制显示的变量名。框架可用*和?进行描述。 TO PRINTER:显示记录送打印机打印。带PROMPT项,打印前打开打印对话框,用户可在该对话框中对打印机进行设置。 TO FILE 文件名:显示记录送到指定的文件中保存。 4. 变量的保存和恢复 (1) 保存变量 格式: SAVE TO 文件名 | MEMO 备注字段名 ALL LIKE 变量名框架 | ALL EXCEPT 变量名框架 该命令将当前内存变量保存到文件或备注字段中。 ALL LIKE变量名框架:指定保存的变量范围。可使用*和?描述框架。ALL EXCEPT指定不保存的变量范围。 (2) 恢复变量 格式: RESTORE FROM文件名 | MEMO 备注字段名 ADDITIVE 从保存变量的文件或备注字段中恢复变量到内存中。不覆盖当前已有内存变量。,3.1.2 变量,5. 内存变量的释放 格式: RELEASE 变量名表 | ALL LIKE变量名框架 | EXCEPT变量名框架 【例Ex_Release】内存变量的释放。 OLDDate= CTOD(“06/18/99”) NAME1=”肖文红” GZ1=1633 NAME2=”朱 平” GZ2=1834 NAME3=”杨 华” GZ3=1183 DISPLAY MEMORY &显示所有内存变量 SAVE TO MFILE DISPLAY LIKE NAME* &显示所有NAME打头的内存变量 RELEASE ALL EXCEPT GZ* DISPLAY MEMORY &显示所有内存变量 CLEAR MEMORY &清除所有内存变量 RESTORE FROM MFILE DISPLAY MEMORY,3.1.2 变量,6. 变量和表 (1) 表字段到内存变量 格式:SCATTER FIELDS 字段名表 | LIKE字段名描述框架 | EXCEPT 字段名描述框架 MEMO TO数组名 | TO 数组名 BLANK |MEMVAR|MEMVARBLANK | NAME 对象名 BLANK 说明:将当前表的当前记录中FILEDS指定的字段的值放到数组、内存变量或对象中。其中,内存变量的名字与字段名相同。选对象项,对象生成与字段名同名的属性,字段的值放入相应的属性中。选MEMO,则包含备注型字段。 【例Ex_Scatter】表字段到内存变量。 USE 工资情况 GO 3 SCATTER MEMVAR ? M.其他工资, 工资情况.其他工资 &值不同 SCATTER NAME GZ ? GZ.其他工资, 工资情况.其他工资 &值不同 USE DISPLAY MEMORY,3.1.2 变量,(2) 内存变量到表字段 格式: GATHER FROM 数组名| MEMVAR | NAME对象名 FIELDS 字段名表 | LIKE字段名描述框架 | EXCEPT 字段名描述框架 MEMO 该命令用数组、内存变量或对象的值更新当前表的当前记录。 【例Ex_Gather】内存变量到表字段。 USE 工资情况 GO 3 M.其他工资=120 ? M.其他工资, 工资情况.其他工资 &值不同 GATHER MEMVAR ? M.其他工资, 工资情况.其他工资 &值相同 USE,3.1.3 数组,1. 数组的定义 数组就是变量名相同而下标不同的一组变量。数组用下列语句定。 格式:DIMENSION 数组名下标最大值表 例如, DEMINSION NAME100, CJ5,10 注意:由数据库操作命令存放结果的数组系统会自动建立。 2. 表数据传送到数组 数组与表之间、变量与表之间都可交换数据,通过数组不仅传送的数据多、速度快,而且还具有自动定位、使用简单方便。数组与表之间的数据传送分为表数据到数组和数组数据到表两个方向。 先介绍表数据传送到数组。 格式: COPY TO ARRAY FIELDS WHILE FOR NOOPTIMIZE 将当前工作区中打开的表当前指针开始的若干记录的指定字段内容复制到指定数组中。,3.1.3 数组,3. 数组内容传送到表 格式1: APPEND FROM ARRAY FROM FIELDS 将数组中的内容加到当前表中(不包括记忆型和通用型字段)。 格式2: INSERT INTO FROM ARRAY | MEMVAR 将数组或一组与表字段同名的内存变量中的内容插入或追加到指定表中。 【例Ex_ACopy】设计程序, 复制表中最后一条记录后再修改。 USE 工资情况 GO BOTTOM COPY TO ARRAY TARR NEXT 1 APPEND FROM ARRAY TARR &表中不能有不许有重复记录的索引 EDIT USE DISPLAY MEMORY LIKE TARR*,3.1.3 数组,4. 操作数组的函数 使用数组的函数很多, 这里仅列出常用的操作数组的函数。 (1) 数组拷贝 格式: ACOPY(, ,) (2) 数组删除 格式: ADEL(,2) (3) 文件名到数组 格式: ADIR(,) 该函数能得到指定目录中文件名框架的文件的情况。返回的数组中的内容如表3.1所示。属性描述的功能如表3.2所示。 例如,ADIR(AA,”D:RY_MIS*.DBF”,”AD”) ? AA1,1,AA1,2,AA1,3,AA1,4,AA1,5 ? AA2,1,AA2,2,AA2,3,AA2,4,AA2,5 ? AA3,1,AA3,2,AA3,3,AA3,4,AA3,5 ,3.1.3 数组,3.1.3 数组,(4) 得到元素序号 格式: AELEMENT(,) (5) 表结构到数组 格式: AFIELDS() (6) 数组插入 格式: AINS(,2) (7) 得到数组大小 格式: ALEN(,) (8) 数组定位 格式: ASCAN(,) (9) 数组排序 格式: ASORT(, ,) (10) 由序号得到下标 格式: ASUBSCRIPT(,),3.1.3 数组,【例Ex_Array】数组函数应用。 DIMENSION AA5 AA1=2 AA2=4 AA3=1 AA4=3 AA5=5 ? AA1,AA2,AA3,AA4,AA5 &显示 2 4 1 3 5 ? ASCAN(AA,1) &显示 3 =ASORT(AA) ? ASCAN(AA,1) &显示 1 ? AA1,AA2,AA3,AA4,AA5 &显示 1 2 3 4 5 =ADEL(AA,1) ? ALEN(AA) &显示 4 ? AA1,AA2,AA3,AA4,AA5 &显示 2 3 4 5 .F.,3.2.1 操作符,数值操作符 数值操作符用于进行数值运算,优先级从高到低为: +,-号*,*,/,%+,-。 例如: -12.4/3+56,2. 字符操作符 字符操作符用于进行字符运算,优先级从高到低为: +,-$。 例如,职称+DTOC(出生时间) , ”王”$姓名,3.日期操作符 日期操作符用于进行日期运算,日期操作符没有优先级。 例如,DATE()-出生时间+1, DATETIME()-2000.10.1.12:00PM,3.2.1 操作符,4. 关系操作符 关系操作符用于进行关系运算,关系操作符没有优先级。 例如,工资=800, 编号 “ ”,5. 逻辑操作符 逻辑操作符用于进行逻辑运算,优先级从高到低为: .NOT.,! .AND. .OR. 例如, 职称=”工程师”.AND.DATE()-出生时间35 各操作符之间优先级如下:数值操作符, 字符操作符, 日期操作符关系操作符操作符优先级,在同一表达式中,优先级相同的运算符,则按从左到右的次序进行运算。括号() 可以改变运算的优先级,运算时总是先算括号里面的。注意,括号必须成对出现。,3.2.2 常用函数,1. 数值函数 l LEN(c)得到字符串c的长度(字符数)。 例如: LEN(“01002”)=5 USE 基本情况 LEN(姓名+职称)=14 l INT(n) 取数值n的整数部分。 例如: INT(680.34)=680 l RECNO() 得到当前记录号。 例如: USE 基本情况 ? RECNO() 值为1 SKIP ?RECNO() 值为2 SQRT(n) 求n的算术平方根。,2. 字符函数 l LEFT(c,n) 取字符串c左边n个字符。 例如: LEFT(“王 红”,2) =”王” l RIGHT(c,n) 取字符串c右边n个字符。 l SUBSTR(c,n1,n2) 取字符串c第n1个 字符开始的n2个字符 。 l TRIM(c) ,RTRIM(c) ,LTRIM(c), ALLTRIM(c) 去字符串c后面、后面、左、左右的空格字符。 l EMPTY(c) 判字符串c是否为空。,3.2.2 常用函数,3. 日期函数 l DATE() 得到当前日期。 l TIME() 得到当前时间字符串。 l DATETIME() 得到当前日期时间。 l YEAR() 得到当前年的数值。 l MONTH() 得到当前月的数值。 l DAY() 得到当前日的数值。 4. 数据类型转换函数 l STR(n,n1,n2) 将数值转换为字符串。n1为总长度, n2为小数位。 例如: STR(1002)=” 1002” STR(编号,4,0)= “1002” l VAL(s) 将数值字符串s转换为数值。 例如: VAL(“01004”)=1004.00 USE 基本情况 VAL(编号)=1002 l DTOC(d)将日期d转换为日期字符串。 l CTOD(c)将日期字符串c转换为日期。,l TTOC(t) 将时间t转换为时间字符串。 l CTOT(C) 将时间字符串c转换为时间。 l CHR(n) 得到n的ASCII码字符。 l ASC(c) 得到字符的ASCII码。 5. 表操作函数 l EOF() 判断是否超出表的末尾。 l BOF() 判断是否超出表的首行。 l RECCOUNT() 得到表的记录数。 l FCOUNT()得到表的字段数。 6. 其他函数 l FILE(c) 判断c文件是否存在。 l MESSAGEBOX(提示文本 ,对话框类型 ,对话框标题文本) 显示字符串c。,3.2.2 常用函数,3.2.2 常用函数,例如: yes =MESSAGEBOX(“工资报表已经生成!“,0+64,“人员工资情况“) 显示结果如图3.1左所示。 yes= MESSAGEBOX(“是否删除该记录“,4+32,“人员基本情况“) ? yes 显示结果如图3.1右所示。 图3.1 MESSAGEBOX函数,3.2.3 表达式,1. 字符串表达式 USE 基本情况 ? 基本情况.姓名+”工资为”+STR(基本情况.工资,8,2) ? 后面的就是字符串表达式。 2. 数值表达式 #DEFINE PI=3.14159 ? PI*THISFORM.txtR.VALUE2- PI*82 3. 日期表达式 ? DATE()+20 4. 逻辑表达式 USE 工资情况 LOCATE FOR (LEFT(编号,2)=”01”.OR. LEFT(编 号,2)=”04”).AND.岗位工资200 FOR后的就是逻辑表达式。,3.2.3 表达式,5. 名称表达式 名称表达式是由圆括号括起来的一个字符串表达式,可以用来替换命令和函数中的名称。 【例Ex_Nexp】名称表达式。 BM=”基本情况” GZ=”工资” USE (“RY!”+BM) REPLACE (GZ) WITH (GZ)+100 6. 宏代换 宏代换和名称表达式的作用类似, 但宏代换是用“&变量.”替换名称。当宏代换与其他字符串连在一起使用时要使用“.”进行分隔。 【例Ex_&】宏代换。 KM=”RY!” USE &KM.基本情况 GZ=”工资” REPLACE &GZ WITH &GZ+100 M.&GZ=&GZ ? M.&GZ,3.3.1 顺序,顺序结构由一系列语句组成,程序运行时按顺序执行语句。 例如: OPEN DATABASE RY USE 基本情况 BROWSE CLOSE DATABASE,3.3.2 条件分支,1. IF分支 格式: IF 条件 语句序列 ELSE 语句序列 ENDIF 功能:如果条件成立,则执行语句序列,否则执行语句序列。 【例Ex_Equation】 求ax2+bx+c=0的方程的解。图3.2 计算一元二次方程根界面,求一元二次方程的解公式如下: (1)设计表单 标签Label1Label5作信息提示;文本框txtA、txtB和txtC分别用于输入a,b,c系数,文本框txtX1、txtX2放入方程根x1和x2;一个命令按钮cmdStart用于执行计算。,3.3.2 条件分支,(2).设置对象属性 (3) 算法分析 方程的根有以下几种可能: a=0,不是一元二次方程。 b2-4ac=0,有两个相等的实根。 b2-4ac0,有两个不等的实根。 b2-4ac0,没有实数根。,表3.10 计算一元二次方程根对象属性,3.3.2 条件分支,(4) 编写代码 * 计算按钮(cmdOK)的Click事件代码 a=Thisform.txtA.Value b=Thisform.txtB.Value c=Thisform.txtC.Value DT=b*b-4*a*c If a!=0.AND.DT=0 x1=(-b+Sqrt(DT)/(2*a) x2=(-b-Sqrt(DT)/(2*a) Thisform.txtX1.Value=x1 Thisform.txtX2.Value=x2 Thisform.Refresh Else If a=0 Messagebox(“a不能为0!“) Else Messagebox(“没有实数解!“) Endif Endif,3.3.2 条件分支,2. CASE分支 格式: DO CASE CASE 条件1 语句序列 CASE 条件2 语句序列2 OTHER 语句序列n ENDCASE 功能: 从第一个CASE开始判断,若条件i成立,则执行语句序列i,然后跳,到ENDCASE后的语句。选OTHERWISE, 图3.3 成绩分段统计界面 则在所有CASE条件均不满足时,执行其后的语句序列n。 【例Ex_CountCJ】统计成绩分数段。 (1) 设计表单 表单包含下列对象:标签Label1Label2作信息提示;文本框txtCJ用于输入成绩,文本框txt9txt5存放各分数段的统计结果;一个命令按钮cmdOK用于执行统计,输一个成绩统计一次。,3.3.2 条件分支,(2)设置对象属性 表3.11 成绩分段统计对象属性,表3.11 成绩分段统计对象属性,3.3.2 条件分支,(3) 编写代码 确定按钮(cmdOK)的Click事件代码: cj=Thisform.txtCJ.Value If cj100 Messagebox(“输入的成绩不正确!“) Else Do Case Case cj=90 Thisform.txt9.Value=Thisform.txt9.Value+1 Case cj=80.and.cj=70.and.cj=60.and.cj70 Thisform.txt6.Value=Thisform.txt6.Value+1 Case cj60 Thisform.txt5.Value=Thisform.txt5.Value+1 Endcase Endif Thisform.Refresh,3.3.3 循环控制,1. FOR循环 格式: FOR 变量=初值 TO 终值 STEP 步长 语句序列 ENDFOR | NEXT变量 只要变量的值小于等于终值,重复执行循环体中的语句序列。 具体执行步骤如下: (1) 给变量赋初值; (2) 判断变量的值是否小于等于终值; (3) 若不是, 则循环结束; (4) 若是, 则执行语句序列; (5) 变量=变量+步长 , (若省略STEP, 则步长=1); (6) 转(2)。,3.3.3 循环控制,【例Ex_ni】计算的阶乘。 (1) 设计表单 表单包含下列对象:标签Label1Label2作信息提示;文本框Text1用于输入n,文本框Text2存放n!的计算结果;一个命令按钮Command1用于执行计算。 图3.4 计算的阶乘界面,3.3.3 循环控制,(2) 设置对象属性 (3) 编写代码 计算按钮的Click事件代码: n=Thisform.Text1.Value If n=0 表3.12 计算的阶乘对象属性 Return Endif n1=1 For i=1 To n n1=n1*i Endfor Thisform.Text2.Value=n1 Thisform.Refresh,3.3.3 循环控制,2. WHILE 循环 格式: DO WHILE 条件 &循环起始及条件语句 语句序列 &循环体 ENDDO &循环终止语句 只要条件为真,重复执行循环体中的语句序列。 语句序列中遇到退出循环语句EXIT,则退出循环体,执行ENDDO后面的语句。语句序列中遇到跳转语句LOOP,则跳过该语句到ENDDO之间的语句。 循环语句本身可以嵌套,并且可以与其它控制语句互相嵌套,但不允许有交叉。 这些规则也适用FOR循环和SCAN循环。,3.3.3 循环控制,【例Ex_n!_w】修改Ex_n!程序, 改用WHILE循环计算的阶乘。 (1) 设计界面(同上) (2) 设置对象属性(同上) (3) 编写代码 计算按钮的Click事件代码: n=Thisform.Text1.Value If n=0 Return Endif n1=1 I=1 Do While I=n n1=n1*I I=I+1 Enddo Thisform.Text2.Value=n1 Thisform.Refresh,3.3.3 循环控制,3. SCAN循环 格式: SCAN 范围 FOR 条件 语句序列 ENDSCAN 只要当前打开的表范围内满足条件,就执行语句序列。不满足条件或超出范围,退出循环。SCAN循环能自动跳到下一个记录。 【例Ex_AverGZ】计算平均技能工资。 (1) 设计表单 在例Ex_EditGZ.scx表单文件中增加命令按钮(cmdAVER),计算当前显示的人员所在部门的平均工资的。 (2) 设置对象属性(同例Ex_EditGZ)。 (3) 编写代码,* 计算按钮(cmdAVER)的Click事件代码 S=0 JS=0 BH=LEFT(编号,2) Scan For 编号=BH S=S+工资情况.技能工资 Thisform.Refresh Wait “ Timeout 1 &等待1秒 JS=JS+1 Endscan Messagebox(“部门编号为”+BH+” 的平均工资=“+Str(S/JS),3.4.1过程和自定义函数的定义,过程格式: PROCEDURE 过程名 PARAMETERS 变量名表 语句序列 RETURN 返回值 自定义函数格式: FUNCTION 函数名 PARAMETERS 变量名表 语句序列 RETURN 返回值 子程序格式: PARAMETERS 变量名表 语句序列 RETURN 返回值 过程和自定义函数分别用PROCEDURE和FUNCTION语句引导。过程或自定义函数可存放在下列位置: (1) 一个独立的程序的结束语句后面可同时存放过程或自定义函数,包含该过程或自定义函数的程序可直接调用该过程或自定义函数。 (2) 在一个过程文件中, 集中存放多个过程或自定义函数, 应先用下列命令打开,其后所有程序均可调用。,3.4.1过程和自定义函数的定义,格式:SET PROCEDURE TO 过程文件名表 ADDITIVE 系统可同时打开多个过程。选ADDITIVE, 在打开当前过程文件时原先的过程不关闭。 不再使用过程文件时用RELEASE PROCEDURE命令关闭指定过程文件。 (3)数据库的存储过程存放过程或自定义函数, 打开数据库时这些过程或自定义函数同时被打开,在打开该数据库后所有程序均可调用。 VFP中, 数据库包含的过程叫存储过程。打开数据库时,数据库中的所有过程被打开。在数据库的可视状态,右击按钮,选存储过程可对其中的过程进行编辑。在“项目管理器”中,存储过程作为数据库的一个成员列出。单击它即可对其进行编码操作。 数据库中的过程用COPY PROCEDURE命令拷出。过程文件也可用APPEND PROCEDURE命令加入数据库中。 (4) 若一个文件存放一个自定义函数或过程的代码,则也可使用子程序格式,这时文件名就是子程序名,并称该程序为子程序。程序的任何位置均可调用该子程序。 有时自定义函数或过程统称为子程序。,3.4.2 自定义函数和过程的调用,1. DO调用 格式: DO 自定义函数名 WITH 表达式表 WITH 表达式表用于向自定义函数传递参数。 2. 函数方式调用 格式: 变量名=函数名(表达式表) 表达式表用于向自定义函数传递参数。采用这种方式调用自定义函数,要求自定义函数中用RETURN 返回值,返回值就是函数的值。,3.4.2 自定义函数和过程的调用,【例Ex_DoP】自定义过程。 * MAIN PROGRAM 1 num=6 JC=0 DO CAL WITH num ? “6!=”, JC & 显示6!= 720 JC=0 =CAL(num) ? “6!=”, JC & 显示6!= 720 CANCEL PROCEDURE CAL PARAMETER n If n=0 Return Endif JC=1 i=1 Do While i=n JC=JC*i i=i+1 Enddo RETURN,【例Ex_Fun】自定义函数。 * MAIN PROGRAM 2 num=6 JC=CAL(num) ? “6!=”, JC & 显示6!= 720 ? “6!=”, CAL(num) & 显示6!= 720 CANCEL FUNCTION CAL PARAMETER n If n=0 Return -1 Endif JC=1 i=1 Do While i=n JC=JC*i i=i+1 Enddo RETURN JC,3.4.3参数传递方法,自定义函数要接收调用程序的参数, 在自定义函数中的第一个语句应为PARAMETERS。 格式: PARAMETERS 变量名表 LPARAMETERS 变量名表 其中“变量名表”中变量的个数和位置顺序必须与调用程序参数传递的“表达式表”的个数和位置顺序相同。实际传递的参数个数可用PARAMETERS()函数得到。VFP中, 参数传递有下列两种方法: (1) 按引用方式传递 调用程序通过引用方式向过程传送变量和数组。如果在被调用的过程中一个值被改变,则新的值被传送回调用程序的相关的变量或数组中。 (2) 按赋值方式传递 如果要通过赋值方式向过程传送变量或数组,被调用的过程中任何参数的改变都不会传送到调用程序相关的变量或数组中。 缺省情况下, 变量通过引用传送到一个过程,通过赋值传送到用户定义的函数(UDF)。如果通过引用把变量传送到用户定义的函数中,则使用下列命令: 格式: SET UDFPARMS TO REFERENCE 按引用 SET UDFPARMS TO VALUE 按值 但是, 不管设置成何种方式, 如在传递时在变量两边加“()”则为传值方式,在变量前加“”则为传地址方式。,3.4.3参数传递方法,【例Ex_UDF】参数传递演示程序。 SET UDFPARMS TO VALUE X=1 =INC(X) MESSAGEBOX(“X=”+STR(X) & 显示X=1 X=1 =INC(X) MESSAGEBOX(“X=”+STR(X) & 显示X=2 SET UDFPARMS TO REFERENCE X=1 =INC(X) MESSAGEBOX(“X=”+STR(X) & 显示X=2 X=1 =INC(X) MESSAGEBOX(“X=”+STR(X) & 显示X=1 * FUNCTION INC PARAMETER TEMP TEMP=TEMP+1 RETURN TEMP,3.5变量的作用范围,变量的作用范围遵循下列规则: (1) 子程序使用调用程序中的变量 调用程序中使用的内存变量可以在被调用的程序中直接引用和修改。 (2) 公用变量 所有程序中使用和重新赋值的变量称为公用变量。公用变量用下列语句定义: 格式: PUBLIC 变量名表 | ARRAY 数组名表 变量名表若是数组,则必须同时指定它的最大下标,并且数组名前也可加ARRAY说明。在定义这些变量为公用变量(局部变量)的同时,它们本身就同时被定义。对于数组也就不要再用DIMENSION进行定义了。 (3) 局部变量 仅本程序使用的变量称为局部变量。局部变量仅在本程序中定义, 可以与调用它的程序中使用的变量同名。退出该程序后, 局部变量就被释放。局部变量用下列语句定义: 格式: PRIVATE 变量名表 | ARRAY 数组名表 | ALL LIKE 结构 | ALL EXCEPT结构,3.5变量的作用范围,用PRIVATE命令定义局部变量的程序调用的子程序中仍可使用和对其进行修改。但下面的命令定义的局部内存变量在其调用的子程序中不能使用和修改: 格式: LOCAL 变量名表 | ARRAY 数组名表 局部内存变量和数组赋值之前定义,局部内存变量和数组只能在创建它们的过程和函数内部使用和修改。不能被调用它或它调用的程序中访问。一旦包含局部内存变量和数组的过程或函数执行完毕,该局部内存变量和数组被释放。 局部变量可通过引用方式进行传递。,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论