|
第六章 VFP程序設(shè)計(jì)基礎(chǔ)
6.1 程序設(shè)計(jì)概述
1. 程序設(shè)計(jì)方法簡(jiǎn)介
|
設(shè)計(jì)方法
|
主要概念
|
設(shè)計(jì)過程
|
程序執(zhí)行方式
|
| 結(jié)構(gòu)化程序設(shè)計(jì) |
功能模塊(即過程、自定義函數(shù)) |
編制各個(gè)功能模塊,再用主程序?qū)⑺鼈兇饋?/font> |
將應(yīng)用程序分解成若干功能模塊,通過各模塊的相互調(diào)用來完成整個(gè)執(zhí)行過程,是過程驅(qū)動(dòng)的。 |
| 面向?qū)ο蟪绦蛟O(shè)計(jì) |
類、對(duì)象、屬性、事件、方法 |
設(shè)計(jì)類、子類、對(duì)象(設(shè)計(jì)外觀、設(shè)置屬性、為事件編寫方法程序) |
將應(yīng)用程序分解成具有特定屬性的對(duì)象,通過調(diào)用各對(duì)象的不同方法來完成相關(guān)事件,是事件驅(qū)動(dòng)的。 |
2.?dāng)?shù)據(jù)類型
VFP 包含下列數(shù)據(jù)類型:
| 通用的數(shù)據(jù)類型 |
字符型
Character
|
貨幣型
Currency
|
日期型
Date
|
日期時(shí)間型
DateTime
|
邏輯型
Logical
|
數(shù)值型
Numeric
|
| 僅用于字段的數(shù)據(jù)類型 |
雙精度型
Double
|
浮點(diǎn)型
Float
|
整型
Integer
|
通用型
General
|
備注型
Memo
|
|
3. 數(shù)據(jù)容器
VFP中用來存儲(chǔ)數(shù)據(jù)的容器有:常量、變量、數(shù)組、記錄和對(duì)象。
(1) 常量(constants):
一個(gè)在操作過程中保持不變的數(shù)值或字符串。
常用的常量類型
|
常量類型
|
數(shù)值型常量
|
字符型常量
|
邏輯型常量
|
日期型常量
|
|
表示方式
|
-25.36
|
"abc","123","中國(guó)"
|
.T. .F.
|
{03/07/2000}
|
(2)變量(variables):
是內(nèi)存中的一個(gè)存儲(chǔ)單元的位置,其中的內(nèi)容可以變化,但標(biāo)識(shí)該存儲(chǔ)位置的名稱(即變量名)不變。
變量的命名習(xí)慣: 類型變量代號(hào)
如:cStud 、nCj 、dCsrq ——
分別代表一個(gè)字符型、數(shù)值型、日期型的變量名
變量的賦值方式: 1) 用 STORE 命令 如:STORE "王蘭" TO cStud
2) 用賦值操作符 = 如:cStud = "王蘭"
變量的作用域: 即變量起使用的有效范圍。
|
變量作用域
|
定義作用域的關(guān)鍵字
|
特點(diǎn)
|
|
局部變量
local variable(本地變量)
|
LOCAL |
只能在一個(gè)函數(shù)或過程中被訪問,其他過程或函數(shù)不能訪問此變量的數(shù)據(jù)。當(dāng)其所屬程序停止運(yùn)行時(shí),局部變量將被釋放。 |
|
私有變量
private variable
|
PRIVATE |
私有變量在 VFP 中是默認(rèn)的,不需要特殊的關(guān)鍵字定義。但是,如果在更高一級(jí)例程(routine)中已經(jīng)有同名變量,可以用PRIVATE 關(guān)鍵字予以聲明,以限定其范圍。當(dāng)定義此變量的例程結(jié)束時(shí),此變量也被相應(yīng)釋放??墒褂盟接凶兞吭诒徽{(diào)用的函數(shù)中共享數(shù)據(jù)。 |
|
公共變量
public variable
|
PUBLIC |
可用于所有過程和函數(shù),而不限于定義該變量的過程和函數(shù)??墒褂萌肿兞吭诙鄠€(gè)過程或函數(shù)之間共享數(shù)據(jù),在命令窗口中創(chuàng)建的任何變量自動(dòng)具有全局屬性。 |
變量的訪問:
當(dāng)變量和字段同名時(shí),字段有優(yōu)先被訪問權(quán)。要在變量名前加 m. 或 m -> 以示區(qū)別,如 m.cStud
(3)數(shù)組(array):
是存儲(chǔ)在一個(gè)變量中由單個(gè)變量名引用的有序數(shù)據(jù)集合。在 VFP中,一個(gè)數(shù)組中的數(shù)據(jù)不必是同一種數(shù)據(jù)類型。常用的有一維數(shù)組,二維數(shù)組。
數(shù)組元素的標(biāo)識(shí):通過一個(gè)數(shù)值下標(biāo)來引用,如 AA[2],AA[2,3]
數(shù)組類型的聲明:
私有數(shù)組 ——用DECLARE 或 DIMENSION定義
全局?jǐn)?shù)組 ——用PUBLIC命定義
局部數(shù)組 ——用LOCAL定義
數(shù)組元素的賦值:
用賦值語句: 如 AA=45
用SCATTER從當(dāng)前記錄中取特定字段的值賦給數(shù)組:
如: scatter fields xh, xm, xb to aa
(數(shù)組長(zhǎng)度、類型自動(dòng)與所給字段相同)
用 COPY TO ARRAY從當(dāng)前記錄中取所有字段的值賦給數(shù)組:
如: copy to array aa
(數(shù)組長(zhǎng)度、類型自動(dòng)與表中全部字段相同)
把數(shù)組中的數(shù)據(jù)傳給當(dāng)前表中的當(dāng)前記錄:
gather from 數(shù)組名 [fields 字段名表]
用數(shù)組向當(dāng)前表添加記錄:
append from array 數(shù)組名 [for 條件] [[fields 字段名表]
(用二維數(shù)組可以同時(shí)添加多條記錄)
數(shù)組處理的常用函數(shù):
排序SORT(),搜索ASCAN(),刪除ADEL(),插入AINS()
(4) 記錄:
表中的一行,由字段組成。
(5) 對(duì)象:
對(duì)象是類的一個(gè)實(shí)例,類是對(duì)擁有數(shù)據(jù)和一定行為特征的對(duì)象集合的描述。VFP對(duì)象可以是表單、表單集、控件。
6.2 VFP 6.0的語言成分
1. 命令
即:由用戶發(fā)出的、指示VFP進(jìn)行某種操作的指令。
如 USE aaa & 打開 一個(gè)名為 aaa.dbf的數(shù)據(jù)表
2. 函數(shù)
即:一個(gè)預(yù)先編制好的模塊,可由VFP程序在任何地方調(diào)用。
函數(shù)的使用方法:名稱、功能、參數(shù)、返回值
幾個(gè)常用函數(shù)
|
名稱
|
命令格式
|
示例
|
|
字符串截取函數(shù)
|
SUBSTR( expC,expN1[,expN2 ]) |
SUBSTR(“ABCDEFG”,2,4)
結(jié)果是: BCDE
|
| LEFT( expC,expN ) |
LEFT(“ABCDEFG”,2) 結(jié)果是: AB |
| RIGHT( expC,expN ) |
RIGHTT(“ABCDEFG”,4)
結(jié)果是: DEFG
|
|
字符串查找函數(shù)
|
AT ( expC1 , expC2 [ expN ]) |
AT(“B”, “ABCDE”) 結(jié)果是: 2
AT(“A”, “ABCDEASD” )
結(jié)果是: 1
AT(“A”,“ABCDEASD”,2 )
結(jié)果是: 6
|
|
大小寫字母轉(zhuǎn)換函數(shù)
|
LOWER( expC ) |
LOWER(“DFGHa”) 結(jié)果是: dfgha |
| UPPER( expC ) |
UPPER(“asdf”) 結(jié)果是: ASDF |
|
數(shù)值函數(shù)
|
MAX(exp1,exp1[,exp3,…]) |
MAX(15,23,4,56) 結(jié)果是: 56 |
| MIN(exp1,exp1[,exp3,…]) |
MIN(15,23,4,56) 結(jié)果是: 4 |
| ABS( expN ) |
ABS(-15.83) 結(jié)果是: 15.83 |
| INT( expN ) |
INT(25.62) 結(jié)果是: 25 |
|
壓縮空格函數(shù)
|
ALLTRIM( expC ) |
ALLTRIM(" AD B G ")
結(jié)果是: AD B G
|
|
類型轉(zhuǎn)換函數(shù)
|
STR( expN1[,expN2][,expN3]) |
STR(789.678,6,2) 結(jié)果是: 789.68 |
| CTOD( expC ) |
CTOD(“98/10/15”)
結(jié)果是: 98/10/15
|
| VAL( expC ) |
VAL("123.45") 結(jié)果是: 123.45 |
| DTOC( expD ) |
DTOC({98/12/15})
結(jié)果是: 98/12/15
|
|
日期時(shí)間函數(shù)
|
DATE() |
DATE() 結(jié)果是: 2000/03/15 |
| DATETIME() |
DATETIME()
結(jié)果是: 2000/03/15 10:15:30
|
| YEAR( expD ) |
YEAR({87/03/25}) 結(jié)果是: 1987 |
|
數(shù)據(jù)庫函數(shù)
|
RECNO( ) |
DBC( ) |
SEEK( ) |
其它函數(shù)
|
LEN( ) |
DELETED() |
| EOF( ) |
BOF( ) |
FOUND( ) |
EMPTY(exp) |
INLIST(,,) |
| RECCOUNT( ) |
SELECT( ) |
BETWEEN(,,) |
IIF(,,) |
| CHR() |
ASC() |
| TAG() |
INKEY() |
自定義函數(shù):
由用戶為自己的應(yīng)用程序創(chuàng)建的專用函數(shù),可作為獨(dú)立的程序文件保存在磁盤上也可作為過程文件存放在其他程序中。
3. 表達(dá)式
即:變量、操作符、常量、函數(shù)、字段名、控制以及屬性的組合,求值結(jié)果為單個(gè)值。
表達(dá)式的類型:
算術(shù)表達(dá)式:由算術(shù)操作符和數(shù)值型數(shù)據(jù)構(gòu)成的表達(dá)式。
字符表達(dá)式:由字符操作符和字符型數(shù)據(jù)構(gòu)成的表達(dá)式。
日期表達(dá)式:由日期操作符和日期、時(shí)間型數(shù)據(jù)構(gòu)成的表達(dá)式。
邏輯表達(dá)式:由邏輯操作符和邏輯型數(shù)據(jù)構(gòu)成的表達(dá)式。
名稱表達(dá)式:
由圓括號(hào)括起來的一個(gè)字符表達(dá)式,用來替換命令或函數(shù)中的名稱。
例: DBF_NAME="學(xué)生成績(jī)登記表"
USE (DBF_NAME)
宏替換:用宏替換符號(hào) & 表示,它與名稱表達(dá)式具有相似的作用。
例: 已知 A="1", B="2", C12="GOOD"
則 C&A&B="GOOD"
4. 操作符
| 數(shù)值操作符 |
( )
|
^ 或 ** |
*
|
/
|
%(取余數(shù))
|
+
|
-
|
| 關(guān)系操作符 |
<
|
<=
|
>
|
>=
|
<> 或 != 或 # = =
|
| 邏輯操作符 |
()表達(dá)式分組
|
NO或!(非)
|
AND(和)
|
OR (或)
|
| 日期和時(shí)間操作符 |
+
|
-
|
注意: 日期型: 天數(shù) 時(shí)間型: 秒數(shù)
|
| 字符操作符: |
+
|
-
|
$
|
|
|
|
|
| 兩個(gè)特殊的操作符 |
圓點(diǎn)操作符(.):用于分隔對(duì)象的名稱以及分隔對(duì)象中的屬性、事件、方法。 |
| 范圍轉(zhuǎn)變操作符(::):提供了從一個(gè)子類中調(diào)用一個(gè)父類的方法。 |
6.3 程序設(shè)計(jì)基礎(chǔ)
1. 基本概念
程 序:為解決某一問題而設(shè)計(jì)的一系列指令。
主程序:通常被用戶直接執(zhí)行的程序。
子程序:在程序中被調(diào)用的程序。
源程序: 由人用源語言編寫的計(jì)算機(jī)程序,必須翻譯成機(jī)器語言后才能被執(zhí)行。
目標(biāo)程序: 是源程序經(jīng)過編譯后所產(chǎn)生的機(jī)器語言程序。
可執(zhí)行程序:
源程序被編譯后產(chǎn)生的可被機(jī)器直接執(zhí)行的程序,具有 .EXE 擴(kuò)展名。在VFP中是指由項(xiàng)目管理器連編生成的、可脫離VFP環(huán)境運(yùn)行的程序。
應(yīng)用程序:
指為完成專門工作而設(shè)計(jì)的一組相互聯(lián)系的例行程序和子程序。在VFP中是指一組 Visual FoxPro 程序、表單、菜單和其他文件經(jīng)項(xiàng)目管理器連編后形成的單個(gè)程序,不能脫離VFP環(huán)境運(yùn)行,擴(kuò)展名為.APP。
例行程序:
按某種順序排列的、使計(jì)算機(jī)能執(zhí)行某種任務(wù)的指令集合,可以是一種專用的程序或作為程序的一部分。它可由若干個(gè)子程序組成。
2. 程序控制
(1) 順序語句
即按程序中的語句順序依次執(zhí)行。
(2) 分支語句
|
條件語句:
|
情況語句:
|
| IF 條件
命令組1
[ ELSE
命令組2 ]
ENDIF
|
DO CASE
CASE 情況1
命令組1
CASE 情況2
命令組2
…
[OTHERWISE
其它命令組 ]
ENDCASE
|
3. 循環(huán)語句
|
FOR
循環(huán)語句(預(yù)知循環(huán)次數(shù))
|
FOR 變量 = 初值 TO 終值 [STEP 步長(zhǎng) ]
命令組
ENDFOR | NEXT
|
|
DO WHILE
循環(huán)語句(未知循環(huán)次數(shù))
|
DO WHILE 條件
命令組
ENDDO
|
|
SCAN
循環(huán)語句(針對(duì)全部記錄)
|
SCAN [ 范圍 ] [FOR | WHILE 條件 ]
命令組
ENDSCAN
|
循環(huán)結(jié)構(gòu)中的LOOP命令和EXIT命令:
LOOP是短路語句,表示從此開始下一次循環(huán);
EXIT是退出語句,表示跳出循環(huán)。
4. 子程序
子程序的的形式可以是一個(gè)程序文件,也可以是一個(gè)過程或自定義函數(shù)。
| |
子程序
|
自定義函數(shù)
|
過程
|
|
特點(diǎn)
|
總是被其他程序調(diào)用而不單獨(dú)執(zhí)行,可以調(diào)用其他子程序,不一定要返回一個(gè)值。 |
能以一個(gè)獨(dú)立的文件儲(chǔ)存,也可包含在調(diào)用程序中,必須返回一個(gè)值。 |
是一個(gè)程序段,是程序的組成部分,一般放在程序的最后。 |
|
定義方法
|
與程序相同,只是在子程序的結(jié)尾加需一條返回命令:
RETURN [ 表達(dá)式 |TO MASTER |TO 程序文件名]
|
FUNCTION 函數(shù)名
或:MODIFY COMMAND 函數(shù)名
PARAMETERS 數(shù)表
命令組
RETURN 表達(dá)式
注:用此命令定義的函數(shù)以獨(dú)立的文件形式儲(chǔ)存。
|
PROCEDURE 過程名
PARAMETRS 參數(shù)表
命令組
RETURN
|
|
調(diào)用方法
|
DO 子程序名[WITH 參數(shù)表 ] |
= 函數(shù)名 ( 參數(shù)表 ) |
DO 過程名 WITH 參數(shù)表 |
3. 創(chuàng)建應(yīng)用程序
方法一:
在命令窗口中輸入: MODIFY COMMAND 程序名
方法二:
單擊文件菜單 → 新建 → 程序 → 新文件 → 在編輯窗口中編輯程序 → 完成后關(guān)閉 → 給出合適的程序名及保存位置 。
程序的注釋: 方法1: * | NOTE <注釋內(nèi)容> 可出現(xiàn)在程序中的任何地方
方法2: && <注釋內(nèi)容> 一般用于命令的尾部
給程序加注釋的目的是為了提高程序的可讀性。
面向過程的程序設(shè)計(jì)三步曲: 輸入 → 處理 → 輸出
4. 修改應(yīng)用程序
方法一:
在命令窗口中輸入: MODIFY COMMAND 程序名 | ?
注: 表示不知道程序名,要從打開對(duì)話框中選定。
方法 二:
單擊文件菜單 → 打開 → 選擇所需程序并打開 → 在編輯窗口中對(duì)程序進(jìn)行修改 → 完成后關(guān)閉退出。
5. 執(zhí)行應(yīng)用程序
方法一: 在命令窗口中輸入: DO 程序名 | ?
方法二:從程序菜單中選擇執(zhí)行→從打開對(duì)話框中選擇所需程序并執(zhí)行之。
|