VFP6程序設(shè)計基礎(chǔ)課件_第1頁
VFP6程序設(shè)計基礎(chǔ)課件_第2頁
VFP6程序設(shè)計基礎(chǔ)課件_第3頁
VFP6程序設(shè)計基礎(chǔ)課件_第4頁
VFP6程序設(shè)計基礎(chǔ)課件_第5頁
已閱讀5頁,還剩94頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

2024/8/151

VFP6程序設(shè)計基礎(chǔ)

2024/8/1525.1VFP6程序設(shè)計概念5.1.1VFP6程序設(shè)計基本概念

5.1.2VFP6程序設(shè)計基本操作

5.1.3VFP程序設(shè)計編程方式

返回退出2024/8/1535.1.1VFP6程序設(shè)計基本概念

VFP6支持過程化程序設(shè)計和面向?qū)ο蟪绦蛟O(shè)計兩種程序設(shè)計與開發(fā)的類型。下面是一個完整的VFP過程化程序,可以引出幾個基本概念。*功能說明:求圓形的面積。*文件名:L501.PRGCLEARCTALK=SET("TALK")SETTALKOFFINPUT"請輸入圓的半徑,半徑="TORS=PI()*R*R?"半徑為"+ALLTRIM(STR(R))+"的圓,面積=",SSETTALK&CTALKRETURN2024/8/1541、從形式上看,VFP的程序是由若干有序的命令行組成,且滿足下列規(guī)則:(1)一個命令行內(nèi)只能寫一條命令,命令行的長度不得超過2048個字符,命令行以回車鍵結(jié)束。(2)、一個命令行可以由若干個物理行組成,即一條命令在一個物理行內(nèi)寫不下時,可以分成幾行。換行的方法有兩種:一種是在物理行的末尾加符號“;”,表示下一行輸入的內(nèi)容是本行的繼續(xù);另一種是系統(tǒng)自動換行,即輸入程序時,只管逐條命令輸入,無需考慮本條語句是否超過屏幕行寬的最大限度,當(dāng)輸入的語句超過屏幕的最大行寬時,系統(tǒng)自動換行。輸入時只需在一行結(jié)束時按回車鍵,通知系統(tǒng)本命令行輸入完畢。(3)為便于閱讀,可以按一定的格式輸入程序,即一般程序結(jié)構(gòu)左對齊,而控制結(jié)構(gòu)內(nèi)的語句序列比控制結(jié)構(gòu)的語句縮進(jìn)若干格。2、從功能上看,程序可以分為三個部分:第一部分是程序的說明部分,在本例程序中是前面的四行,一2024/8/155般用于說明程序的功能、文件名等需要說明的有關(guān)信息。第二部分是進(jìn)行數(shù)據(jù)處理的部分,在本例程序中是從第五行開始的三行。通常任何一個有意義的程序,總是要有一些原始數(shù)據(jù),否則,這個程序就沒有處理對象。同樣,程序運行的結(jié)果也有必要顯示或打印出來,否則,用戶將不知道程序干了一些什么。因此,第二部分程序常包括下列三個部分,依次為:提供原始數(shù)據(jù)部分、數(shù)據(jù)處理部分、輸出結(jié)果部分。第三部分是程序的控制返回部分,在本例中就是最后二條命令。它控制程序返回到調(diào)用該程序的調(diào)用處。過程化程序設(shè)計與面向?qū)ο蟪绦蛟O(shè)計

過程化程序設(shè)計:它是采用結(jié)構(gòu)化編程語句來編寫的程序。這類方法的特點是容易把一個復(fù)雜的程序分解為若干個較小的過程,每個過程都可進(jìn)行獨立的調(diào)試。這類設(shè)計方法發(fā)展的總思想是從程序員角度考慮使程序設(shè)計更簡單,而較少從使用角度去考慮。使用這類方法設(shè)計的程序流程完全由程序員控制,使用者只能做由程序員預(yù)先安排好的事情。2024/8/156

面向?qū)ο蟪绦蛟O(shè)計:這類程序設(shè)計思想是面向?qū)ο?,即設(shè)計的重要任務(wù)在于描述對象。程序是由事件驅(qū)動的,因而,在執(zhí)行過程中,持續(xù)等待的是一個發(fā)生在對象上的事件。而發(fā)生什么事件則要看使用者的操作,如單擊、雙擊鼠標(biāo)等。至于下一步的程序流向,則要看驅(qū)動的是什么事件。這類程序設(shè)計的主要目的是從任何方便與簡化使用入手,由使用者控制程序流向,這在一定程序上增加了編程的難度。5.1.2VFP6程序設(shè)計基本操作

1、過程化程序設(shè)計基本操作(1)建立過程文件。在VFP中,一個過程文件就是一個ASCII文本文件,因而可用各類編輯工具來建立。在VFP中有下面二種簡易方法來建立:■在【文件】菜單下的【新建】菜單項中,選擇“程序”可選項?!鲈诿畲翱谥惺褂肕ODIFYCOMMAND命令。返回2024/8/157格式:MODIFYCOMMAND[<文件名>/?]

功能:打開文本編輯窗口,編寫程序代碼。參數(shù)描述:[<文件名>]:為可選項,指定打開或創(chuàng)建的程序文件名。若不指定新建程序文件的擴展名,VFP自動指定.PRG為擴展名。MODIFYCOMMAND命令支持含有“*”和“?”通配符的文件梗概。名稱與這個梗概匹配的每一個文件都在編輯窗口中打開。若省略文件名,將給打開的編輯窗口賦一個初始名稱“程序1.PRG”。當(dāng)關(guān)閉編輯窗口時,可以用另外的文件名保存該文件。[?]:顯示“打開”對話框。可以從中選擇一個已有程序或輸入要創(chuàng)建的新程序名。說明:修改程序文件之后,更新過的文件將寫到磁盤上。除非在配置文件中用TEDIT指定一個外部編輯器,否則,一般使用VFP的內(nèi)置編輯器。2024/8/158【例5-2】用戶通過VFP6的命令窗口建立上例程序文件。在VFP6的命令窗口中輸入下條命令后按回車鍵。MODIFYCOMMANDL501打開程序編輯窗口在程序編輯窗口中輸入程序代碼用Ctrl+W存盤退出編輯窗口,或單擊程序編輯窗口上的【關(guān)閉】按鈕,在彈出的對話窗口中確定存盤,生成L501.prg文件。2024/8/159(2)運行程序下面的任一方法均可運行程序:■選擇【程序】菜單下的“運行”菜單,利用“運行”對話框選擇要運行的程序;■在命令窗口中輸入如下命令:DO<程序文件名>

系統(tǒng)就會運行這個程序。如果文件不加擴展名,系統(tǒng)會假定它具有.PRG的擴展名,如果想運行一個具有其它擴展名的命令文件時,在輸入命令時必須給出這個命令文件的全名。如:要運行上例中編輯的程序,可以在命令窗口中輸入:

DOL501然后按回車鍵執(zhí)行。2024/8/15102、事件驅(qū)動程序設(shè)計基本操作VFP6提供了真正的無模式操作,使用戶不僅能夠輕松地進(jìn)行多個表單的自動協(xié)調(diào),而且可以很容易地同時運行一個表單的多個實例。VFP6還提供了事件處理機制,可以給用戶提供一個更為豐富的交互環(huán)境。事件驅(qū)動程序設(shè)計基本操作,關(guān)鍵是確定事件以及對事件發(fā)生時應(yīng)作出的反應(yīng)。一個事件發(fā)生時,VFP6系統(tǒng)應(yīng)作出的反應(yīng),仍可通過一個過程來實現(xiàn),即用過程化程序設(shè)計的方法來處理某一事件發(fā)生時系統(tǒng)應(yīng)作出的響應(yīng)。通常,VFP6程序設(shè)計時應(yīng)考慮的事件有:(1)核心事件表5-1是VFP6中核心事件列表,這些事件適用于大多數(shù)的控件。(2)容器事件和對象事件。為控件編寫事件代碼時,請注意以下兩條規(guī)則:■容器不處理與所包含的控件相關(guān)聯(lián)的事件;■若沒有與某控件相關(guān)聯(lián)的事件代碼,則VFP在該控件所在類層次結(jié)構(gòu)中逐層向上檢查是否有與該事件相關(guān)聯(lián)的代碼。2024/8/1511表5-1VFP6核心事件

