在一般情况下,将一个具体的数据内容或者其值固定不变的数据称为常量,如一个常数、一个字符串或者一个具体的日期数据等。而变量实际上是一个命名的存储空间,变量的数据类型则是由其所含数据的类型决定的。
常量是由常量名和常量值两部分组成的,其常量的类型有字符型、数值型、货币型、日期型、日期时间型、逻辑型等多种类型。
字符型常量简称C型常量,它是用定界符括起来的字符串,这些定界符有' '、" "、[ ]。字符型常量是由一切能印刷的文字或符号构成的,包括0~9、a~z、A~Z、空格等所有合法的ASCII码字符以及汉字,其最大长度为255个字符。
定界符必须配对使用,为半角英文状态下输入;如果一种定界符已经作为常量使用,则应该选择另外一种定界符,例如,"Hope科技"、'science and technology '和"中国银行+'Bank of China' "等。
数值型常量简称N型常量,它是由数字、小数点和正负号构成的各种整数、小数或实数,例如3345.567和-10。
对于绝对值很大或很小的数值型常量,可以用科学计数法来表示,例如5.12E-5代表5.12×10-5,即0.0000512。
科学计数法规定用字母E或e来表示以10为底的指数,在该字母之前应是一个非零的有效数字,在该字母之后允许用一位或两位的整数表示具体的指数值。如常数3050000,其科学计数方法可表示为3.05E6、3.05E06、3.05E+6、3.05E+06、3.05e6、3.05e+6等多种形式。
注意:在Visual FoxPro中,分数(包括百分数)并不表示一个数值型常量。
货币型常量简称Y型常量,是由符号“$”开头的一个表示货币量的数字。其货币型常量默认只有4位小数,如果小数部分超过了4位,则进行四舍五入,例如$56.83和$-34.5034。
日期型常量简称D型常量,用来表示一个具体的日期,其默认格式为{^yyyy-mm-dd}或者{^yyyy/mm/dd}。例如,{^2007/01/12}与{^2007-01-12}均表示2007年1月12日。
注意:其默认格式中的“^”符号,表示该日期格式是严格的,若要设置为非严格的日期格式,可以执行SET STRICTDATE TO 0命令,此后即可以用{yyyy-mm-dd}或者{yyyy/mm/dd}的格式来表示一个日期。
另外,Visual FoxPro中的各种日期表示还受到系统环境设置的影响,并且可以用SET DATE TO命令和SET CENTURY命令来临时改变日期的格式,如下所示。
· SET DATE TO AMERICAN设置为mm/dd/yy格式,例如,01/17/2007。
· SET DATE TO BRITISH设置为dd/mm/yy格式,例如,17/01/2007。
· SET DATE TO USA设置为mm-dd-yy格式,例如,01-17-2007。
· SET DATE TO ANSI设置为yy.mm.dd格式,例如,2007.01.17。
· SET DATE TO YMD设置为yy/mm/dd格式,例如,2007/01/17。
· SET DATE TO MDY设置为mm/dd/yy格式,例如,01/17/2007。
· SET DATE TO DMY设置为dd/mm/yy格式,例如,17/01/2007。
· SET CENTURY ON设置年份为4位数字表示,例如,2007年。
· SET CENTURY OFF设置年份为2位数字表示,例如,07年。
日期时间型常量简称T型常量,用来表示一个具体的日期与时间,其默认格式为{^yyyy-mm-dd,[hh[:mm[:ss]][a|p]]},方括号中的内容为可选项,符号“|”表示“或者”。例如,{^2007-01-17,11:35p}表示2007年1月17日下午11点35分。
逻辑型常量简称L型常量,用来表示某个条件是否成立。它只有逻辑真与逻辑假两个值,逻辑真用.T.表示,逻辑假用.F.表示。此外,还可以用.t.、.Y.、.y.表示逻辑真,用.f.、.N.、.n.表示逻辑假。
变量在内存中占一个存储单元的位置(地址),变量名是存储位置的符号表示。变量分为字段变量、内存变量、数组变量和系统变量4种。
字段变量(Field Variable)是与某个数据表中的对应字段相联系的,在创建数据表时所定义的一个字段就对应一个字段变量,数据表中的字段名即为字段变量名。字段变量除了有字符型、数值型、货币型、日期型、日期时间型和逻辑型之外,还有其特有的备注(M)型和通用(G)型等。
一个数据表有多少条记录,它的每一个字段变量就会有多少个值,因而字段变量是一种多值变量。在数据表中有一个专门用来指示当前记录的记录指针,字段变量的当前值就是当前记录中该字段的值。
内存变量(Memory Variable)独立于数据表文件存在于内存之中,是程序员用来保存执行中间结果的临时工作单元,可以随时定义、随时释放。其变量名由汉字、字母、下划线和数字组成。
(1)内存变量的赋值。内存变量的赋值有两种方法。一是使用STORE TO语句,其格式为:
Stor <表达式> to <内存变量名表>
将表达式的值赋给多个内存变量,如,
Store 5*3 to x1,x2,x3,x4
二是使用“=”赋值语句,将表达式的值赋给一个内存变量,如,
y1=21
y2=35
例如,创建内存变量:
STORE 70 TO eme1 &&创建变量eme1,其值为70,数据类型为整数型
A1=12.345 &&创建变量A1,其值为12.345,数据类型为数值型
注意:等号的右边只能是内存变量值,该值的类型决定了内存变量的类型。
(2)内存变量的作用范围。内存变量按照其作用范围可以分为公共(PUBLIC)内存变量和私有(PRIVATE)内存变量。公共内存变量又称为全局内存变量,适用于所有的过程;私有内存变量又称为局部内存变量,仅适用于定义该变量的过程。
可用LOCAL(定义局部变量)命令和PUBLIC(定义全局变量)命令指定变量的作用范围。
例如,指定变量的作用范围:
LOCAL R1,R2 &&指定变量R1、R2为局部变量
PUBLIC R3 &&指定变量R3为全局变量
(3)内存变量的显示。内存变量显示的值可以用?、??或者@…SAY语句在“命令”窗口显示。
可以用LIST MEMORY [TO PRINT]或者DISPLAY MEMORY [TO PRINT]命令显示所有的内存变量。如果语句中包含[TO PRINT]选项,则将结果输出到打印机上,否则在屏幕上显示。
(4)内存变量的释放(删除)。要释放(删除)内存变量,可用RELEASE或CLEAR MEMORY命令,后者可释放除系统内存变量之外的所有内存变量,而RELEASE命令则可以有选择地释放内存变量。RELEASE命令有如下格式:
RELEASE
ALL [LIKE|EXCEPT<结构>]|<内存变量表>
若选择<内存变量表>,则仅删除清单中指定的内存变量;若选择ALL [LIKE|EXCEPT
<结构>],则按如下条件删除内存变量。
ALL LIKE<结构>:表示把符合结构中所指定的内存变量删除。
ALL EXCEPT<结构>:表示把符合结构中所指定的其他内存变量清除。
例如,
RELEASE xyx1 &&删除一个内存变量
RELEASE xyx1, xyx2 &&删除两个内存变量
RELEASE ALL LIKE x? &&删除首字符为x的双字母内存变量
RELEASE ALL EXCEPT x* &&删除首字符为x的所有内存变量
RELEASE ALL &&删除全部内存变量
(5)内存变量文件。内存变量是在内存中建立的,一旦关机、掉电或退出系统,内存变量就不复存在,因此需要把用到的内存变量保存到磁盘上。
用户可以用SAVE命令将一个、多个或全部内存变量保存到一个磁盘文件中(扩展名为.mem),其格式为:
SAVE TO <文件名> [ALL LIKE|EXCEPT<结构>]
若未给出任何选项,则将把当前内存中所有的内存变量保存到指定的文件名中;若给出任一选项,则把符合指定要求的内存保存起来,此选项的意义与RELEASE命令中选项的意义相同。发出SAVE命令时,如果一个本地内存变量隐去了另外在较高级定义的内存变量,则只存储本地内存变量。
反之,用户可以使用RESTORE命令将一个MEM的文件读出。RESTORE命令首先执行一个CLEAR MEMORY命令,删去全部当前内存变量,然后读存储在指定MEM文件中的内存变量描述,其格式为:
RESTORE FROM<文件名> [ADDITIVE]
Visual FoxPro还有存屏命令,能将屏幕上的信息存到一个内存变量之后,再用上面的命令将其存为内存变量文件,以便以后恢复,其格式为:
SAVE SCREEN [TO <内存变量>]
其功能为在文本方式下把当前屏幕上的内容保存到<内存变量>中;不选任何选项,则保存到特定的内存缓冲区中。
当需要恢复屏幕内容时,可使用以下的格式:
RESTORE SCREEN[FROM<内存变量>]
若不选任何选项,则从特定的内存缓冲区中恢复。例如,
SAVE SCREEN TO SC &&将屏幕存到SC内存变量中
SAVE TO MEM1 &&将所有内存变量存入MEM1文件
RESTORE FROM MEM1 &&恢复内存变量
CLEAR &&把整个屏幕清除
RESTORE SCREEN FROM SC &&恢复屏幕
注意:字段变量与内存变量同名时,字段变量优先,如果打开表后,有一个姓名字段,又使用姓名=“高明”定义一个内存变量姓名,这时字段变量姓名与内存变量姓名同名。如果使用“?姓名”语句,则显示字段变量姓名的内容;如果要显示内存变量中姓名的内容,则应加上“M->”前缀,如“? M->姓名”。
数组变量是结构变量,它是具有相同名称而下标不同的一组有序内存变量。FoxPro允许定义一维和二维数组,数据在使用之前需要先定义。
由于数组的应用比较常见,所以数组部分将在本章的4.5节中进行详细介绍。
系统变量是特有的变量,是系统内部提供的,学会使用系统变量会带来许多方便。Visual FoxPro提供的系统变量很多,在使用DISPLAY命令显示内存变量时,可以看到这些系统变量的当前值。
下面结合具体实例介绍几种常用的系统内存变量。
(1)ALIGNMENT=<expC>:用于空白之间的文本对齐。表达式<expC>中包含的字符串决定文本对齐方式。
· LEFT左对齐输出,为默认情况。
· CENTER居中对齐输出。
· RIGHT右对齐输出。
(2)CALCMEM=<expN>:该变量返回或者初始化计算器的值。利用该变量可以访问计算器的计算结果,对该变量赋初值就是对计算赋初值,例如,
STORE 5 TO _CALCMEM &&赋初值
ACTIVATE WINDOWS calculator &&显示计算器
CLEAR TYPEAHEAD &&清除键盘缓冲区
KEYBOARD CHR(82) &&向键盘缓冲区填充“R”字符
(3)DIARYDATE=<expN>:返回或者初始化系统日历中的日期。_DIARYDATE中存放着当前系统日历的日期,使用该系统变量可以设置和获取系统日历的日期。
例如,用以下程序可以修改和显示系统日期:
SET CENTURY ON &&设置日期显示格式
STORE {^2005-05-01} TO _DIARYDATE &&初始化系统日历日期
=MESSAGEBOX(DTOC(_DIARYDATE),64) &&显示系统日历日期
ACTIVATE WINDOWS CALENDAR &&调用系统日历
=MESSAGEBOX("Change date to July 4,1980",48)
STORE {^2002-10-04} to _DIARYDATE &&更改系统日历日期
=MESSAGEBOX(DTOC(_DIARYDATE),64) &&显示更改后的系统日期
=MESSAGEBOX("Change date to today date",48)
STORE DATE() TO _DIARYDATE &&获取系统时间
=MESSAGEBOX(DTOC(_DIARYDATE),64) &&显示获得的系统时间
RELEASE WINDOW calendar &&释放系统日历
可在机器上调试以上几个例子,查看程序的运行结果。