第二章 VFP语言基础
2.1 程序设计概述
1. 程序设计方法简介
设计方法 |
主要概念 |
设计过程 |
程序执行方式 |
结构化程序设计 |
功能模块(即过程、自定义函数) |
编制各个功能模块,再用主程序将它们串起来 |
将应用程序分解成若干功能模块,通过各模块的相互调用来完成整个执行过程,是过程驱动的。 |
面向对象程序设计 |
类、对象、属性、事件、方法 |
设计类、子类、对象(设计外观、设置属性、为事件编写方法程序) |
将应用程序分解成具有特定属性的对象,通过调用各对象的不同方法来完成相关事件,是事件驱动的。 |
2.数据类型
VFP 包含下列数据类型:
通用的数据类型 |
字符型
Character |
货币型
Currency |
日期型
Date |
日期时间型
DateTime |
逻辑型
Logical |
数值型
Numeric |
仅用于字段的数据类型 |
双精度型
Double |
浮点型
Float |
整型
Integer |
通用型
General |
备注型
Memo |
|
3. 数据容器
VFP中用来存储数据的容器有:常量、变量、数组、记录和对象。
(1) 常量(constants):
一个在操作过程中保持不变的数值或字符串。
常用的常量类型
常量类型 |
数值型常量 |
字符型常量 |
逻辑型常量 |
日期型常量 |
表示方式 |
-25.36 |
"abc","123","中国" |
.T. .F. |
{^2005/07/10} |
(2)变量(variables):
是内存中的一个存储单元的位置,其中的内容可以变化,但标识该存储位置的名称(即变量名)不变。
变量的命名习惯: 类型变量代号
如:cStud 、nCj 、dCsrq ——
分别代表一个字符型、数值型、日期型的变量名
变量的赋值方式: 1) 用 STORE 命令 如:STORE "王兰" TO cStud
2) 用赋值操作符 = 如:cStud = "王兰"
变量的作用域: 即变量起使用的有效范围。
变量作用域 |
定义作用域的关键字 |
特点 |
局部变量
local variable(本地变量) |
LOCAL |
只能在一个函数或过程中被访问,其他过程或函数不能访问此变量的数据。当其所属程序停止运行时,局部变量将被释放。 |
私有变量
private variable |
PRIVATE |
私有变量在 VFP 中是默认的,不需要特殊的关键字定义。但是,如果在更高一级例程(routine)中已经有同名变量,可以用PRIVATE 关键字予以声明,以限定其范围。当定义此变量的例程结束时,此变量也被相应释放。可使用私有变量在被调用的函数中共享数据。 |
公共变量
public variable |
PUBLIC |
可用于所有过程和函数,而不限于定义该变量的过程和函数。可使用全局变量在多个过程或函数之间共享数据,在命令窗口中创建的任何变量自动具有全局属性。 |
变量的访问:
当变量和字段同名时,字段有优先被访问权。要在变量名前加 m. 或 m -> 以示区别,如 m.cStud
(3)数组(array):
是存储在一个变量中由单个变量名引用的有序数据集合。在 VFP中,一个数组中的数据不必是同一种数据类型。常用的有一维数组,二维数组。
数组元素的标识:通过一个数值下标来引用,如 AA[2],AA[2,3]
数组类型的声明:
私有数组 ——用DECLARE 或 DIMENSION定义
全局数组 ——用PUBLIC命定义
局部数组 ——用LOCAL定义
数组元素的赋值:
用赋值语句: 如 AA=45
用SCATTER从当前记录中取特定字段的值赋给数组:
如: scatter fields xh, xm, xb to aa
(数组长度、类型自动与所给字段相同)
用 COPY TO ARRAY从当前记录中取所有字段的值赋给数组:
如: copy to array aa
(数组长度、类型自动与表中全部字段相同)
把数组中的数据传给当前表中的当前记录:
gather from 数组名 [fields 字段名表]
用数组向当前表添加记录:
append from array 数组名 [for 条件] [[fields 字段名表]
(用二维数组可以同时添加多条记录)
数组处理的常用函数:
排序SORT(),搜索ASCAN(),删除ADEL(),插入AINS()
(4) 记录:
表中的一行,由字段组成。
(5) 对象:
对象是类的一个实例,类是对拥有数据和一定行为特征的对象集合的描述。VFP对象可以是表单、表单集、控件。
2.2 VFP 6.0的语言成分
1. 命令
即:由用户发出的、指示VFP进行某种操作的指令。
如 USE aaa & 打开 一个名为 aaa.dbf的数据表
2. 函数
即:一个预先编制好的模块,可由VFP程序在任何地方调用。
函数的使用方法:名称、功能、参数、返回值
几个常用函数
名称 |
命令格式 |
示例 |
字符串截取函数 |
SUBSTR( expC,expN1[,expN2 ]) |
? SUBSTR(“ABCDEFG”,2,4)
结果是: BCDE |
LEFT( expC,expN ) |
? LEFT(“ABCDEFG”,2) 结果是: AB |
RIGHT( expC,expN ) |
? RIGHTT(“ABCDEFG”,4)
结果是: DEFG |
字符串查找函数 |
AT ( expC1 , expC2 [ expN ]) |
? AT(“B”, “ABCDE”) 结果是: 2
? AT(“A”, “ABCDEASD” )
结果是: 1
? AT(“A”,“ABCDEASD”,2 )
结果是: 6 |
大小写字母转换函数 |
LOWER( expC ) |
? LOWER(“DFGHa”) 结果是: dfgha |
UPPER( expC ) |
? UPPER(“asdf”) 结果是: ASDF |
数值函数 |
MAX(exp1,exp1[,exp3,…]) |
? MAX(15,23,4,56) 结果是: 56 |
MIN(exp1,exp1[,exp3,…]) |
? MIN(15,23,4,56) 结果是: 4 |
ABS( expN ) |
? ABS(-15.83) 结果是: 15.83 |
INT( expN ) |
? INT(25.62) 结果是: 25 |
压缩空格函数 |
ALLTRIM( expC ) |
? ALLTRIM(" AD B G ")
结果是: AD B G |
类型转换函数 |
STR( expN1[,expN2][,expN3]) |
? STR(789.678,6,2) 结果是: 789.68 |
CTOD( expC ) |
? CTOD(“98/10/15”)
结果是: 98/10/15 |
VAL( expC ) |
? VAL("123.45") 结果是: 123.45 |
DTOC( expD ) |
? DTOC({98/12/15})
结果是: 98/12/15 |
日期时间函数 |
DATE() |
? DATE() 结果是: 2000/03/15 |
DATETIME() |
? DATETIME()
结果是: 2000/03/15 10:15:30 |
YEAR( expD ) |
? YEAR({87/03/25}) 结果是: 1987 |
数据库函数 |
RECNO( ) |
DBC( ) |
SEEK( ) |
其它函数 |
LEN( ) |
DELETED() |
EOF( ) |
BOF( ) |
FOUND( ) |
EMPTY(exp) |
INLIST(,,) |
RECCOUNT( ) |
SELECT( ) |
BETWEEN(,,) |
IIF(,,) |
TABLEREVERT( ) |
LOCK( ) |
CHR() |
ASC() |
TABLEUPDATE( ) |
FSIZE( ) |
TAG() |
INKEY() |
自定义函数:
由用户为自己的应用程序创建的专用函数,可作为独立的程序文件保存在磁盘上也可作为过程文件存放在其他程序中。
3. 表达式
即:变量、操作符、常量、函数、字段名、控制以及属性的组合,求值结果为单个值。
表达式的类型:
算术表达式:由算术操作符和数值型数据构成的表达式。
字符表达式:由字符操作符和字符型数据构成的表达式。
日期表达式:由日期操作符和日期、时间型数据构成的表达式。
逻辑表达式:由逻辑操作符和逻辑型数据构成的表达式。
名称表达式:
由圆括号括起来的一个字符表达式,用来替换命令或函数中的名称。
例: DBF_NAME="学生成绩登记表"
USE (DBF_NAME)
宏替换:用宏替换符号 & 表示,它与名称表达式具有相似的作用。
例: 已知 A="1", B="2", C12="GOOD"
则 C&A&B="GOOD"
4. 操作符
数值操作符 |
( ) |
^ 或 ** |
* |
/ |
%(取余数) |
+ |
- |
关系操作符 |
< |
<= |
> |
>= |
<> 或 != 或 # = = |
逻辑操作符 |
()表达式分组 |
NO或!(非) |
AND(和) |
OR (或) |
日期和时间操作符 |
+ |
- |
注意: 日期型: 天数 时间型: 秒数 |
字符操作符: |
+ |
- |
$ |
|
|
|
|
两个特殊的操作符 |
圆点操作符(.):用于分隔对象的名称以及分隔对象中的属性、事件、方法。 |
范围转变操作符(::):提供了从一个子类中调用一个父类的方法。 |
2.3 程序设计基础
1. 基本概念
程 序:为解决某一问题而设计的一系列指令。
主程序:通常被用户直接执行的程序。
子程序:在程序中被调用的程序。
源程序: 由人用源语言编写的计算机程序,必须翻译成机器语言后才能被执行。
目标程序: 是源程序经过编译后所产生的机器语言程序。
可执行程序:
源程序被编译后产生的可被机器直接执行的程序,具有 .EXE 扩展名。在VFP中是指由项目管理器连编生成的、可脱离VFP环境运行的程序。
应用程序:
指为完成专门工作而设计的一组相互联系的例行程序和子程序。在VFP中是指一组 Visual FoxPro 程序、表单、菜单和其他文件经项目管理器连编后形成的单个程序,不能脱离VFP环境运行,扩展名为.APP。
例行程序:
按某种顺序排列的、使计算机能执行某种任务的指令集合,可以是一种专用的程序或作为程序的一部分。它可由若干个子程序组成。
2. 程序控制
(1) 顺序语句
即按程序中的语句顺序依次执行。
(2) 分支语句
条件语句: |
情况语句: |
IF 条件
命令组1
[ ELSE
命令组2 ]
ENDIF |
DO CASE
CASE 情况1
命令组1
CASE 情况2
命令组2
…
[OTHERWISE
其它命令组 ]
ENDCASE |
3. 循环语句
FOR
循环语句(预知循环次数) |
FOR 变量 = 初值 TO 终值 [STEP 步长 ]
命令组
ENDFOR | NEXT |
DO WHILE
循环语句(未知循环次数) |
DO WHILE 条件
命令组
ENDDO |
SCAN
循环语句(针对全部记录) |
SCAN [ 范围 ] [FOR | WHILE 条件 ]
命令组
ENDSCAN |
循环结构中的LOOP命令和EXIT命令:
LOOP是短路语句,表示从此开始下一次循环;
EXIT是退出语句,表示跳出循环。
4. 子程序
子程序的的形式可以是一个程序文件,也可以是一个过程或自定义函数。
|
子程序 |
自定义函数 |
过程 |
特点 |
总是被其他程序调用而不单独执行,可以调用其他子程序,不一定要返回一个值。 |
能以一个独立的文件储存,也可包含在调用程序中,必须返回一个值。 |
是一个程序段,是程序的组成部分,一般放在程序的最后。 |
定义方法 |
与程序相同,只是在子程序的结尾加需一条返回命令:
RETURN [ 表达式 |TO MASTER |TO 程序文件名] |
FUNCTION 函数名
或:MODIFY COMMAND 函数名
PARAMETERS 数表
命令组
RETURN 表达式
注:用此命令定义的函数以独立的文件形式储存。 |
PROCEDURE 过程名
PARAMETRS 参数表
命令组
RETURN |
调用方法 |
DO 子程序名[WITH 参数表 ] |
= 函数名 ( 参数表 ) |
DO 过程名 WITH 参数表 |
3. 创建应用程序
方法一:
在命令窗口中输入: MODIFY COMMAND 程序名
方法二:
单击文件菜单 → 新建 → 程序 → 新文件 → 在编辑窗口中编辑程序 → 完成后关闭 → 给出合适的程序名及保存位置 。
程序的注释: 方法1: * | NOTE <注释内容> 可出现在程序中的任何地方
方法2: && <注释内容> 一般用于命令的尾部
给程序加注释的目的是为了提高程序的可读性。
面向过程的程序设计三步曲: 输入 → 处理 → 输出
4. 修改应用程序
方法一:
在命令窗口中输入: MODIFY COMMAND 程序名 | ?
注: ? 表示不知道程序名,要从打开对话框中选定。
方法 二:
单击文件菜单 → 打开 → 选择所需程序并打开 → 在编辑窗口中对程序进行修改 → 完成后关闭退出。
5. 执行应用程序
方法一: 在命令窗口中输入: DO 程序名 | ?
方法二:从程序菜单中选择执行→从打开对话框中选择所需程序并执行之。
6. 程序设计的基本步骤
(1)对问题进行说明
(2)分解问题
(3)编制各模块
(4)测试并完善各模块
(5)组装全部模块
(6)整体测试 |