返回1652024/8/1512當(dāng)用戶以任意一種方式(使用Tab鍵、單擊鼠標(biāo)等)與對象交互時,對象事件被觸發(fā)。每個對象獨立接受自己的事件。例如,在圖5-2中,盡管命令按鈕位于表單上,當(dāng)用戶單擊命令按鈕時,不會觸發(fā)表單的Click事件,只觸發(fā)命令按鈕的Click事件。若沒有與命令按鈕相關(guān)聯(lián)的Click事件代碼,盡管有與表單相關(guān)聯(lián)的Click事件代碼,當(dāng)用戶單擊按鈕時,也不會執(zhí)行與表單相關(guān)聯(lián)的Click事件代碼。圖5-2容器、控件事件代碼相對獨立

這些規(guī)則也適用于表格控件。表格事件包含列,列又包含標(biāo)頭和控件。事件發(fā)生時,只有與事件相關(guān)聯(lián)的最底層對象識別該事件,更高層的容器不識別這個事件。圖5-3演示了當(dāng)用戶在表格上移動鼠標(biāo)時,哪個對象處理這個MouseMove事件。2024/8/1513圖5-3表格的MouseMove事件

例如:在一個命令按鈕上,按下鼠標(biāo)左鍵并拖動鼠標(biāo)指針離開命令按鈕,盡管鼠標(biāo)指針可能已經(jīng)在表單上,但這個命令按鈕的MouseMove事件還在不斷產(chǎn)生。當(dāng)在表單上而不是在命令按鈕上釋放鼠標(biāo)時,發(fā)生的MouseUp事件是與命令按鈕相關(guān)聯(lián)的,而不是與表單的MouseUp事件相關(guān)聯(lián)。2024/8/1514(3)VFP6中類和控件事件若表單上的控件基于一個用戶自定義的類,當(dāng)一個事件發(fā)生時,VFP首先在該控件中查看是否有與此事件相關(guān)聯(lián)的代碼,若找到,則執(zhí)行它;否則,VFP將在類層次中向上一層檢查。無論VFP在類層次的哪個地方找到該事件的代碼,都執(zhí)行它,如圖5-4所示。圖5-4若沒有與對象相關(guān)聯(lián)的事件代碼,則VFP將檢查父類

返回2024/8/15155.1.3VFP程序設(shè)計編程方式

VFP程序由代碼組成,代碼包括以命令形式出現(xiàn)的指令、函數(shù)和VFP可以理解的任何操作。這些指令包含在“命令”窗口、程序文件、表單設(shè)計器與類設(shè)計器的事件或方法程序代碼窗口、菜單設(shè)計器的過程代碼窗口、報表設(shè)計器的過程代碼窗口中。使用“命令”窗口可以在“命令”窗口中鍵入VFP命令并按Enter鍵執(zhí)行。若要重新執(zhí)行該命令,還可以將光標(biāo)移到此命令所在行并按Enter鍵。甚至可以在“命令”窗口中像獨立程序一樣執(zhí)行多行代碼。要在“命令”窗口中運行多行代碼,可以按下述方法執(zhí)行:(1)選取代碼行。(2)按Enter鍵或右擊并在快捷菜單中選擇“運行所選區(qū)域”。因為“命令”窗口是一個編輯窗口,所以在編輯命令時可以使用VFP提供的編輯工具。在“命令”窗口中可以修改、插入、刪除、剪切、復(fù)制和粘貼正文。2024/8/1516在“命令”窗口中執(zhí)行命令的優(yōu)點是:能夠立即執(zhí)行被鍵入的命令,不需要將其保存為文件并用程序方式執(zhí)行。此外,在菜單或?qū)υ捒蛑兴鞯倪x擇可以馬上轉(zhuǎn)換成“命令”窗口中的命令。用戶可以將這些命令復(fù)制并粘貼到VFP程序中,然后重復(fù)執(zhí)行這些程序。這樣做可以很容易地重復(fù)執(zhí)行成百上千條的命令。2、創(chuàng)建程序VFP程序是包含一系列命令的文本文件。在VFP中可以通過下述途徑創(chuàng)建程序:(1)在項目管理器中,選定“代碼”選項卡中的“程序”項;(2)選擇“新建”命令?;蛘撸海?)在【文件】菜單中選擇【新建】命令;(2)在“新建”對話框中選擇“程序”;(3)單擊【新建文件】按鈕?;蛘咴凇懊睢贝翱谥墟I入:MODIFYCOMMAND2024/8/15173、保存程序創(chuàng)建程序后,一定要注意保存程序。若要保存程序,可以從【文件】菜單中選擇【保存】命令。或者按Ctrl+W組合鍵保存,若不想保存對新建程序或已有程序所做的修改,也可以使用Ctrl+Q組合鍵,不存盤而退出編輯窗口。若要關(guān)閉一個沒有保存的程序,則會彈出相應(yīng)對話框,提示用戶是否保存已作的修改。若保存了一個由項目管理器創(chuàng)建的程序,則該程序被加入到項目中。若保存一個尚未命名的程序,則會打開“另存為…”對話框,提示用戶可以在其中為程序指定程序名。程序保存后,可以運行或修改它。4、修改程序程序保存后可以修改。首先,按以下四種方法之一打開想要修改的程序文件:■若程序包含在一個項目中,則在項目管理器中選定它并選擇2024/8/1518修改命令。

■在【文件】菜單中選擇【打開】命令,這時彈出一個包含文件列表的對話框,在“文件類型”列表框中選擇“程序”,然后在文件列表中選定要修改的程序,單擊【確定】按鈕。

■在“命令”窗口中按如下方式鍵入要修改的程序名:MODIFYCOMMAND<程序文件名>

■在“命令”窗口中輸入:MODIFYCOMMAND?

然后從文件列表中選擇要修改的程序,單擊【打開】按鈕。打開文件之后便可進(jìn)行修改,修改完成后就可以保存。5、運行程序程序創(chuàng)建之后便可以運行。若要運行程序,有以下三種方法:■若程序包含在一個項目中,則可在項目管理器中選定它,并選擇【運行】命令。2024/8/1519■在【程序】菜單中選擇【運行】菜單項,然后在程序列表中,選擇想要運行的程序,并單擊【運行】按鈕?!鲈凇懊睢贝翱谥?,按如下方式鍵入DO以及要運行的程序文件名:DO<程序文件名>

6、使用VFP設(shè)計工具編寫代碼借助表單設(shè)計器、類設(shè)計器和菜單設(shè)計器,用戶可以很容易地把程序代碼與用戶界面連接起來,這樣應(yīng)用程序便可響應(yīng)用戶的輸入并執(zhí)行相應(yīng)的代碼。同樣,報表設(shè)計器將程序代碼與報表文件聯(lián)系起來,以定制結(jié)構(gòu)復(fù)雜并且符合用戶要求的報表。如果想充分發(fā)揮VFP的強大功能,應(yīng)充分使用剛才提到的設(shè)計工具。

返回2024/8/15205.2VFP6的程序設(shè)計語言基礎(chǔ)5.2.1VFP的交互式輸入輸出命令5.2.2VFP6程序設(shè)計的條件與循環(huán)返回退出2024/8/15215.2.1VFP的交互式輸入輸出命令

設(shè)計程序,就是用一系列命令存儲數(shù)據(jù)并操作這些數(shù)據(jù)。程序設(shè)計的原材料是數(shù)據(jù)和數(shù)據(jù)的存儲容器,而處理這些原材料的工具是命令、函數(shù)的操作符。1、交互式輸入命令(1)字符接收語句

格式:ACCEPT[<提示信息>]TO<內(nèi)存變量名>

功能:將從鍵盤上接收的字符串?dāng)?shù)據(jù)存入指定的內(nèi)存變量中。提供此命令是為了向后兼容,在VFP中可以用文本框控制命令代替。參數(shù)描述:[<提示信息>]:指定提示信息字符串,其后是數(shù)據(jù)輸入?yún)^(qū)。在VFP中,提示文本的字體與VFP主窗口的字體相同。但輸入的字符數(shù)據(jù)用9磅FoxFont字體顯示。2024/8/1522

[<內(nèi)存變量名>]:指定存儲字符數(shù)據(jù)的內(nèi)存變量或數(shù)組元素。如果沒有定義此內(nèi)存變量,ACCEPT將自動創(chuàng)建。如果沒有輸入數(shù)據(jù)就按Enter鍵,內(nèi)存變量或數(shù)組元素則為空字符串。說明:在VFP中可用表單設(shè)計器或DEFINECLASS來創(chuàng)建文本框控制。ACCEPT命令允許直接向內(nèi)存變量或數(shù)組元素輸入字符數(shù)據(jù),輸入時不需要用引號將字符括起來。執(zhí)行此語句時,先在屏幕上顯示<提示信息>,光標(biāo)緊隨其后,然后暫停程序運行,等待用戶從鍵盤上輸入信息。輸入的信息可以是任何可顯示的ASCII碼字符串,并以回車鍵結(jié)束。系統(tǒng)將此字符串信息存入指定的內(nèi)存變量中,然后,繼續(xù)運行暫停的程序?!纠?-3】試編程完成下述功能:從鍵盤隨機輸入某個表的文件名,要求打開并顯示此表的內(nèi)容。在命令窗口輸入下列命令:MODIFYCOMMANDL503(文件名中的擴展名.PRG可省略,以后不再說明)2024/8/1523

屏幕顯示編輯窗口。在編輯窗口輸入如下程序代碼后用Ctrl+W存盤,返回命令窗口。CLEARSETTALKOFFACCEPT"請輸入表文件名"TOFileNameUSE(FileName)LISTUSERETURN

說明:程序中第四句使用了宏代換函數(shù),這是由于FileName本身不是文件名,而其內(nèi)容才是文件名。(2)通用數(shù)據(jù)接收命令

ACCEPT語句只能給字符型內(nèi)存變量提供數(shù)據(jù)。如果用戶想給其它類型的內(nèi)存變量提供數(shù)據(jù),可以使用下列命令:格式:INPUT[<提示信息>]TO<內(nèi)存變量名>2024/8/1524功能:用于接收從鍵盤上輸入的表達(dá)式,并將計算結(jié)果存入指定的內(nèi)存變量或數(shù)組元素中。包含此命令也是為了提供向后的兼容性。在VFP中,該命令也可以用文本框控制代替。參數(shù)描述:[<提示信息>]:提示信息,提示用戶輸入數(shù)據(jù)。[<內(nèi)存變量名>]:指定一個內(nèi)存變量或數(shù)組元素,存儲從鍵盤輸入的數(shù)據(jù)。如果指定的內(nèi)存變量或數(shù)組元素不存在,VFP將自動創(chuàng)建該內(nèi)存變量或數(shù)組。說明:INPUT語句與ACCEPT語句的執(zhí)行過程相同,功能相似。<內(nèi)存變量名>的數(shù)據(jù)類型取決于輸入數(shù)據(jù)的類型??梢詾閿?shù)字型、字符型、日期型和邏輯型。

INPUT語句與ACCEPT語句的區(qū)別是:ACCEPT命令只能接收字符串,而INPUT語句可以接收任意類型的VFP表達(dá)式;如果輸入的是字符串,ACCEPT語句不要使用字符型定界符,而INPUT語句必須用定界符括起來。2024/8/1525【例5-4】試編程完成下列功能。從鍵盤上隨機輸入一個正數(shù),以此數(shù)為半徑,求圓面積和球體積,并輸出結(jié)果。程序如下:*L504.PRGCLEARCTALK=SET("TALK")SETTALKOFFINPUT"半徑="TORS=PI()*R*RV=4/3*PI()*R**3?"圓面積=",S?"球體積=",VSETTALK&CTALKRETURN程序中的第一行為注釋行,說明此程序文件名;第四行的功能是不顯示命令處理信息,第十行的功能是恢復(fù)顯示命令處理信息。在命令窗口中執(zhí)行:DOL504屏幕顯示半徑=輸入10后按Enter鍵10顯示結(jié)果圓面積=314.16球體積=4188.7902052024/8/1526(3)輸入一個字符語句格式:WAIT[<提示信息>][TO<內(nèi)存變量名>]功能:暫停正在運行的程序,直到輸入一個字符為止。此語句與ACCEPT語句的功能部分相似。若選擇TO<內(nèi)存變量名>子句,則將輸入的單個字符存入指定的內(nèi)存變量。若直接輸入回車鍵,則內(nèi)存變量中存入空字符串。內(nèi)存變量的類型為字符型。若選擇<提示信息>子句,執(zhí)行此命令時,屏幕上將顯示提示信息,否則,屏幕上將顯示“按任意鍵繼續(xù)…”WAIT語句主要用于下列兩種情況?!鰰和3绦虻倪\行,以便觀察程序的運行情況,檢查程序運行的中間結(jié)果。

■根據(jù)實際情況輸入某個字符,以控制程序的執(zhí)行流程。比如,在某應(yīng)用程序的“Y/N”選擇中,常用此命令暫停程序的執(zhí)行,等待用戶回答“Y”或“N”,由于這時只需輸入單個字符,也不用按回車鍵,操作簡便,響應(yīng)迅速。2024/8/15272、格式化輸出命令前面的章節(jié)中在屏幕上顯示信息時,使用的是非格式化輸出命令:“?”或“??”,為了能按一定的要求來設(shè)計屏幕格式,使之美觀、方便,下面介紹一個屏幕顯示格式控制命令。格式:@<行號,列號>SAY<表達(dá)式>

功能:從指定的行、列號開始輸出表達(dá)式的值。說明:①<表達(dá)式>可以是常數(shù)、字段變量及由它們組成的表達(dá)式。②定位輸出時,一次只能輸出一個表達(dá)式。3、程序設(shè)計輔助命令(1)、中止程序運行■在程序運行過程中,按Esc鍵可以中止程序的運行,系統(tǒng)會顯示警告對話框讓用戶選擇:【取消】中止程序運行,這是缺省選擇;【掛起】暫停程序運行,返回命令窗口。當(dāng)選擇【程序】菜單下的【繼續(xù)執(zhí)行】選項或在命令窗口中輸入“Resume”命令,系統(tǒng)2024/8/1528則從中止的地方繼續(xù)程序的執(zhí)行;【忽略】忽略所給的Esc,繼續(xù)程序的執(zhí)行。通常在程序的開始時加有命令:SETESCAPEOFF執(zhí)行該命令后,Esc鍵處于關(guān)閉狀態(tài),在程序運行過程中,用戶不能通過Esc鍵來中止程序的運行,因為在應(yīng)用程序中,不希望中止它;而在程序調(diào)試階段,通常不關(guān)閉這個鍵,讓程序在運行過程中,隨時都可以中斷執(zhí)行,以檢查程序中間的運行狀況。格式一:CANCEL

功能:結(jié)束程序的運行,返回命令窗口,同時關(guān)閉所有打開的文件。格式二:SUSPEND

功能:暫時中止程序運行,返回命令窗口。當(dāng)在菜單中選擇【程序】|【繼續(xù)執(zhí)行】時,或在命令窗口中輸入RESUME命令時,系統(tǒng)再次從中止的地方繼續(xù)執(zhí)行程序。2024/8/1529(2)、注釋命令

格式一:NOTE/*<注釋字符串>格式二:&&<注釋字符串>

說明:上述命令不作任何操作,只是注釋標(biāo)記,用于說明程序或命令的功能等。注釋內(nèi)容不需要用定界符定界,執(zhí)行時也不顯示。注釋信息如果在一行內(nèi)沒有寫完,換行時也必須再寫注釋命令。NOTE或*是用于整行注釋的,因此,它必須寫在每一個注釋行的開頭;而&&命令是用于注釋一行的部分內(nèi)容的,因此,它可以寫在行中(命令的尾部、注釋信息的頭部),這是程序中唯一可以在一個邏輯行寫二個語句的命令。

USESTUDENT&&打開STUDENT表(3)文本顯示命令

格式:TEXT <文本字符串>

ENDTEXT功能:將<文本字符串>原樣輸出。這條命令通常是用于程序中對用戶說明某些問題。返回2024/8/15305.2.2VFP6程序設(shè)計的條件與循環(huán)

VFP的程序結(jié)構(gòu)可以分為三種:順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)。下面將以一個程序演示條件分支結(jié)構(gòu)的循環(huán)結(jié)構(gòu),并對這些概念詳細(xì)說明?!纠?-5】假設(shè)某單位有很多員工,并且要給月工資高于或等于1000元的員工增加5%的工資,給月工資低于1000元的員工增加10%的工資。下面的示例程序?qū)⑼瓿蛇@一任務(wù)。此示例程序假定已在當(dāng)前工作區(qū)打開了員工工資表,表中有一個名為“月工資”的數(shù)值型字段。*L505CTALK=SET("TALK")SETTALKOFFSCAN IF月工資>=1000

REPLACE月工資WITH月工資*1.052024/8/1531ELSE REPLACE月工資WITH月工資*1.1

ENDIFENDSCAN SETTALK&CTALKRETURN在這一示例程序中用到了順序結(jié)構(gòu)、循環(huán)結(jié)構(gòu)和條件分支結(jié)構(gòu)。1、條件語句條件分支根據(jù)條件的計算結(jié)果執(zhí)行不同的操作。條件分支結(jié)構(gòu)邏輯流程圖:入口條件判斷真假語句序列1出口語句序列2VFP中有兩條命令實現(xiàn)條件分支:格式:IF<條件表達(dá)式> <語句序列1> [ELSE <語句序列2>] ENDIF單條件選擇命令2024/8/1532參數(shù)描述:<條件表達(dá)式>:指定要計算的邏輯表達(dá)式。如果<條件表達(dá)式>的值為“真”,則執(zhí)行IF語句之后的<語句序列1>;如果<條件表達(dá)式>的值為“假”,而且包含ELSE語句和<語句序列2>,則執(zhí)行<語句序列2>;如果<條件表達(dá)式>的值為“假”,而且不包含ELSE語句和<語句序列2>,則程序忽略IF語句和ENDIF語句之間的所有語句,程序從ENDIF語句后的第一條命令開始繼續(xù)往下執(zhí)行其它程序。

說明:一個IF…ENDIF語句塊中可以嵌套另一個IF…ENDIF語句塊。從【例5-5】所示的程序中可以看到:當(dāng)當(dāng)前記錄中“月工資”字段的值大于等于1000元時,將使“月工資>=1000”這個條件表達(dá)式的值為“真”,此時,程序控制執(zhí)行<語句序列1>“REPLACE月工資WITH月工資*1.05”,即將月工資高于或等于1000元的工資上調(diào)5%。否則,即當(dāng)當(dāng)前記錄中“月工資”字段的值低于10002024/8/1533元時,將使“月工資>=1000”這個條件表達(dá)式的值為“假”,此時,程序控制執(zhí)行<語句序列2>“REPLACE月工資WITH月工資*1.1”,即將月工資低于1000元的工資上調(diào)10%。(2)多條件選擇語句格式:DOCASECASE<條件表達(dá)式1> <語句序列1>[CASE<條件表達(dá)式2> <語句序列2> …CASE<條件表達(dá)式N> <語句序列N>][OTHERWISE <語句序列N+1>]ENDCASE

參數(shù)描述:

CASE<條件表達(dá)式1><語句序列1>…:VFP在執(zhí)行這條多條件選擇命令時,按命令行中寫出的條件表達(dá)式的順序逐條檢查<條件表達(dá)式>,當(dāng)遇到第一個結(jié)果為“真”的<條件表達(dá)式>時,就執(zhí)行它后面的語句序列。語句序列中的命令逐條被執(zhí)行,直到遇到下一個CASE或OTHER-WISE或ENDCASE,然后,2024/8/1534再從ENDCASE語句后的第一條命令開始繼續(xù)執(zhí)行其它命令。如果一個CASE<條件表達(dá)式>的<條件表達(dá)式>為“假”,就忽略它后面的語句序列?!纠?-6】運行一個程序,隨機輸出一條信息:CLEARAA=INT(RAND()*10)&&隨機產(chǎn)生一個10以內(nèi)的整數(shù)DOCASE CASEAA=0 ?“這次產(chǎn)生的隨機數(shù)是:0”

CASEAA=1 ?“這次產(chǎn)生的隨機數(shù)是:1”

CASEAA=2 ?“這次產(chǎn)生的隨機數(shù)是:2”

CASEAA=3 ?“這次產(chǎn)生的隨機數(shù)是:3”

OTHERWISE ?“這次產(chǎn)生的隨機數(shù)是:大于3!”

ENDCASE2024/8/15352、循環(huán)語句程序設(shè)計中的循環(huán),是指在程序中從某處開始,有規(guī)律地反復(fù)執(zhí)行某一個程序塊的現(xiàn)象。VFP的循環(huán)命令有三類:基于條件的循環(huán)、基于計數(shù)的循環(huán)和基于表的循環(huán)。(1)基于條件的循環(huán):DOWHILE命令格式:DOWHILE<條件表達(dá)式> [<語句序列>] [EXIT] [LOOP] ENDDO參數(shù)描述:<條件表達(dá)式>:指定一個邏輯表達(dá)式,它的值決定是否執(zhí)行DOWHILE和ENDDO之間的命令集合。如果<條件表達(dá)式>的值為“真”,就執(zhí)行命令集。[<語句序列>]:指定當(dāng)<條件表達(dá)式>計算為“真”時要執(zhí)行的2024/8/1536[LOOP]:直接將程序控制返回到DOWHILE語句,并重新計算條件值。LOOP可以放在DOWHILE和ENDDO之間的任何位置。[EXIT]:將程序控制從DOWHILE和ENDDO循環(huán)的內(nèi)部轉(zhuǎn)到ENDDO后的第一條命令。EXIT可以放在DOWHILE和ENDDO之間的任何位置。ENDDO:表明DOWHILE語句的結(jié)束。【例5-7】計算連續(xù)自然數(shù)之和,并且顯示和剛大于1000的最后一個自然數(shù)。STORE0TOAA,BBDOWHILEAA<=1000 BB=BB+1 AA=AA+BBENDDO?BB結(jié)果顯示為45。VFP命令集。2024/8/1537【例5-8】求連續(xù)N個不是7的倍數(shù)的自然數(shù)之和,當(dāng)和是101的倍數(shù)時顯示最后的自然數(shù)和它們的和。STORE0TOAA,BB&&定義二個變量,用以保存累加值和累加數(shù)DOWHILE.T. BB=BB+1 IFMOD(BB,7)=0&&判斷BB是否為7的倍數(shù)

LOOP&&如果BB是7的倍數(shù)則返回去將BB再加1

ENDIF AA=AA+BB&&將BB不是7的倍數(shù)的連續(xù)自然數(shù)累加求和

IFMOD(AA,101)=0&&判斷AA是否是101的倍數(shù)

EXIT&&如果AA是101的倍數(shù),則結(jié)束程序的循環(huán)

ENDIFENDDO?BB,AA屏幕顯示結(jié)果為207和18483。2024/8/1538(2)基于計數(shù)的循環(huán):FOR命令

格式:FOR<內(nèi)存變量>=<初始值>TO<終值>[STEP<步長>] <語句序列> [EXIT] [LOOP] ENDFOR/NEXT

參數(shù)描述:<內(nèi)存變量>:指定作為計數(shù)器的內(nèi)存變量或數(shù)組元素。在執(zhí)行FOR…ENDFOR語句之前,此內(nèi)存變量或數(shù)組元素不一定存在。<初始值>TO<終值>:<初始值>是計數(shù)器的初始值,而<終值>是計數(shù)器的終止值。[STEP<步長>]:是計數(shù)器遞增或遞減的步長。如果<步長>是負(fù)值,則計數(shù)器遞減;如果省略STEP子句,計數(shù)器每次遞增1。<語句序列>:指定要執(zhí)行的VFP命令,它可以包含任意數(shù)量的命令。2024/8/1539[EXIT]:將控制權(quán)交給緊接在ENDFOR后面的命令??梢栽贔OR與ENDFOR之間的任何地方放置EXIT。[LOOP]:將控制權(quán)直接交給FOR子句,不再執(zhí)行LOOP與ENDFOR之間的語句。計數(shù)器正常遞增或遞減,就像執(zhí)行到ENDFOR子句一樣??梢栽贔OR與ENDFOR之間的任何地方放置LOOP。說明:可以用內(nèi)存變量或數(shù)組元素作為計數(shù)器,指定FOR…ENDFOR循環(huán)中VFP命令的執(zhí)行次數(shù)。在遇到ENDFOR或NEXT之前,始終執(zhí)行FOR后面的VFP命令。執(zhí)行過程中,每循環(huán)一次,計數(shù)器都會產(chǎn)生一次計數(shù),計數(shù)增量由<步長>值控制,然后把計數(shù)器的值與<終值>進(jìn)行比較,決定是否進(jìn)行下一次循環(huán)。【例5-9】求1到100中偶數(shù)的和AA=0FORII=2TO100STEP2 AA=AA+IIENDFOR?AA屏幕顯示為:25502024/8/1540(3)基于表的循環(huán)命令

格式:SCAN[<范圍>][FOR<條件>][WHILE<條件>] [<語句序列>] [LOOP] [EXIT] ENDSCAN參數(shù)描述:[<范圍>]:指定對當(dāng)前表中記錄掃描的范圍。只有在范圍之內(nèi)的記錄才有可能掃描到。SCAN命令的默認(rèn)范圍為ALL。[FOR<條件>]:只有條件表達(dá)式的計算結(jié)果為“真”的記錄,才能對其執(zhí)行命令。包含F(xiàn)OR子句可以篩選出不想掃描的記錄。[WHILE<條件>]:指定一個邏輯表達(dá)式作為執(zhí)行命令的條件,只要邏輯表達(dá)式計算為“真”,就對記錄執(zhí)行命令,直到遇到使表達(dá)式不為“真”的記錄為止。[<語句序列>]:指定要執(zhí)行的VFP命令集。2024/8/1541[LOOP]:把控制權(quán)直接交給SCAN子句。LOOP子句可以放在SCAN和ENDSCAN之間的任何地方。[EXIT]:把控制權(quán)力從SCAN…ENDSCAN循環(huán)語句交給ENDSCAN下面的命令。EXIT子句可以放在SCAN和ENDSCAN之間的任何地方。ENDSCAN:標(biāo)志SCAN過程的結(jié)束。說明:SCAN命令自動將記錄指針移到下一條滿足條件的記錄,并執(zhí)行相應(yīng)的命令塊。【例5-10】逐條顯示STUDENT表中男生的情況。USESTUDENTSCANFOR性別=”男”

DISP WAITENDSCANUSE或者使用下列代碼:

USESTUDENTSCAN IF性別#”男”

LOOP ENDIFDISP WAITENDSCANUSE2024/8/15423、使用過程和自定義函數(shù)

(1)子程序和過程的調(diào)用子程序或過程的編寫和修改方式與一般的程序一樣,不同的是過程的最后一個語句必須是返回語句(RETURN),調(diào)用過程的程序是主程序,過程可以嵌套,即一個子程序可以再調(diào)用其它子程序,但不能形成循環(huán)嵌套。子程序或過程的調(diào)用也是用DO命令:格式:DO<過程名>[IN<程序文件名>][WITH<參數(shù)表>]

功能:執(zhí)行過程名所指定的子程序。WITH用于主程序和子程序間參數(shù)的傳遞。參數(shù)描述:

<過程名>:指定要執(zhí)行的過程名稱。VFP首先在當(dāng)前執(zhí)行的程序中查找此過程,如果在該程序中找不到此過程,VFP就在用SETPROCEDURE命令打開的過程文件中查找此過程,如果還未找到,則以反向調(diào)用順序在當(dāng)前打開的其它程序文件中查找此內(nèi)2024/8/1543內(nèi)部過程;若仍未找到,則在磁盤上檢索以.FXP為擴展名的外部過程;若還未找到,最后檢索以.PRG擴展名的外部過程,并把它編譯為.FXP文件。在執(zhí)行一個可執(zhí)行文件或應(yīng)用程序中,多個過程可以有相同的過程名。當(dāng)使用DO去啟動一個可執(zhí)行文件或一個應(yīng)用程序的過程時,VFP只在可執(zhí)行文件或應(yīng)用程序的主程序中搜索指定的過程。IN<程序文件名>:執(zhí)行<程序文件名>指定的程序文件中的一個過程。當(dāng)找到該文件時就執(zhí)行該過程。如果找不到該程序文件,就會顯示“文件不存在”的信息。如果找到了程序文件,但指定的過程不存在,就會顯示“找不到過程”的信息。[WITH<參數(shù)表>]:指定要傳遞給程序或過程的參數(shù)。列在<參數(shù)表>中的可以是表達(dá)式、內(nèi)存變量、字母和數(shù)字、字段或用戶自定義函數(shù)。默認(rèn)情況下,參數(shù)按引用傳遞給程序和過程,也可以將參數(shù)放在括號中按值傳遞。傳遞給程序或過程的參數(shù)的最大數(shù)目為27。2024/8/1544(2)子程序或過程的返回語句

格式:RETURN[<表達(dá)式>/TOMASTER/TO<過程名>]

功能:將程序控制權(quán)返回給調(diào)用程序。參數(shù)描述:

[<表達(dá)式>]:指定返回給調(diào)用程序的表達(dá)式。如果省略RETURN命令或省略返回表達(dá)式,則自動將“真”返回給調(diào)用程序。[TOMASTER]:將控制權(quán)返回給最高層的調(diào)用程序。[TO<過程名>]:將控制權(quán)返回給指定的過程。說明:RETURN終止程序、過程或函數(shù)的運行,并將控制權(quán)返回給調(diào)用程序、最高次調(diào)用程序、另一個程序或窗口。當(dāng)執(zhí)行RETURN命令時,VFP釋放PRIVATE(專用)類型的內(nèi)存變量。通常,RETURN放在程序、過程或函數(shù)的末尾,用來將控制返回給高層的程序。但是,如果省略RETURN命令,一個隱含的RETURN命令也將被執(zhí)行。2024/8/1545子程序或過程調(diào)用及返回示意圖

【例5-11】計算圓面積的主程序為MYMAIN.PRG,子程序為MYSUB.PRG*MYMAIN.PRGCTALK=SET("TALK")SETTALKOFFCLEARSTORE0TORR,AREA2024/8/1546DOWHILE.T.INPUT"請輸入圓的半徑:"TORR DOMYSUBWITHRR,AREA ?"圓的面積是:",AREA WAIT"還要繼續(xù)計算嗎(Y/N)?"TOANSWER IFUPPER(ANSWER)="Y" LOOP ELSE EXIT ENDIFENDDOSETTALK&CTALK

*MYSUB.PRGPROCEDUREMYSUBPARAMETERSR,SS=PI()*R^2RETURN}以一個獨立的文件形式存在2024/8/1547(3)過程文件的建立

在實際的程序設(shè)計中,需要調(diào)用的過程不是一個或二個,而是幾個、十幾個甚至上百個,這就有可能使打開的文件數(shù)超過系統(tǒng)允許打開的文件數(shù),而且將導(dǎo)致磁盤目錄過于龐大,使系統(tǒng)調(diào)用文件的速度降低,程序執(zhí)行速度也隨之下降,因而有必要將若干個過程按一定的規(guī)定放在一個大文件中,這個文件稱為過程文件。1)過程文件的建立命令格式與建立程序文件一樣:格式:MODIFYCOMMAND<過程文件名>

過程文件的格式要求每個過程文件的開頭必須用下列語句:格式:PROCEDURE<過程名>

功能:標(biāo)明是一個過程。參數(shù)描述:<過程名>:指定過程名稱。命名方法與文件名的命名方法相同。2024/8/1548過程文件的內(nèi)容如下:

PROCEDURE<過程名1><語句序列1>RETURNPROCEDURE<過程名2><語句序列2>RETURN……PROCEDURE<過程名N><語句序列N>RETURN說明:在一個過程文件中可以包含多個過程,在同一個過程文件中不允許出現(xiàn)相同的過程名,如果有相同的過程名,則只有第一次出現(xiàn)的過程才有被調(diào)用的可能。一個過程文件中最多允許包含128個過程。2)過程文件的調(diào)用過程文件和表文件一樣,都是在先打開后才能使用。①過程文件的打開命令

格式:SETPROCEDURETO<過程文件名>

在主程序中應(yīng)先打開過程文件,將過程文件中的所有過程都調(diào)入2024/8/1549內(nèi)存(打開一個過程文件只算打開了一個文件)當(dāng)過程文件不再用時應(yīng)將其關(guān)閉,以節(jié)省內(nèi)存空間。系統(tǒng)允許打開一個過程文件,當(dāng)打開另一個過程文件時,先已打開的過程文件系統(tǒng)會自動將其關(guān)閉?!纠?-12】程序中常用到計算圓面積、長方形面積、階乘等,現(xiàn)將它們編為三個過程,放在一個過程文件(MYPROCED.PRG)中,被主程序MYMAIN.PRG調(diào)用。*MYMAINCLEARTEXT這是一個計算圓面積、長方形面積、階乘等的程序,先輸入功能選擇:1--計算圓面積;2--計算長方形面積;3--計算階乘;4--退出。再輸入?yún)?shù):所有數(shù)據(jù)之間用逗號","分隔。如計算長方形面積則在下面的提示信息后面輸入2,10,15。ENDTEXTCTALK=SET("TALK")SETTALKOFFSETPROCEDURETOMYPROCEDDOWHILE.T.ACCEPT"請輸入您的功能選擇及參數(shù):"TOSELECTPROGNAME="PROGRAM"+SUBSTR(SELECT,1,1)2024/8/1550IF(SUBSTR(SELECT,1,1)="1".OR.SUBSTR(SELECT,1,1)="3").AND.OCCURS(",",SELECT)#1;.OR.SUBSTR(SELECT,1,1)="2".AND.OCCURS(",",SELECT)#2.OR.SUBSTR(SELECT,1,1)>"4";.OR.SUBSTR(SELECT,1,1)<"1" WAITWINDOWAT15,20"輸入的參數(shù)錯誤,請重新輸入!"NOWAIT LOOPELSE IFSUBSTR(SELECT,1,1)="4" EXIT ENDIFENDIFIFOCCURS(",",SELECT)=1 POSITION=ATC(",",SELECT,1) AA=VAL(SUBSTR(SELECT,POSITION+1,LEN(SELECT)-POSITION)) DO(PROGNAME)WITHAAELSE POSITION1=ATC(",",SELECT,1) POSITION2=ATC(",",SELECT,2) AA=VAL(SUBSTR(SELECT,POSITION1+1,LEN(SELECT)-POSITION1)) BB=VAL(SUBSTR(SELECT,POSITION2+1,LEN(SELECT)-POSITION2)) DO(PROGNAME)WITHAA,BBENDIFENDDOCLOSEPROCEDURESETTALK&CTALKRETURN2024/8/1551*MYPROCEDPROCEDUREPROGRAM1PARAMETERSRS=PI()*R^2?"半徑為"+ALLTRIM(STR(R))+"的圓的面積為:",SRETURNPROCEDUREPROGRAM2PARAMETERSLONG,WIDTHS=LONG*WIDTH?"長為"+ALLTRIM(STR(LONG))+"寬為"+ALLTRIM(STR(WIDTH))+;"的長方形的面積為:",SRETURNPROCEDUREPROGRAM3PARAMETERSRN=1T=1DOWHILEN<=R T=T*N N=N+1ENDDO ?"值為"+ALLTRIM(STR(R))+"的階乘為:",TRETURN2024/8/1552③遞歸調(diào)用在過程中不但可以調(diào)用另外一個過程,而且還可以調(diào)用自己,這就叫遞歸調(diào)用?!纠?-13】求一個30以內(nèi)的自然數(shù)的階乘。*MYMAIN.PRGCTALK=SET("TALK")SETTALKOFFSETPROCEDURETOMYSUBINPUT“請輸入一個30以內(nèi)的正整數(shù):”TONUMBERII=1DOMYSUBWITHNUMBER,IICLOSEPROCEDURESETTALK&CTALKRETURN

*MYSUB.PRGPROCEDUREMYSUBPARAMETERSMM,NNIFMM>1 DOMYSUBWITHMM-1,NN&&遞歸調(diào)用。請注意同下一句的次序

NN=NN*MM&&計算乘積。ENDIF?STR(MM,2)+”!=”+STR(NN,10)RETURN返回2024/8/15535.3VFP6程序設(shè)計步驟5.3.1對任務(wù)進(jìn)行說明退出5.3.2分解問題5.3.3編制模塊5.3.4測試模塊5.3.5組裝全部模塊5.3.6整體測試5.3.7提高程序的可靠性5.3.8將程序定義為過程或函數(shù)

返回2024/8/15545.3.1對任務(wù)進(jìn)行說明

開始解決問題之前,需要將其說明清楚。有時調(diào)整問題的說明方式會有助于問題的解決。假設(shè)從不同的數(shù)據(jù)源獲得一批數(shù)據(jù),其中大部分是數(shù)值型數(shù)據(jù),但有些數(shù)據(jù)中,除包含數(shù)字字符外,還夾雜著一些虛線和空格?,F(xiàn)在需要從字段中清除這些虛線和空格,并將所得到的數(shù)字型數(shù)據(jù)加以保存??梢园慈缦路绞秸f明需要這個程序達(dá)到的目的,而不是簡單地立即著手從原始數(shù)據(jù)中除去空格和虛線。目標(biāo)——用新值替換字段中的原值,新值包含原值中除空格和虛線以外的所有內(nèi)容。這種說明方式的優(yōu)點在于避免在處理長字符串時遇到的困難。5.3.2分解問題

因為最終是以操作、命令和函數(shù)的方式將具體的指令提供給VFP6,所以需要將問題分解為多個獨立的步驟。在本問題中,最容易分離出來的方法是在字符串中逐個掃描字符,只有將單個字符分離出來才能解決是否應(yīng)該保存它。返回2024/8/1555在掃描字符的時候,將檢查它是否為虛線和空格。到了這一步也許想要更詳細(xì)地說明這個問題,括號之后的數(shù)據(jù)應(yīng)該如何提取,貨幣符號、逗號和句號該如何消除等一系列問題將出現(xiàn)在大腦中。代碼越通用,為將來節(jié)省的時間就越多,問題在于如何做到事半而功倍。下面給出一個比從前適用范圍更廣的問題說明方式。精煉的目標(biāo)——用原始數(shù)據(jù)中的數(shù)值型字符更新字段值。這便是在字符的層次上重新說明問題。如果字符是數(shù)值則保留,否則將指針移向下一個字符。當(dāng)用原始字符串中的數(shù)值重新構(gòu)成一個只包含有數(shù)值元素的新串時,用這個新串替換掉原來的字符串。如此循環(huán),直到將所有記錄中的數(shù)據(jù)全部更新。概括起來,全部問題可以分解成以下一些模塊:■逐個檢查字符;■判斷該字符是否為數(shù)值;■若是數(shù)值,則將其復(fù)制到新串中;■檢查完字符串的全部后,用只含數(shù)字的新串替換原串;■重復(fù)上述步驟,直到表中的全部記錄都被更新。返回2024/8/15565.3.3編制模塊

清楚了要達(dá)到的目標(biāo)以后,便可以開始用VFP6的命令、函數(shù)和操作符構(gòu)造各模塊。因為命令和函數(shù)是用來處理數(shù)據(jù)的,所以需要一些數(shù)據(jù)來測試其功能。這些用于測試的數(shù)據(jù)應(yīng)與實際數(shù)據(jù)盡量相近。例如,在命令窗口中輸入如下命令,將一個測試字符串賦值給變量:cTest=”123_456_789_0”1、逐個檢查字符首先,用SUBSTR()函數(shù)(子字符串截取函數(shù))在字符串中逐個字符截取檢查。?Substr(cTest,1,1)?Substr(cTest,4,1)?Substr(cTest,10,1)?Substr(cTest,11,1)

輸出結(jié)果:1-(空格)82024/8/1557

也可以使用循環(huán)結(jié)構(gòu)多次重復(fù)執(zhí)行相同的操作。因為用以測試的字符串有固定的字符數(shù)(15),即使在表的記錄中這個字段的長度不是定長,也能夠使用FOR循環(huán)命令。因為FOR循環(huán)的計數(shù)器每執(zhí)行一遍增1,因此,可以在SUBSTR()函數(shù)中使用該計數(shù)器。所以可以編寫一個示例程序:FORII=1TO15 ??SUBSTR(cTest,II,1)ENDFOR將此程序保存為L508.PRG后運行運行結(jié)果123_456_789_02、判斷字符是否為數(shù)字從字符串中分離出單個字符之后便可以判斷它是否為數(shù)字。在命令窗口中輸入如下命令:?ISDIGIT(“2”)

運行結(jié)果.T.?ISDIGIT(“_”)?ISDIGIT(SUBSTR(cTest,10,1))

.F..F.2024/8/15583、若字符為數(shù)值,將它復(fù)制到新串中既然可以逐一檢查字符是否為數(shù)值,下面可以使用內(nèi)存變量來保存該數(shù)字。為了創(chuàng)建一個變量,需要給它賦一個初值——一個零長度的字符串。cNumbVar=””因為FOR循環(huán)掃描整個字符串,所以最好用一個變量暫存每次分離出來的字符以便處理。cCharacter=SUBSTR(cTest,II,1)提示:在計算、求值以及在函數(shù)中得到的結(jié)果,最好保存在內(nèi)存變量中,這樣便于直接處理這些變量而不必重新計算或求值??梢允褂靡韵麓a將每個被確認(rèn)為數(shù)字的字符添加到新串中:cNumbVar=cNumbVar+cCharacter完整的程序cNumbVar=””FORII=1TO15 cCharacter=SUBSTR(cTest,II,1) IFISDIGIT(cCharacter) cNumbVar=cNumbVar+ccharacter

ENDIFENDFOR返回2024/8/15595.3.4測試模塊

如果將兩行用于輸出字符串的命令加到程序末尾并運行程序,就可以看出程序如何對測試字符進(jìn)行操作。cNumbVar=””FORII=1TO15 cCharacter=SUBSTR(cTest,II,1) IFISDIGIT(cCharacter) cNumbVar=cNumbVar+ccharacter

ENDIFENDFOR?cTest?cNumbVar程序運行結(jié)果

輸出似乎是正確的,但在測試模塊過程中改變被測試字符串將出現(xiàn)問題。如在命令窗口中執(zhí)行下一條命令后再運行這部分代碼將出現(xiàn)問題:

cTest=”123_456_789ab0”

程序運行結(jié)果123_456_789ab0123456789123_456_789_01234567890因為FOR循環(huán)只執(zhí)行15次,而被測試字符串的長度有16個字符。2024/8/1560對于可變長字符串需要用另外的辦法。能否有一種方法,讓FOR循環(huán)知道被測試字符串的長度?循環(huán)次數(shù)由被測試字符串的長度來決定?事實上VFP提供了一個函數(shù)LEN()可以檢測字符串的長度。如果將它放在FOR循環(huán)命令中,那么程序在上述兩種情況下都能很好地運行。cNumbVar=””FORII=1TOLEN(cTest) cCharacter=SUBSTR(cTest,II,1) IFISDIGIT(cCharacter) cNumbVar=cNumbVar+ccharacter

ENDIFENDFOR?cTest?cNumbVar程序運行結(jié)果123_456_789ab01234567890在命令窗口中執(zhí)行下一條命令后再運行這部分代碼cTest="123_456_789ab0cd1e23"程序運行結(jié)果123_456_789ab0cd1e231234567890123返回2024/8/15615.3.5組裝全部模塊

若要完善此程序,則要從表中讀取數(shù)據(jù)。在對表進(jìn)行操作時,需要逐條掃描記錄,針對表中記錄的字段而不是變量進(jìn)行操作。為了說明此步驟,先將STUDENT表中的“學(xué)號”字段的值進(jìn)行修改后作為一個測試用表,修改后的STUDENT表中數(shù)據(jù)如圖5-9所示:圖5-9測試用數(shù)據(jù)

在對字段中的字符串進(jìn)行處理后,目的并不是要將結(jié)果保存在內(nèi)存變量中,而是要將處理后的值用來替換原來字段中的值。要對字段的值進(jìn)行替換,前面已經(jīng)講過可以用REPLACE命令:2024/8/1562REPLACE學(xué)號WITHcNumbVar在將此條語句加入到程序中后,因為這個程序的功能目前還只是對當(dāng)前一條記錄的“學(xué)號”字段進(jìn)行處理,而不是對表中所有記錄同時進(jìn)行處理,這離要求還差一步。通過前面講到的要對表中的記錄進(jìn)行全部或部分記錄進(jìn)行處理時,可以使用基于表的循環(huán)命令SCAN…ENDSCAN命令。將這些進(jìn)行組裝時要注意,因為前面的程序是基于內(nèi)存變量編寫的,現(xiàn)在是要將這些代碼用于對表中記錄進(jìn)行處理,為此要將原字符串變量名cTest改為表中的字段名“學(xué)號”,最后的程序如下:SCAN cNumbVar=”” FORII=1TOLEN(學(xué)號)

cCharacter=SUBSTR(學(xué)號,II,1) IFISDIGIT(cCharacter) cNumbVar=cNumbVar+ccharacter

ENDIF ENDFOR REPLACE學(xué)號WITHcNumbVarENDSCAN返回2024/8/15635.3.6整體測試

完成全部代碼之后,在處理實際數(shù)據(jù)之前,必須用示例數(shù)據(jù)進(jìn)行測試。運行此程序時,如果當(dāng)前工作區(qū)中沒有表打開,此程序?qū)⒁笙却蜷_一個表,如果先將STUDENT表打開后再運行此程序,則此程序可正常運行。程序運行后屏幕顯示的結(jié)果如圖5-9所示:圖5-10運行程序測試后STUDENT表中的部分?jǐn)?shù)據(jù)

到此,程序設(shè)計基本完成,但為了使程序更可靠,需要進(jìn)行下面的改進(jìn)工作。返回2024/8/15645.3.7提高程序的可靠性

所謂可靠的程序是指一個程序不僅能夠完成設(shè)計的功能,還可以預(yù)料到可能發(fā)生的錯誤并進(jìn)行排錯處理。上面的程序包含有二個假設(shè),只有滿足了這兩個條件,程序才能正常運行。這兩個假設(shè)是:在當(dāng)前目錄中有STUDENT表,或者有一個打開的表;同時,STUDENT表中有“學(xué)號”字段,或者當(dāng)前工作區(qū)中打開的表中有“學(xué)號”字段。如果事先指定打開表,就會限制程序的使用范圍,最好的辦法是在運行程序時,由用戶根據(jù)情況決定打開哪個表。下面是改進(jìn)后的程序,它具備了預(yù)料并排除錯誤的功能:ACCEPT“請輸入要處理的表文件名”TOTABNAMESRLtableOK=.F.&&此變量確定程序正常運行的條件之一是否成立。

&&初始值為.F.,假設(shè)條件不成立。LfieldOK=.F.&&此變量確定程序正常運行的另一條件是否成立。TABNAME=””&&定義一個變量用于保存表文件名IFAT(“.”,TABNAMESR)=0 TABNAME=TABNAMESR+”.DBF”&&使輸入的文件名帶有擴展名2024/8/1565ENDIFDOWHILE.T.

IFFILE(TABNAME)

&&判斷所輸入的文件名是否存在。

USE(TABNAME)&&打開所輸入的表文件

LtableOK=.T.&&將表的標(biāo)志置為“.T.”

EXIT&&跳出循環(huán)體

ELSE

=MESSAGEBOX(“當(dāng)前目錄中沒有所輸入的表文件!”,64,”表名錯誤!”)

USE?&&顯示“打開”對話框,重新選擇表

IFUSED()&&判斷是否將一個表打開

EXIT &&若有表打開也跳出循環(huán)體

ENDIF ENDIFENDDO*這部分代碼檢查當(dāng)前表的每一個字段,直到發(fā)現(xiàn)有一個名為“學(xué)號”的字段,*發(fā)現(xiàn)該字段存在后,設(shè)置LfieldOK為.T.,同時執(zhí)行EXIT命令跳出循環(huán)體,*否則LfieldOK變量仍為.F.。FORII=1TOFCOUNT() IFFIELD(II)=”學(xué)號”.AND.TYPE(“學(xué)號”)=”C”

LfieldOK=.T.

EXIT2024/8/1566 ENDIFENDFORIFLtableOK.AND.LfieldOK

SCAN

cNumbVar=”” FORII=1TOLEN(學(xué)號)

cCharacter=SUBSTR(學(xué)號,II,1) IFISDIGIT(cCharacter) cNumbVar=cNumbVar+ccharacter

ENDIF ENDFOR REPLACE學(xué)號WITHcNumbVar

ENDSCANENDIF

該程序最大的局限在于只能處理一個字段。若需要對一個字段名不是“學(xué)號”的字段進(jìn)行同樣的操作,就不得不從頭開始檢查程序,把全部的“學(xué)號”改為所要處理的字段名。返回2024/8/15675.3.8將程序定義為過程或函數(shù)

可以將刪除字符串中非數(shù)字字符的程序代碼轉(zhuǎn)換成為函數(shù),使其運行更可靠。所建立的函數(shù)返回字符串中的所有數(shù)字字符?!纠?-15】刪除字符串中非數(shù)字字符示例過程:FUNCTIONNUMBERONLY(CMIXEDVAL)cNumbVar=””FORII=1TOLEN(CMIXEDVAL) cCharacter=SUBSTR(CMIXEDVAL,II,1) IFISDIGIT(cCharacter) cNumbVar=cNumbVar+ccharacter

ENDIFENDFORRETURNcNumbVarENDFUNCSCAN REPLACEFIELDNAMEWITHNUMBERONLY(FIELDNAME)ENDSCAN或者,可以更簡單地寫為:REPLACEALLFIELDNAMEWITHNUMBERONLY(FIELDNAME)

除了可以使用戶在許多條件下使用這些代碼之外,函數(shù)還提高了程序的可讀性。如果要對一個已打開表的某個字段使用該功能,可以運行下列代碼:返回2024/8/15685.4面向?qū)ο蟮某绦蛟O(shè)計技術(shù)5.4.1面向?qū)ο髴?yīng)用程序示例5.4.2類的概念5.4.3對象和方法5.4.4類的封裝、繼承和多態(tài)性

退出5.4.5類的操作方法返回2024/8/15695.4.1面向?qū)ο髴?yīng)用程序示例

設(shè)計一組記錄定位按鈕。使用定位按鈕組來允許用戶在表中移動記錄指針,其中典型的便是在表中上移或下移一條記錄,或者移向表的首記錄或尾記錄。因為所有的應(yīng)用程序中用到的定位按鈕組都有一些共同的特點和動作,所以創(chuàng)建一個定位按鈕類是一個好方法。在此之后,便可以很容易地從這些共同的外觀和功能中派生出所需要的命令按鈕組。在本實例中,首先進(jìn)行構(gòu)建定位按鈕類的父類(NAVBUTTON類),再創(chuàng)建子類定義四種定位按鈕的特定功能和外觀。這四個按鈕為:NVATOP、NAVPRIOR、NAVNEXT和NAVBOTTOM。最后,創(chuàng)建VCR容器類,每一種按鈕都被加入到容器類中。如果該容器可以加到表單或工具欄中,就可以用來向表單提供表中記錄的定位功能。第1步、構(gòu)建定位按鈕父類。若要創(chuàng)建父類NAVBUTTON,要2024/8/1570

將如下六個類定義(NAV_BUTTON、NAVTOP、NAVPRIOR、NAVTEXT、NAVBOTTOM和VCR)保存到一個程序文件中。*通用定位按鈕父類的定義DEFINECLASSNAVBUTTONASCOMMANDBUTTON&&定義定位按鈕的父類HEIGHT=25

&&給類設(shè)置大小屬性WIDTH=75TABLEALIAS=””&&使用TableAlias自定義屬性來保存需要進(jìn)行定位操作的表別名。&&若設(shè)置了TableAlias,父類過程在子類定位代碼執(zhí)行以前選擇有該別名的表。&&否則,將假定用戶需要對當(dāng)前工作區(qū)中的表進(jìn)行定位PROCEDURECLICK IF.NOT.EMPTY(THIS.TABLEALIAS) SELECT(THIS.TABLEALIAS) ENDIFENDPROCPROCEDUREREFRESHFORM _SCREEN.ACTIVEFORM.REFRESH&&使用_SCREEN.ActiveForm.Refresh代替ENDPROC

&&Thisform.Refresh。使得該類即可以加入到表單ENDDEFINE&&也可以加入到工具欄,并具有同樣的功能。2024/8/1571第2步、定義四個定位按鈕類。所有特定的定位按鈕都基于NAVBUTTON類,下面的代碼定義了定位按鈕組中的TOP(第一條)按鈕,并給出比較詳細(xì)的注釋,其它的三類定位按鈕與第一類相似,注釋簡略。*TOP定位按鈕類定義DEFINECLASSNAVTOPASNAVBUTTON&&定義Top定位按鈕類

CAPTION=”第一條”&&設(shè)置Caption(按鈕名)屬性

PROCEDURECLICK&&創(chuàng)建控件發(fā)生點擊事件所執(zhí)行的方法程序代碼

DODEFAULT()&&調(diào)用父類Navbutton的Click事件代碼,

&&以便當(dāng)TableAlias屬性設(shè)置之后,可以選擇適當(dāng)?shù)膭e名。

GOTOP&&包含將記錄指針移向首記錄的代碼:GoTop THIS.REFRESHFORM ENDPROC&&點擊過程結(jié)束。ENDDEFINE

&&類定義結(jié)束。說明:調(diào)用父類的RefreshForm方法程序,沒有必要使用域操作符(::)、因為在子類中沒有與父類中此方法程序重名的方法程序,但父類和子類中都有Click事件的方法程序代碼。2024/8/1572*NEXT定位按鈕類的定義DEFINECLASSNAVNEXTASNAVBUTTON&&定義Next定位按鈕類

CAPTION=”下一條”&&設(shè)置Caption屬性

PROCEDURECLICK&&定義Click事件代碼

DODEFAULT()&&執(zhí)行父類的Click事件代碼

SKIP1&&記錄指針下移一條記錄

IFEOF()&&判斷指針是否已從表尾溢出

GOBOTTOM&&若是,則定位到最后一條記錄

ENDIF THIS.REFRESHFORM&&刷新表單或工具欄

ENDPROC&&Click事件代碼定義結(jié)束ENDDEFINE

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論