




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2024/8/151
VFP6程序設(shè)計(jì)基礎(chǔ)
2024/8/1525.1VFP6程序設(shè)計(jì)概念5.1.1VFP6程序設(shè)計(jì)基本概念
5.1.2VFP6程序設(shè)計(jì)基本操作
5.1.3VFP程序設(shè)計(jì)編程方式
返回退出2024/8/1535.1.1VFP6程序設(shè)計(jì)基本概念
VFP6支持過程化程序設(shè)計(jì)和面向?qū)ο蟪绦蛟O(shè)計(jì)兩種程序設(shè)計(jì)與開發(fā)的類型。下面是一個(gè)完整的VFP過程化程序,可以引出幾個(gè)基本概念。*功能說明:求圓形的面積。*文件名:L501.PRGCLEARCTALK=SET("TALK")SETTALKOFFINPUT"請(qǐng)輸入圓的半徑,半徑="TORS=PI()*R*R?"半徑為"+ALLTRIM(STR(R))+"的圓,面積=",SSETTALK&CTALKRETURN2024/8/1541、從形式上看,VFP的程序是由若干有序的命令行組成,且滿足下列規(guī)則:(1)一個(gè)命令行內(nèi)只能寫一條命令,命令行的長(zhǎng)度不得超過2048個(gè)字符,命令行以回車鍵結(jié)束。(2)、一個(gè)命令行可以由若干個(gè)物理行組成,即一條命令在一個(gè)物理行內(nèi)寫不下時(shí),可以分成幾行。換行的方法有兩種:一種是在物理行的末尾加符號(hào)“;”,表示下一行輸入的內(nèi)容是本行的繼續(xù);另一種是系統(tǒng)自動(dòng)換行,即輸入程序時(shí),只管逐條命令輸入,無(wú)需考慮本條語(yǔ)句是否超過屏幕行寬的最大限度,當(dāng)輸入的語(yǔ)句超過屏幕的最大行寬時(shí),系統(tǒng)自動(dòng)換行。輸入時(shí)只需在一行結(jié)束時(shí)按回車鍵,通知系統(tǒng)本命令行輸入完畢。(3)為便于閱讀,可以按一定的格式輸入程序,即一般程序結(jié)構(gòu)左對(duì)齊,而控制結(jié)構(gòu)內(nèi)的語(yǔ)句序列比控制結(jié)構(gòu)的語(yǔ)句縮進(jìn)若干格。2、從功能上看,程序可以分為三個(gè)部分:第一部分是程序的說明部分,在本例程序中是前面的四行,一2024/8/155般用于說明程序的功能、文件名等需要說明的有關(guān)信息。第二部分是進(jìn)行數(shù)據(jù)處理的部分,在本例程序中是從第五行開始的三行。通常任何一個(gè)有意義的程序,總是要有一些原始數(shù)據(jù),否則,這個(gè)程序就沒有處理對(duì)象。同樣,程序運(yùn)行的結(jié)果也有必要顯示或打印出來,否則,用戶將不知道程序干了一些什么。因此,第二部分程序常包括下列三個(gè)部分,依次為:提供原始數(shù)據(jù)部分、數(shù)據(jù)處理部分、輸出結(jié)果部分。第三部分是程序的控制返回部分,在本例中就是最后二條命令。它控制程序返回到調(diào)用該程序的調(diào)用處。過程化程序設(shè)計(jì)與面向?qū)ο蟪绦蛟O(shè)計(jì)
過程化程序設(shè)計(jì):它是采用結(jié)構(gòu)化編程語(yǔ)句來編寫的程序。這類方法的特點(diǎn)是容易把一個(gè)復(fù)雜的程序分解為若干個(gè)較小的過程,每個(gè)過程都可進(jìn)行獨(dú)立的調(diào)試。這類設(shè)計(jì)方法發(fā)展的總思想是從程序員角度考慮使程序設(shè)計(jì)更簡(jiǎn)單,而較少?gòu)氖褂媒嵌热タ紤]。使用這類方法設(shè)計(jì)的程序流程完全由程序員控制,使用者只能做由程序員預(yù)先安排好的事情。2024/8/156
面向?qū)ο蟪绦蛟O(shè)計(jì):這類程序設(shè)計(jì)思想是面向?qū)ο?,即設(shè)計(jì)的重要任務(wù)在于描述對(duì)象。程序是由事件驅(qū)動(dòng)的,因而,在執(zhí)行過程中,持續(xù)等待的是一個(gè)發(fā)生在對(duì)象上的事件。而發(fā)生什么事件則要看使用者的操作,如單擊、雙擊鼠標(biāo)等。至于下一步的程序流向,則要看驅(qū)動(dòng)的是什么事件。這類程序設(shè)計(jì)的主要目的是從任何方便與簡(jiǎn)化使用入手,由使用者控制程序流向,這在一定程序上增加了編程的難度。5.1.2VFP6程序設(shè)計(jì)基本操作
1、過程化程序設(shè)計(jì)基本操作(1)建立過程文件。在VFP中,一個(gè)過程文件就是一個(gè)ASCII文本文件,因而可用各類編輯工具來建立。在VFP中有下面二種簡(jiǎn)易方法來建立:■在【文件】菜單下的【新建】菜單項(xiàng)中,選擇“程序”可選項(xiàng)?!鲈诿畲翱谥惺褂肕ODIFYCOMMAND命令。返回2024/8/157格式:MODIFYCOMMAND[<文件名>/?]
功能:打開文本編輯窗口,編寫程序代碼。參數(shù)描述:[<文件名>]:為可選項(xiàng),指定打開或創(chuàng)建的程序文件名。若不指定新建程序文件的擴(kuò)展名,VFP自動(dòng)指定.PRG為擴(kuò)展名。MODIFYCOMMAND命令支持含有“*”和“?”通配符的文件梗概。名稱與這個(gè)梗概匹配的每一個(gè)文件都在編輯窗口中打開。若省略文件名,將給打開的編輯窗口賦一個(gè)初始名稱“程序1.PRG”。當(dāng)關(guān)閉編輯窗口時(shí),可以用另外的文件名保存該文件。[?]:顯示“打開”對(duì)話框??梢詮闹羞x擇一個(gè)已有程序或輸入要?jiǎng)?chuàng)建的新程序名。說明:修改程序文件之后,更新過的文件將寫到磁盤上。除非在配置文件中用TEDIT指定一個(gè)外部編輯器,否則,一般使用VFP的內(nèi)置編輯器。2024/8/158【例5-2】用戶通過VFP6的命令窗口建立上例程序文件。在VFP6的命令窗口中輸入下條命令后按回車鍵。MODIFYCOMMANDL501打開程序編輯窗口在程序編輯窗口中輸入程序代碼用Ctrl+W存盤退出編輯窗口,或單擊程序編輯窗口上的【關(guān)閉】按鈕,在彈出的對(duì)話窗口中確定存盤,生成L501.prg文件。2024/8/159(2)運(yùn)行程序下面的任一方法均可運(yùn)行程序:■選擇【程序】菜單下的“運(yùn)行”菜單,利用“運(yùn)行”對(duì)話框選擇要運(yùn)行的程序;■在命令窗口中輸入如下命令:DO<程序文件名>
系統(tǒng)就會(huì)運(yùn)行這個(gè)程序。如果文件不加擴(kuò)展名,系統(tǒng)會(huì)假定它具有.PRG的擴(kuò)展名,如果想運(yùn)行一個(gè)具有其它擴(kuò)展名的命令文件時(shí),在輸入命令時(shí)必須給出這個(gè)命令文件的全名。如:要運(yùn)行上例中編輯的程序,可以在命令窗口中輸入:
DOL501然后按回車鍵執(zhí)行。2024/8/15102、事件驅(qū)動(dòng)程序設(shè)計(jì)基本操作VFP6提供了真正的無(wú)模式操作,使用戶不僅能夠輕松地進(jìn)行多個(gè)表單的自動(dòng)協(xié)調(diào),而且可以很容易地同時(shí)運(yùn)行一個(gè)表單的多個(gè)實(shí)例。VFP6還提供了事件處理機(jī)制,可以給用戶提供一個(gè)更為豐富的交互環(huán)境。事件驅(qū)動(dòng)程序設(shè)計(jì)基本操作,關(guān)鍵是確定事件以及對(duì)事件發(fā)生時(shí)應(yīng)作出的反應(yīng)。一個(gè)事件發(fā)生時(shí),VFP6系統(tǒng)應(yīng)作出的反應(yīng),仍可通過一個(gè)過程來實(shí)現(xiàn),即用過程化程序設(shè)計(jì)的方法來處理某一事件發(fā)生時(shí)系統(tǒng)應(yīng)作出的響應(yīng)。通常,VFP6程序設(shè)計(jì)時(shí)應(yīng)考慮的事件有:(1)核心事件表5-1是VFP6中核心事件列表,這些事件適用于大多數(shù)的控件。(2)容器事件和對(duì)象事件。為控件編寫事件代碼時(shí),請(qǐng)注意以下兩條規(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)等)與對(duì)象交互時(shí),對(duì)象事件被觸發(fā)。每個(gè)對(duì)象獨(dú)立接受自己的事件。例如,在圖5-2中,盡管命令按鈕位于表單上,當(dāng)用戶單擊命令按鈕時(shí),不會(huì)觸發(fā)表單的Click事件,只觸發(fā)命令按鈕的Click事件。若沒有與命令按鈕相關(guān)聯(lián)的Click事件代碼,盡管有與表單相關(guān)聯(lián)的Click事件代碼,當(dāng)用戶單擊按鈕時(shí),也不會(huì)執(zhí)行與表單相關(guān)聯(lián)的Click事件代碼。圖5-2容器、控件事件代碼相對(duì)獨(dú)立
這些規(guī)則也適用于表格控件。表格事件包含列,列又包含標(biāo)頭和控件。事件發(fā)生時(shí),只有與事件相關(guān)聯(lián)的最底層對(duì)象識(shí)別該事件,更高層的容器不識(shí)別這個(gè)事件。圖5-3演示了當(dāng)用戶在表格上移動(dòng)鼠標(biāo)時(shí),哪個(gè)對(duì)象處理這個(gè)MouseMove事件。2024/8/1513圖5-3表格的MouseMove事件
例如:在一個(gè)命令按鈕上,按下鼠標(biāo)左鍵并拖動(dòng)鼠標(biāo)指針離開命令按鈕,盡管鼠標(biāo)指針可能已經(jīng)在表單上,但這個(gè)命令按鈕的MouseMove事件還在不斷產(chǎn)生。當(dāng)在表單上而不是在命令按鈕上釋放鼠標(biāo)時(shí),發(fā)生的MouseUp事件是與命令按鈕相關(guān)聯(lián)的,而不是與表單的MouseUp事件相關(guān)聯(lián)。2024/8/1514(3)VFP6中類和控件事件若表單上的控件基于一個(gè)用戶自定義的類,當(dāng)一個(gè)事件發(fā)生時(shí),VFP首先在該控件中查看是否有與此事件相關(guān)聯(lián)的代碼,若找到,則執(zhí)行它;否則,VFP將在類層次中向上一層檢查。無(wú)論VFP在類層次的哪個(gè)地方找到該事件的代碼,都執(zhí)行它,如圖5-4所示。圖5-4若沒有與對(duì)象相關(guān)聯(lián)的事件代碼,則VFP將檢查父類
返回2024/8/15155.1.3VFP程序設(shè)計(jì)編程方式
VFP程序由代碼組成,代碼包括以命令形式出現(xiàn)的指令、函數(shù)和VFP可以理解的任何操作。這些指令包含在“命令”窗口、程序文件、表單設(shè)計(jì)器與類設(shè)計(jì)器的事件或方法程序代碼窗口、菜單設(shè)計(jì)器的過程代碼窗口、報(bào)表設(shè)計(jì)器的過程代碼窗口中。使用“命令”窗口可以在“命令”窗口中鍵入VFP命令并按Enter鍵執(zhí)行。若要重新執(zhí)行該命令,還可以將光標(biāo)移到此命令所在行并按Enter鍵。甚至可以在“命令”窗口中像獨(dú)立程序一樣執(zhí)行多行代碼。要在“命令”窗口中運(yùn)行多行代碼,可以按下述方法執(zhí)行:(1)選取代碼行。(2)按Enter鍵或右擊并在快捷菜單中選擇“運(yùn)行所選區(qū)域”。因?yàn)椤懊睢贝翱谑且粋€(gè)編輯窗口,所以在編輯命令時(shí)可以使用VFP提供的編輯工具。在“命令”窗口中可以修改、插入、刪除、剪切、復(fù)制和粘貼正文。2024/8/1516在“命令”窗口中執(zhí)行命令的優(yōu)點(diǎn)是:能夠立即執(zhí)行被鍵入的命令,不需要將其保存為文件并用程序方式執(zhí)行。此外,在菜單或?qū)υ捒蛑兴鞯倪x擇可以馬上轉(zhuǎn)換成“命令”窗口中的命令。用戶可以將這些命令復(fù)制并粘貼到VFP程序中,然后重復(fù)執(zhí)行這些程序。這樣做可以很容易地重復(fù)執(zhí)行成百上千條的命令。2、創(chuàng)建程序VFP程序是包含一系列命令的文本文件。在VFP中可以通過下述途徑創(chuàng)建程序:(1)在項(xiàng)目管理器中,選定“代碼”選項(xiàng)卡中的“程序”項(xiàng);(2)選擇“新建”命令?;蛘撸海?)在【文件】菜單中選擇【新建】命令;(2)在“新建”對(duì)話框中選擇“程序”;(3)單擊【新建文件】按鈕?;蛘咴凇懊睢贝翱谥墟I入:MODIFYCOMMAND2024/8/15173、保存程序創(chuàng)建程序后,一定要注意保存程序。若要保存程序,可以從【文件】菜單中選擇【保存】命令?;蛘甙碈trl+W組合鍵保存,若不想保存對(duì)新建程序或已有程序所做的修改,也可以使用Ctrl+Q組合鍵,不存盤而退出編輯窗口。若要關(guān)閉一個(gè)沒有保存的程序,則會(huì)彈出相應(yīng)對(duì)話框,提示用戶是否保存已作的修改。若保存了一個(gè)由項(xiàng)目管理器創(chuàng)建的程序,則該程序被加入到項(xiàng)目中。若保存一個(gè)尚未命名的程序,則會(huì)打開“另存為…”對(duì)話框,提示用戶可以在其中為程序指定程序名。程序保存后,可以運(yùn)行或修改它。4、修改程序程序保存后可以修改。首先,按以下四種方法之一打開想要修改的程序文件:■若程序包含在一個(gè)項(xiàng)目中,則在項(xiàng)目管理器中選定它并選擇2024/8/1518修改命令。
■在【文件】菜單中選擇【打開】命令,這時(shí)彈出一個(gè)包含文件列表的對(duì)話框,在“文件類型”列表框中選擇“程序”,然后在文件列表中選定要修改的程序,單擊【確定】按鈕。
■在“命令”窗口中按如下方式鍵入要修改的程序名:MODIFYCOMMAND<程序文件名>
■在“命令”窗口中輸入:MODIFYCOMMAND?
然后從文件列表中選擇要修改的程序,單擊【打開】按鈕。打開文件之后便可進(jìn)行修改,修改完成后就可以保存。5、運(yùn)行程序程序創(chuàng)建之后便可以運(yùn)行。若要運(yùn)行程序,有以下三種方法:■若程序包含在一個(gè)項(xiàng)目中,則可在項(xiàng)目管理器中選定它,并選擇【運(yùn)行】命令。2024/8/1519■在【程序】菜單中選擇【運(yùn)行】菜單項(xiàng),然后在程序列表中,選擇想要運(yùn)行的程序,并單擊【運(yùn)行】按鈕?!鲈凇懊睢贝翱谥?,按如下方式鍵入DO以及要運(yùn)行的程序文件名:DO<程序文件名>
6、使用VFP設(shè)計(jì)工具編寫代碼借助表單設(shè)計(jì)器、類設(shè)計(jì)器和菜單設(shè)計(jì)器,用戶可以很容易地把程序代碼與用戶界面連接起來,這樣應(yīng)用程序便可響應(yīng)用戶的輸入并執(zhí)行相應(yīng)的代碼。同樣,報(bào)表設(shè)計(jì)器將程序代碼與報(bào)表文件聯(lián)系起來,以定制結(jié)構(gòu)復(fù)雜并且符合用戶要求的報(bào)表。如果想充分發(fā)揮VFP的強(qiáng)大功能,應(yīng)充分使用剛才提到的設(shè)計(jì)工具。
返回2024/8/15205.2VFP6的程序設(shè)計(jì)語(yǔ)言基礎(chǔ)5.2.1VFP的交互式輸入輸出命令5.2.2VFP6程序設(shè)計(jì)的條件與循環(huán)返回退出2024/8/15215.2.1VFP的交互式輸入輸出命令
設(shè)計(jì)程序,就是用一系列命令存儲(chǔ)數(shù)據(jù)并操作這些數(shù)據(jù)。程序設(shè)計(jì)的原材料是數(shù)據(jù)和數(shù)據(jù)的存儲(chǔ)容器,而處理這些原材料的工具是命令、函數(shù)的操作符。1、交互式輸入命令(1)字符接收語(yǔ)句
格式: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)存變量名>]:指定存儲(chǔ)字符數(shù)據(jù)的內(nèi)存變量或數(shù)組元素。如果沒有定義此內(nèi)存變量,ACCEPT將自動(dòng)創(chuàng)建。如果沒有輸入數(shù)據(jù)就按Enter鍵,內(nèi)存變量或數(shù)組元素則為空字符串。說明:在VFP中可用表單設(shè)計(jì)器或DEFINECLASS來創(chuàng)建文本框控制。ACCEPT命令允許直接向內(nèi)存變量或數(shù)組元素輸入字符數(shù)據(jù),輸入時(shí)不需要用引號(hào)將字符括起來。執(zhí)行此語(yǔ)句時(shí),先在屏幕上顯示<提示信息>,光標(biāo)緊隨其后,然后暫停程序運(yùn)行,等待用戶從鍵盤上輸入信息。輸入的信息可以是任何可顯示的ASCII碼字符串,并以回車鍵結(jié)束。系統(tǒng)將此字符串信息存入指定的內(nèi)存變量中,然后,繼續(xù)運(yùn)行暫停的程序?!纠?-3】試編程完成下述功能:從鍵盤隨機(jī)輸入某個(gè)表的文件名,要求打開并顯示此表的內(nèi)容。在命令窗口輸入下列命令:MODIFYCOMMANDL503(文件名中的擴(kuò)展名.PRG可省略,以后不再說明)2024/8/1523
屏幕顯示編輯窗口。在編輯窗口輸入如下程序代碼后用Ctrl+W存盤,返回命令窗口。CLEARSETTALKOFFACCEPT"請(qǐng)輸入表文件名"TOFileNameUSE(FileName)LISTUSERETURN
說明:程序中第四句使用了宏代換函數(shù),這是由于FileName本身不是文件名,而其內(nèi)容才是文件名。(2)通用數(shù)據(jù)接收命令
ACCEPT語(yǔ)句只能給字符型內(nèi)存變量提供數(shù)據(jù)。如果用戶想給其它類型的內(nèi)存變量提供數(shù)據(jù),可以使用下列命令:格式:INPUT[<提示信息>]TO<內(nèi)存變量名>2024/8/1524功能:用于接收從鍵盤上輸入的表達(dá)式,并將計(jì)算結(jié)果存入指定的內(nèi)存變量或數(shù)組元素中。包含此命令也是為了提供向后的兼容性。在VFP中,該命令也可以用文本框控制代替。參數(shù)描述:[<提示信息>]:提示信息,提示用戶輸入數(shù)據(jù)。[<內(nèi)存變量名>]:指定一個(gè)內(nèi)存變量或數(shù)組元素,存儲(chǔ)從鍵盤輸入的數(shù)據(jù)。如果指定的內(nèi)存變量或數(shù)組元素不存在,VFP將自動(dòng)創(chuàng)建該內(nèi)存變量或數(shù)組。說明:INPUT語(yǔ)句與ACCEPT語(yǔ)句的執(zhí)行過程相同,功能相似。<內(nèi)存變量名>的數(shù)據(jù)類型取決于輸入數(shù)據(jù)的類型??梢詾閿?shù)字型、字符型、日期型和邏輯型。
INPUT語(yǔ)句與ACCEPT語(yǔ)句的區(qū)別是:ACCEPT命令只能接收字符串,而INPUT語(yǔ)句可以接收任意類型的VFP表達(dá)式;如果輸入的是字符串,ACCEPT語(yǔ)句不要使用字符型定界符,而INPUT語(yǔ)句必須用定界符括起來。2024/8/1525【例5-4】試編程完成下列功能。從鍵盤上隨機(jī)輸入一個(gè)正數(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)輸入一個(gè)字符語(yǔ)句格式:WAIT[<提示信息>][TO<內(nèi)存變量名>]功能:暫停正在運(yùn)行的程序,直到輸入一個(gè)字符為止。此語(yǔ)句與ACCEPT語(yǔ)句的功能部分相似。若選擇TO<內(nèi)存變量名>子句,則將輸入的單個(gè)字符存入指定的內(nèi)存變量。若直接輸入回車鍵,則內(nèi)存變量中存入空字符串。內(nèi)存變量的類型為字符型。若選擇<提示信息>子句,執(zhí)行此命令時(shí),屏幕上將顯示提示信息,否則,屏幕上將顯示“按任意鍵繼續(xù)…”WAIT語(yǔ)句主要用于下列兩種情況?!鰰和3绦虻倪\(yùn)行,以便觀察程序的運(yùn)行情況,檢查程序運(yùn)行的中間結(jié)果。
■根據(jù)實(shí)際情況輸入某個(gè)字符,以控制程序的執(zhí)行流程。比如,在某應(yīng)用程序的“Y/N”選擇中,常用此命令暫停程序的執(zhí)行,等待用戶回答“Y”或“N”,由于這時(shí)只需輸入單個(gè)字符,也不用按回車鍵,操作簡(jiǎn)便,響應(yīng)迅速。2024/8/15272、格式化輸出命令前面的章節(jié)中在屏幕上顯示信息時(shí),使用的是非格式化輸出命令:“?”或“??”,為了能按一定的要求來設(shè)計(jì)屏幕格式,使之美觀、方便,下面介紹一個(gè)屏幕顯示格式控制命令。格式:@<行號(hào),列號(hào)>SAY<表達(dá)式>
功能:從指定的行、列號(hào)開始輸出表達(dá)式的值。說明:①<表達(dá)式>可以是常數(shù)、字段變量及由它們組成的表達(dá)式。②定位輸出時(shí),一次只能輸出一個(gè)表達(dá)式。3、程序設(shè)計(jì)輔助命令(1)、中止程序運(yùn)行■在程序運(yùn)行過程中,按Esc鍵可以中止程序的運(yùn)行,系統(tǒng)會(huì)顯示警告對(duì)話框讓用戶選擇:【取消】中止程序運(yùn)行,這是缺省選擇;【掛起】暫停程序運(yùn)行,返回命令窗口。當(dāng)選擇【程序】菜單下的【繼續(xù)執(zhí)行】選項(xiàng)或在命令窗口中輸入“Resume”命令,系統(tǒng)2024/8/1528則從中止的地方繼續(xù)程序的執(zhí)行;【忽略】忽略所給的Esc,繼續(xù)程序的執(zhí)行。通常在程序的開始時(shí)加有命令:SETESCAPEOFF執(zhí)行該命令后,Esc鍵處于關(guān)閉狀態(tài),在程序運(yùn)行過程中,用戶不能通過Esc鍵來中止程序的運(yùn)行,因?yàn)樵趹?yīng)用程序中,不希望中止它;而在程序調(diào)試階段,通常不關(guān)閉這個(gè)鍵,讓程序在運(yùn)行過程中,隨時(shí)都可以中斷執(zhí)行,以檢查程序中間的運(yùn)行狀況。格式一:CANCEL
功能:結(jié)束程序的運(yùn)行,返回命令窗口,同時(shí)關(guān)閉所有打開的文件。格式二:SUSPEND
功能:暫時(shí)中止程序運(yùn)行,返回命令窗口。當(dāng)在菜單中選擇【程序】|【繼續(xù)執(zhí)行】時(shí),或在命令窗口中輸入RESUME命令時(shí),系統(tǒng)再次從中止的地方繼續(xù)執(zhí)行程序。2024/8/1529(2)、注釋命令
格式一:NOTE/*<注釋字符串>格式二:&&<注釋字符串>
說明:上述命令不作任何操作,只是注釋標(biāo)記,用于說明程序或命令的功能等。注釋內(nèi)容不需要用定界符定界,執(zhí)行時(shí)也不顯示。注釋信息如果在一行內(nèi)沒有寫完,換行時(shí)也必須再寫注釋命令。NOTE或*是用于整行注釋的,因此,它必須寫在每一個(gè)注釋行的開頭;而&&命令是用于注釋一行的部分內(nèi)容的,因此,它可以寫在行中(命令的尾部、注釋信息的頭部),這是程序中唯一可以在一個(gè)邏輯行寫二個(gè)語(yǔ)句的命令。
USESTUDENT&&打開STUDENT表(3)文本顯示命令
格式:TEXT <文本字符串>
ENDTEXT功能:將<文本字符串>原樣輸出。這條命令通常是用于程序中對(duì)用戶說明某些問題。返回2024/8/15305.2.2VFP6程序設(shè)計(jì)的條件與循環(huán)
VFP的程序結(jié)構(gòu)可以分為三種:順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)。下面將以一個(gè)程序演示條件分支結(jié)構(gòu)的循環(huán)結(jié)構(gòu),并對(duì)這些概念詳細(xì)說明?!纠?-5】假設(shè)某單位有很多員工,并且要給月工資高于或等于1000元的員工增加5%的工資,給月工資低于1000元的員工增加10%的工資。下面的示例程序?qū)⑼瓿蛇@一任務(wù)。此示例程序假定已在當(dāng)前工作區(qū)打開了員工工資表,表中有一個(gè)名為“月工資”的數(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、條件語(yǔ)句條件分支根據(jù)條件的計(jì)算結(jié)果執(zhí)行不同的操作。條件分支結(jié)構(gòu)邏輯流程圖:入口條件判斷真假語(yǔ)句序列1出口語(yǔ)句序列2VFP中有兩條命令實(shí)現(xiàn)條件分支:格式:IF<條件表達(dá)式> <語(yǔ)句序列1> [ELSE <語(yǔ)句序列2>] ENDIF單條件選擇命令2024/8/1532參數(shù)描述:<條件表達(dá)式>:指定要計(jì)算的邏輯表達(dá)式。如果<條件表達(dá)式>的值為“真”,則執(zhí)行IF語(yǔ)句之后的<語(yǔ)句序列1>;如果<條件表達(dá)式>的值為“假”,而且包含ELSE語(yǔ)句和<語(yǔ)句序列2>,則執(zhí)行<語(yǔ)句序列2>;如果<條件表達(dá)式>的值為“假”,而且不包含ELSE語(yǔ)句和<語(yǔ)句序列2>,則程序忽略IF語(yǔ)句和ENDIF語(yǔ)句之間的所有語(yǔ)句,程序從ENDIF語(yǔ)句后的第一條命令開始繼續(xù)往下執(zhí)行其它程序。
說明:一個(gè)IF…ENDIF語(yǔ)句塊中可以嵌套另一個(gè)IF…ENDIF語(yǔ)句塊。從【例5-5】所示的程序中可以看到:當(dāng)當(dāng)前記錄中“月工資”字段的值大于等于1000元時(shí),將使“月工資>=1000”這個(gè)條件表達(dá)式的值為“真”,此時(shí),程序控制執(zhí)行<語(yǔ)句序列1>“REPLACE月工資WITH月工資*1.05”,即將月工資高于或等于1000元的工資上調(diào)5%。否則,即當(dāng)當(dāng)前記錄中“月工資”字段的值低于10002024/8/1533元時(shí),將使“月工資>=1000”這個(gè)條件表達(dá)式的值為“假”,此時(shí),程序控制執(zhí)行<語(yǔ)句序列2>“REPLACE月工資WITH月工資*1.1”,即將月工資低于1000元的工資上調(diào)10%。(2)多條件選擇語(yǔ)句格式:DOCASECASE<條件表達(dá)式1> <語(yǔ)句序列1>[CASE<條件表達(dá)式2> <語(yǔ)句序列2> …CASE<條件表達(dá)式N> <語(yǔ)句序列N>][OTHERWISE <語(yǔ)句序列N+1>]ENDCASE
參數(shù)描述:
CASE<條件表達(dá)式1><語(yǔ)句序列1>…:VFP在執(zhí)行這條多條件選擇命令時(shí),按命令行中寫出的條件表達(dá)式的順序逐條檢查<條件表達(dá)式>,當(dāng)遇到第一個(gè)結(jié)果為“真”的<條件表達(dá)式>時(shí),就執(zhí)行它后面的語(yǔ)句序列。語(yǔ)句序列中的命令逐條被執(zhí)行,直到遇到下一個(gè)CASE或OTHER-WISE或ENDCASE,然后,2024/8/1534再?gòu)腅NDCASE語(yǔ)句后的第一條命令開始繼續(xù)執(zhí)行其它命令。如果一個(gè)CASE<條件表達(dá)式>的<條件表達(dá)式>為“假”,就忽略它后面的語(yǔ)句序列?!纠?-6】運(yùn)行一個(gè)程序,隨機(jī)輸出一條信息:CLEARAA=INT(RAND()*10)&&隨機(jī)產(chǎn)生一個(gè)10以內(nèi)的整數(shù)DOCASE CASEAA=0 ?“這次產(chǎn)生的隨機(jī)數(shù)是:0”
CASEAA=1 ?“這次產(chǎn)生的隨機(jī)數(shù)是:1”
CASEAA=2 ?“這次產(chǎn)生的隨機(jī)數(shù)是:2”
CASEAA=3 ?“這次產(chǎn)生的隨機(jī)數(shù)是:3”
OTHERWISE ?“這次產(chǎn)生的隨機(jī)數(shù)是:大于3!”
ENDCASE2024/8/15352、循環(huán)語(yǔ)句程序設(shè)計(jì)中的循環(huán),是指在程序中從某處開始,有規(guī)律地反復(fù)執(zhí)行某一個(gè)程序塊的現(xiàn)象。VFP的循環(huán)命令有三類:基于條件的循環(huán)、基于計(jì)數(shù)的循環(huán)和基于表的循環(huán)。(1)基于條件的循環(huán):DOWHILE命令格式:DOWHILE<條件表達(dá)式> [<語(yǔ)句序列>] [EXIT] [LOOP] ENDDO參數(shù)描述:<條件表達(dá)式>:指定一個(gè)邏輯表達(dá)式,它的值決定是否執(zhí)行DOWHILE和ENDDO之間的命令集合。如果<條件表達(dá)式>的值為“真”,就執(zhí)行命令集。[<語(yǔ)句序列>]:指定當(dāng)<條件表達(dá)式>計(jì)算為“真”時(shí)要執(zhí)行的2024/8/1536[LOOP]:直接將程序控制返回到DOWHILE語(yǔ)句,并重新計(jì)算條件值。LOOP可以放在DOWHILE和ENDDO之間的任何位置。[EXIT]:將程序控制從DOWHILE和ENDDO循環(huán)的內(nèi)部轉(zhuǎn)到ENDDO后的第一條命令。EXIT可以放在DOWHILE和ENDDO之間的任何位置。ENDDO:表明DOWHILE語(yǔ)句的結(jié)束?!纠?-7】計(jì)算連續(xù)自然數(shù)之和,并且顯示和剛大于1000的最后一個(gè)自然數(shù)。STORE0TOAA,BBDOWHILEAA<=1000 BB=BB+1 AA=AA+BBENDDO?BB結(jié)果顯示為45。VFP命令集。2024/8/1537【例5-8】求連續(xù)N個(gè)不是7的倍數(shù)的自然數(shù)之和,當(dāng)和是101的倍數(shù)時(shí)顯示最后的自然數(shù)和它們的和。STORE0TOAA,BB&&定義二個(gè)變量,用以保存累加值和累加數(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)基于計(jì)數(shù)的循環(huán):FOR命令
格式:FOR<內(nèi)存變量>=<初始值>TO<終值>[STEP<步長(zhǎng)>] <語(yǔ)句序列> [EXIT] [LOOP] ENDFOR/NEXT
參數(shù)描述:<內(nèi)存變量>:指定作為計(jì)數(shù)器的內(nèi)存變量或數(shù)組元素。在執(zhí)行FOR…ENDFOR語(yǔ)句之前,此內(nèi)存變量或數(shù)組元素不一定存在。<初始值>TO<終值>:<初始值>是計(jì)數(shù)器的初始值,而<終值>是計(jì)數(shù)器的終止值。[STEP<步長(zhǎng)>]:是計(jì)數(shù)器遞增或遞減的步長(zhǎng)。如果<步長(zhǎng)>是負(fù)值,則計(jì)數(shù)器遞減;如果省略STEP子句,計(jì)數(shù)器每次遞增1。<語(yǔ)句序列>:指定要執(zhí)行的VFP命令,它可以包含任意數(shù)量的命令。2024/8/1539[EXIT]:將控制權(quán)交給緊接在ENDFOR后面的命令。可以在FOR與ENDFOR之間的任何地方放置EXIT。[LOOP]:將控制權(quán)直接交給FOR子句,不再執(zhí)行LOOP與ENDFOR之間的語(yǔ)句。計(jì)數(shù)器正常遞增或遞減,就像執(zhí)行到ENDFOR子句一樣??梢栽贔OR與ENDFOR之間的任何地方放置LOOP。說明:可以用內(nèi)存變量或數(shù)組元素作為計(jì)數(shù)器,指定FOR…ENDFOR循環(huán)中VFP命令的執(zhí)行次數(shù)。在遇到ENDFOR或NEXT之前,始終執(zhí)行FOR后面的VFP命令。執(zhí)行過程中,每循環(huán)一次,計(jì)數(shù)器都會(huì)產(chǎn)生一次計(jì)數(shù),計(jì)數(shù)增量由<步長(zhǎng)>值控制,然后把計(jì)數(shù)器的值與<終值>進(jìn)行比較,決定是否進(jìn)行下一次循環(huán)?!纠?-9】求1到100中偶數(shù)的和AA=0FORII=2TO100STEP2 AA=AA+IIENDFOR?AA屏幕顯示為:25502024/8/1540(3)基于表的循環(huán)命令
格式:SCAN[<范圍>][FOR<條件>][WHILE<條件>] [<語(yǔ)句序列>] [LOOP] [EXIT] ENDSCAN參數(shù)描述:[<范圍>]:指定對(duì)當(dāng)前表中記錄掃描的范圍。只有在范圍之內(nèi)的記錄才有可能掃描到。SCAN命令的默認(rèn)范圍為ALL。[FOR<條件>]:只有條件表達(dá)式的計(jì)算結(jié)果為“真”的記錄,才能對(duì)其執(zhí)行命令。包含F(xiàn)OR子句可以篩選出不想掃描的記錄。[WHILE<條件>]:指定一個(gè)邏輯表達(dá)式作為執(zhí)行命令的條件,只要邏輯表達(dá)式計(jì)算為“真”,就對(duì)記錄執(zhí)行命令,直到遇到使表達(dá)式不為“真”的記錄為止。[<語(yǔ)句序列>]:指定要執(zhí)行的VFP命令集。2024/8/1541[LOOP]:把控制權(quán)直接交給SCAN子句。LOOP子句可以放在SCAN和ENDSCAN之間的任何地方。[EXIT]:把控制權(quán)力從SCAN…ENDSCAN循環(huán)語(yǔ)句交給ENDSCAN下面的命令。EXIT子句可以放在SCAN和ENDSCAN之間的任何地方。ENDSCAN:標(biāo)志SCAN過程的結(jié)束。說明:SCAN命令自動(dòng)將記錄指針移到下一條滿足條件的記錄,并執(zhí)行相應(yīng)的命令塊?!纠?-10】逐條顯示STUDENT表中男生的情況。USESTUDENTSCANFOR性別=”男”
DISP WAITENDSCANUSE或者使用下列代碼:
USESTUDENTSCAN IF性別#”男”
LOOP ENDIFDISP WAITENDSCANUSE2024/8/15423、使用過程和自定義函數(shù)
(1)子程序和過程的調(diào)用子程序或過程的編寫和修改方式與一般的程序一樣,不同的是過程的最后一個(gè)語(yǔ)句必須是返回語(yǔ)句(RETURN),調(diào)用過程的程序是主程序,過程可以嵌套,即一個(gè)子程序可以再調(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為擴(kuò)展名的外部過程;若還未找到,最后檢索以.PRG擴(kuò)展名的外部過程,并把它編譯為.FXP文件。在執(zhí)行一個(gè)可執(zhí)行文件或應(yīng)用程序中,多個(gè)過程可以有相同的過程名。當(dāng)使用DO去啟動(dòng)一個(gè)可執(zhí)行文件或一個(gè)應(yīng)用程序的過程時(shí),VFP只在可執(zhí)行文件或應(yīng)用程序的主程序中搜索指定的過程。IN<程序文件名>:執(zhí)行<程序文件名>指定的程序文件中的一個(gè)過程。當(dāng)找到該文件時(shí)就執(zhí)行該過程。如果找不到該程序文件,就會(huì)顯示“文件不存在”的信息。如果找到了程序文件,但指定的過程不存在,就會(huì)顯示“找不到過程”的信息。[WITH<參數(shù)表>]:指定要傳遞給程序或過程的參數(shù)。列在<參數(shù)表>中的可以是表達(dá)式、內(nèi)存變量、字母和數(shù)字、字段或用戶自定義函數(shù)。默認(rèn)情況下,參數(shù)按引用傳遞給程序和過程,也可以將參數(shù)放在括號(hào)中按值傳遞。傳遞給程序或過程的參數(shù)的最大數(shù)目為27。2024/8/1544(2)子程序或過程的返回語(yǔ)句
格式:RETURN[<表達(dá)式>/TOMASTER/TO<過程名>]
功能:將程序控制權(quán)返回給調(diào)用程序。參數(shù)描述:
[<表達(dá)式>]:指定返回給調(diào)用程序的表達(dá)式。如果省略RETURN命令或省略返回表達(dá)式,則自動(dòng)將“真”返回給調(diào)用程序。[TOMASTER]:將控制權(quán)返回給最高層的調(diào)用程序。[TO<過程名>]:將控制權(quán)返回給指定的過程。說明:RETURN終止程序、過程或函數(shù)的運(yùn)行,并將控制權(quán)返回給調(diào)用程序、最高次調(diào)用程序、另一個(gè)程序或窗口。當(dāng)執(zhí)行RETURN命令時(shí),VFP釋放PRIVATE(專用)類型的內(nèi)存變量。通常,RETURN放在程序、過程或函數(shù)的末尾,用來將控制返回給高層的程序。但是,如果省略RETURN命令,一個(gè)隱含的RETURN命令也將被執(zhí)行。2024/8/1545子程序或過程調(diào)用及返回示意圖
【例5-11】計(jì)算圓面積的主程序?yàn)镸YMAIN.PRG,子程序?yàn)镸YSUB.PRG*MYMAIN.PRGCTALK=SET("TALK")SETTALKOFFCLEARSTORE0TORR,AREA2024/8/1546DOWHILE.T.INPUT"請(qǐng)輸入圓的半徑:"TORR DOMYSUBWITHRR,AREA ?"圓的面積是:",AREA WAIT"還要繼續(xù)計(jì)算嗎(Y/N)?"TOANSWER IFUPPER(ANSWER)="Y" LOOP ELSE EXIT ENDIFENDDOSETTALK&CTALK
*MYSUB.PRGPROCEDUREMYSUBPARAMETERSR,SS=PI()*R^2RETURN}以一個(gè)獨(dú)立的文件形式存在2024/8/1547(3)過程文件的建立
在實(shí)際的程序設(shè)計(jì)中,需要調(diào)用的過程不是一個(gè)或二個(gè),而是幾個(gè)、十幾個(gè)甚至上百個(gè),這就有可能使打開的文件數(shù)超過系統(tǒng)允許打開的文件數(shù),而且將導(dǎo)致磁盤目錄過于龐大,使系統(tǒng)調(diào)用文件的速度降低,程序執(zhí)行速度也隨之下降,因而有必要將若干個(gè)過程按一定的規(guī)定放在一個(gè)大文件中,這個(gè)文件稱為過程文件。1)過程文件的建立命令格式與建立程序文件一樣:格式:MODIFYCOMMAND<過程文件名>
過程文件的格式要求每個(gè)過程文件的開頭必須用下列語(yǔ)句:格式:PROCEDURE<過程名>
功能:標(biāo)明是一個(gè)過程。參數(shù)描述:<過程名>:指定過程名稱。命名方法與文件名的命名方法相同。2024/8/1548過程文件的內(nèi)容如下:
PROCEDURE<過程名1><語(yǔ)句序列1>RETURNPROCEDURE<過程名2><語(yǔ)句序列2>RETURN……PROCEDURE<過程名N><語(yǔ)句序列N>RETURN說明:在一個(gè)過程文件中可以包含多個(gè)過程,在同一個(gè)過程文件中不允許出現(xiàn)相同的過程名,如果有相同的過程名,則只有第一次出現(xiàn)的過程才有被調(diào)用的可能。一個(gè)過程文件中最多允許包含128個(gè)過程。2)過程文件的調(diào)用過程文件和表文件一樣,都是在先打開后才能使用。①過程文件的打開命令
格式:SETPROCEDURETO<過程文件名>
在主程序中應(yīng)先打開過程文件,將過程文件中的所有過程都調(diào)入2024/8/1549內(nèi)存(打開一個(gè)過程文件只算打開了一個(gè)文件)當(dāng)過程文件不再用時(shí)應(yīng)將其關(guān)閉,以節(jié)省內(nèi)存空間。系統(tǒng)允許打開一個(gè)過程文件,當(dāng)打開另一個(gè)過程文件時(shí),先已打開的過程文件系統(tǒng)會(huì)自動(dòng)將其關(guān)閉?!纠?-12】程序中常用到計(jì)算圓面積、長(zhǎng)方形面積、階乘等,現(xiàn)將它們編為三個(gè)過程,放在一個(gè)過程文件(MYPROCED.PRG)中,被主程序MYMAIN.PRG調(diào)用。*MYMAINCLEARTEXT這是一個(gè)計(jì)算圓面積、長(zhǎng)方形面積、階乘等的程序,先輸入功能選擇:1--計(jì)算圓面積;2--計(jì)算長(zhǎng)方形面積;3--計(jì)算階乘;4--退出。再輸入?yún)?shù):所有數(shù)據(jù)之間用逗號(hào)","分隔。如計(jì)算長(zhǎng)方形面積則在下面的提示信息后面輸入2,10,15。ENDTEXTCTALK=SET("TALK")SETTALKOFFSETPROCEDURETOMYPROCEDDOWHILE.T.ACCEPT"請(qǐng)輸入您的功能選擇及參數(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ù)錯(cuò)誤,請(qǐng)重新輸入!"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?"長(zhǎng)為"+ALLTRIM(STR(LONG))+"寬為"+ALLTRIM(STR(WIDTH))+;"的長(zhǎng)方形的面積為:",SRETURNPROCEDUREPROGRAM3PARAMETERSRN=1T=1DOWHILEN<=R T=T*N N=N+1ENDDO ?"值為"+ALLTRIM(STR(R))+"的階乘為:",TRETURN2024/8/1552③遞歸調(diào)用在過程中不但可以調(diào)用另外一個(gè)過程,而且還可以調(diào)用自己,這就叫遞歸調(diào)用?!纠?-13】求一個(gè)30以內(nèi)的自然數(shù)的階乘。*MYMAIN.PRGCTALK=SET("TALK")SETTALKOFFSETPROCEDURETOMYSUBINPUT“請(qǐng)輸入一個(gè)30以內(nèi)的正整數(shù):”TONUMBERII=1DOMYSUBWITHNUMBER,IICLOSEPROCEDURESETTALK&CTALKRETURN
*MYSUB.PRGPROCEDUREMYSUBPARAMETERSMM,NNIFMM>1 DOMYSUBWITHMM-1,NN&&遞歸調(diào)用。請(qǐng)注意同下一句的次序
NN=NN*MM&&計(jì)算乘積。ENDIF?STR(MM,2)+”!=”+STR(NN,10)RETURN返回2024/8/15535.3VFP6程序設(shè)計(jì)步驟5.3.1對(duì)任務(wù)進(jìn)行說明退出5.3.2分解問題5.3.3編制模塊5.3.4測(cè)試模塊5.3.5組裝全部模塊5.3.6整體測(cè)試5.3.7提高程序的可靠性5.3.8將程序定義為過程或函數(shù)
返回2024/8/15545.3.1對(duì)任務(wù)進(jìn)行說明
開始解決問題之前,需要將其說明清楚。有時(shí)調(diào)整問題的說明方式會(huì)有助于問題的解決。假設(shè)從不同的數(shù)據(jù)源獲得一批數(shù)據(jù),其中大部分是數(shù)值型數(shù)據(jù),但有些數(shù)據(jù)中,除包含數(shù)字字符外,還夾雜著一些虛線和空格?,F(xiàn)在需要從字段中清除這些虛線和空格,并將所得到的數(shù)字型數(shù)據(jù)加以保存??梢园慈缦路绞秸f明需要這個(gè)程序達(dá)到的目的,而不是簡(jiǎn)單地立即著手從原始數(shù)據(jù)中除去空格和虛線。目標(biāo)——用新值替換字段中的原值,新值包含原值中除空格和虛線以外的所有內(nèi)容。這種說明方式的優(yōu)點(diǎn)在于避免在處理長(zhǎng)字符串時(shí)遇到的困難。5.3.2分解問題
因?yàn)樽罱K是以操作、命令和函數(shù)的方式將具體的指令提供給VFP6,所以需要將問題分解為多個(gè)獨(dú)立的步驟。在本問題中,最容易分離出來的方法是在字符串中逐個(gè)掃描字符,只有將單個(gè)字符分離出來才能解決是否應(yīng)該保存它。返回2024/8/1555在掃描字符的時(shí)候,將檢查它是否為虛線和空格。到了這一步也許想要更詳細(xì)地說明這個(gè)問題,括號(hào)之后的數(shù)據(jù)應(yīng)該如何提取,貨幣符號(hào)、逗號(hào)和句號(hào)該如何消除等一系列問題將出現(xiàn)在大腦中。代碼越通用,為將來節(jié)省的時(shí)間就越多,問題在于如何做到事半而功倍。下面給出一個(gè)比從前適用范圍更廣的問題說明方式。精煉的目標(biāo)——用原始數(shù)據(jù)中的數(shù)值型字符更新字段值。這便是在字符的層次上重新說明問題。如果字符是數(shù)值則保留,否則將指針移向下一個(gè)字符。當(dāng)用原始字符串中的數(shù)值重新構(gòu)成一個(gè)只包含有數(shù)值元素的新串時(shí),用這個(gè)新串替換掉原來的字符串。如此循環(huán),直到將所有記錄中的數(shù)據(jù)全部更新。概括起來,全部問題可以分解成以下一些模塊:■逐個(gè)檢查字符;■判斷該字符是否為數(shù)值;■若是數(shù)值,則將其復(fù)制到新串中;■檢查完字符串的全部后,用只含數(shù)字的新串替換原串;■重復(fù)上述步驟,直到表中的全部記錄都被更新。返回2024/8/15565.3.3編制模塊
清楚了要達(dá)到的目標(biāo)以后,便可以開始用VFP6的命令、函數(shù)和操作符構(gòu)造各模塊。因?yàn)槊詈秃瘮?shù)是用來處理數(shù)據(jù)的,所以需要一些數(shù)據(jù)來測(cè)試其功能。這些用于測(cè)試的數(shù)據(jù)應(yīng)與實(shí)際數(shù)據(jù)盡量相近。例如,在命令窗口中輸入如下命令,將一個(gè)測(cè)試字符串賦值給變量:cTest=”123_456_789_0”1、逐個(gè)檢查字符首先,用SUBSTR()函數(shù)(子字符串截取函數(shù))在字符串中逐個(gè)字符截取檢查。?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í)行相同的操作。因?yàn)橛靡詼y(cè)試的字符串有固定的字符數(shù)(15),即使在表的記錄中這個(gè)字段的長(zhǎng)度不是定長(zhǎng),也能夠使用FOR循環(huán)命令。因?yàn)镕OR循環(huán)的計(jì)數(shù)器每執(zhí)行一遍增1,因此,可以在SUBSTR()函數(shù)中使用該計(jì)數(shù)器。所以可以編寫一個(gè)示例程序:FORII=1TO15 ??SUBSTR(cTest,II,1)ENDFOR將此程序保存為L(zhǎng)508.PRG后運(yùn)行運(yùn)行結(jié)果123_456_789_02、判斷字符是否為數(shù)字從字符串中分離出單個(gè)字符之后便可以判斷它是否為數(shù)字。在命令窗口中輸入如下命令:?ISDIGIT(“2”)
運(yùn)行結(jié)果.T.?ISDIGIT(“_”)?ISDIGIT(SUBSTR(cTest,10,1))
.F..F.2024/8/15583、若字符為數(shù)值,將它復(fù)制到新串中既然可以逐一檢查字符是否為數(shù)值,下面可以使用內(nèi)存變量來保存該數(shù)字。為了創(chuàng)建一個(gè)變量,需要給它賦一個(gè)初值——一個(gè)零長(zhǎng)度的字符串。cNumbVar=””因?yàn)镕OR循環(huán)掃描整個(gè)字符串,所以最好用一個(gè)變量暫存每次分離出來的字符以便處理。cCharacter=SUBSTR(cTest,II,1)提示:在計(jì)算、求值以及在函數(shù)中得到的結(jié)果,最好保存在內(nèi)存變量中,這樣便于直接處理這些變量而不必重新計(jì)算或求值??梢允褂靡韵麓a將每個(gè)被確認(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測(cè)試模塊
如果將兩行用于輸出字符串的命令加到程序末尾并運(yùn)行程序,就可以看出程序如何對(duì)測(cè)試字符進(jìn)行操作。cNumbVar=””FORII=1TO15 cCharacter=SUBSTR(cTest,II,1) IFISDIGIT(cCharacter) cNumbVar=cNumbVar+ccharacter
ENDIFENDFOR?cTest?cNumbVar程序運(yùn)行結(jié)果
輸出似乎是正確的,但在測(cè)試模塊過程中改變被測(cè)試字符串將出現(xiàn)問題。如在命令窗口中執(zhí)行下一條命令后再運(yùn)行這部分代碼將出現(xiàn)問題:
cTest=”123_456_789ab0”
程序運(yùn)行結(jié)果123_456_789ab0123456789123_456_789_01234567890因?yàn)镕OR循環(huán)只執(zhí)行15次,而被測(cè)試字符串的長(zhǎng)度有16個(gè)字符。2024/8/1560對(duì)于可變長(zhǎng)字符串需要用另外的辦法。能否有一種方法,讓FOR循環(huán)知道被測(cè)試字符串的長(zhǎng)度?循環(huán)次數(shù)由被測(cè)試字符串的長(zhǎng)度來決定?事實(shí)上VFP提供了一個(gè)函數(shù)LEN()可以檢測(cè)字符串的長(zhǎng)度。如果將它放在FOR循環(huán)命令中,那么程序在上述兩種情況下都能很好地運(yùn)行。cNumbVar=””FORII=1TOLEN(cTest) cCharacter=SUBSTR(cTest,II,1) IFISDIGIT(cCharacter) cNumbVar=cNumbVar+ccharacter
ENDIFENDFOR?cTest?cNumbVar程序運(yùn)行結(jié)果123_456_789ab01234567890在命令窗口中執(zhí)行下一條命令后再運(yùn)行這部分代碼cTest="123_456_789ab0cd1e23"程序運(yùn)行結(jié)果123_456_789ab0cd1e231234567890123返回2024/8/15615.3.5組裝全部模塊
若要完善此程序,則要從表中讀取數(shù)據(jù)。在對(duì)表進(jìn)行操作時(shí),需要逐條掃描記錄,針對(duì)表中記錄的字段而不是變量進(jìn)行操作。為了說明此步驟,先將STUDENT表中的“學(xué)號(hào)”字段的值進(jìn)行修改后作為一個(gè)測(cè)試用表,修改后的STUDENT表中數(shù)據(jù)如圖5-9所示:圖5-9測(cè)試用數(shù)據(jù)
在對(duì)字段中的字符串進(jìn)行處理后,目的并不是要將結(jié)果保存在內(nèi)存變量中,而是要將處理后的值用來替換原來字段中的值。要對(duì)字段的值進(jìn)行替換,前面已經(jīng)講過可以用REPLACE命令:2024/8/1562REPLACE學(xué)號(hào)WITHcNumbVar在將此條語(yǔ)句加入到程序中后,因?yàn)檫@個(gè)程序的功能目前還只是對(duì)當(dāng)前一條記錄的“學(xué)號(hào)”字段進(jìn)行處理,而不是對(duì)表中所有記錄同時(shí)進(jìn)行處理,這離要求還差一步。通過前面講到的要對(duì)表中的記錄進(jìn)行全部或部分記錄進(jìn)行處理時(shí),可以使用基于表的循環(huán)命令SCAN…ENDSCAN命令。將這些進(jìn)行組裝時(shí)要注意,因?yàn)榍懊娴某绦蚴腔趦?nèi)存變量編寫的,現(xiàn)在是要將這些代碼用于對(duì)表中記錄進(jìn)行處理,為此要將原字符串變量名cTest改為表中的字段名“學(xué)號(hào)”,最后的程序如下:SCAN cNumbVar=”” FORII=1TOLEN(學(xué)號(hào))
cCharacter=SUBSTR(學(xué)號(hào),II,1) IFISDIGIT(cCharacter) cNumbVar=cNumbVar+ccharacter
ENDIF ENDFOR REPLACE學(xué)號(hào)WITHcNumbVarENDSCAN返回2024/8/15635.3.6整體測(cè)試
完成全部代碼之后,在處理實(shí)際數(shù)據(jù)之前,必須用示例數(shù)據(jù)進(jìn)行測(cè)試。運(yùn)行此程序時(shí),如果當(dāng)前工作區(qū)中沒有表打開,此程序?qū)⒁笙却蜷_一個(gè)表,如果先將STUDENT表打開后再運(yùn)行此程序,則此程序可正常運(yùn)行。程序運(yùn)行后屏幕顯示的結(jié)果如圖5-9所示:圖5-10運(yùn)行程序測(cè)試后STUDENT表中的部分?jǐn)?shù)據(jù)
到此,程序設(shè)計(jì)基本完成,但為了使程序更可靠,需要進(jìn)行下面的改進(jìn)工作。返回2024/8/15645.3.7提高程序的可靠性
所謂可靠的程序是指一個(gè)程序不僅能夠完成設(shè)計(jì)的功能,還可以預(yù)料到可能發(fā)生的錯(cuò)誤并進(jìn)行排錯(cuò)處理。上面的程序包含有二個(gè)假設(shè),只有滿足了這兩個(gè)條件,程序才能正常運(yùn)行。這兩個(gè)假設(shè)是:在當(dāng)前目錄中有STUDENT表,或者有一個(gè)打開的表;同時(shí),STUDENT表中有“學(xué)號(hào)”字段,或者當(dāng)前工作區(qū)中打開的表中有“學(xué)號(hào)”字段。如果事先指定打開表,就會(huì)限制程序的使用范圍,最好的辦法是在運(yùn)行程序時(shí),由用戶根據(jù)情況決定打開哪個(gè)表。下面是改進(jìn)后的程序,它具備了預(yù)料并排除錯(cuò)誤的功能:ACCEPT“請(qǐng)輸入要處理的表文件名”TOTABNAMESRLtableOK=.F.&&此變量確定程序正常運(yùn)行的條件之一是否成立。
&&初始值為.F.,假設(shè)條件不成立。LfieldOK=.F.&&此變量確定程序正常運(yùn)行的另一條件是否成立。TABNAME=””&&定義一個(gè)變量用于保存表文件名IFAT(“.”,TABNAMESR)=0 TABNAME=TABNAMESR+”.DBF”&&使輸入的文件名帶有擴(kuò)展名2024/8/1565ENDIFDOWHILE.T.
IFFILE(TABNAME)
&&判斷所輸入的文件名是否存在。
USE(TABNAME)&&打開所輸入的表文件
LtableOK=.T.&&將表的標(biāo)志置為“.T.”
EXIT&&跳出循環(huán)體
ELSE
=MESSAGEBOX(“當(dāng)前目錄中沒有所輸入的表文件!”,64,”表名錯(cuò)誤!”)
USE?&&顯示“打開”對(duì)話框,重新選擇表
IFUSED()&&判斷是否將一個(gè)表打開
EXIT &&若有表打開也跳出循環(huán)體
ENDIF ENDIFENDDO*這部分代碼檢查當(dāng)前表的每一個(gè)字段,直到發(fā)現(xiàn)有一個(gè)名為“學(xué)號(hào)”的字段,*發(fā)現(xiàn)該字段存在后,設(shè)置LfieldOK為.T.,同時(shí)執(zhí)行EXIT命令跳出循環(huán)體,*否則LfieldOK變量仍為.F.。FORII=1TOFCOUNT() IFFIELD(II)=”學(xué)號(hào)”.AND.TYPE(“學(xué)號(hào)”)=”C”
LfieldOK=.T.
EXIT2024/8/1566 ENDIFENDFORIFLtableOK.AND.LfieldOK
SCAN
cNumbVar=”” FORII=1TOLEN(學(xué)號(hào))
cCharacter=SUBSTR(學(xué)號(hào),II,1) IFISDIGIT(cCharacter) cNumbVar=cNumbVar+ccharacter
ENDIF ENDFOR REPLACE學(xué)號(hào)WITHcNumbVar
ENDSCANENDIF
該程序最大的局限在于只能處理一個(gè)字段。若需要對(duì)一個(gè)字段名不是“學(xué)號(hào)”的字段進(jìn)行同樣的操作,就不得不從頭開始檢查程序,把全部的“學(xué)號(hào)”改為所要處理的字段名。返回2024/8/15675.3.8將程序定義為過程或函數(shù)
可以將刪除字符串中非數(shù)字字符的程序代碼轉(zhuǎn)換成為函數(shù),使其運(yùn)行更可靠。所建立的函數(shù)返回字符串中的所有數(shù)字字符?!纠?-15】刪除字符串中非數(shù)字字符示例過程:FUNCTIONNUMBERONLY(CMIXEDVAL)cNumbVar=””FORII=1TOLEN(CMIXEDVAL) cCharacter=SUBSTR(CMIXEDVAL,II,1) IFISDIGIT(cCharacter) cNumbVar=cNumbVar+ccharacter
ENDIFENDFORRETURNcNumbVarENDFUNCSCAN REPLACEFIELDNAMEWITHNUMBERONLY(FIELDNAME)ENDSCAN或者,可以更簡(jiǎn)單地寫為:REPLACEALLFIELDNAMEWITHNUMBERONLY(FIELDNAME)
除了可以使用戶在許多條件下使用這些代碼之外,函數(shù)還提高了程序的可讀性。如果要對(duì)一個(gè)已打開表的某個(gè)字段使用該功能,可以運(yùn)行下列代碼:返回2024/8/15685.4面向?qū)ο蟮某绦蛟O(shè)計(jì)技術(shù)5.4.1面向?qū)ο髴?yīng)用程序示例5.4.2類的概念5.4.3對(duì)象和方法5.4.4類的封裝、繼承和多態(tài)性
退出5.4.5類的操作方法返回2024/8/15695.4.1面向?qū)ο髴?yīng)用程序示例
設(shè)計(jì)一組記錄定位按鈕。使用定位按鈕組來允許用戶在表中移動(dòng)記錄指針,其中典型的便是在表中上移或下移一條記錄,或者移向表的首記錄或尾記錄。因?yàn)樗械膽?yīng)用程序中用到的定位按鈕組都有一些共同的特點(diǎn)和動(dòng)作,所以創(chuàng)建一個(gè)定位按鈕類是一個(gè)好方法。在此之后,便可以很容易地從這些共同的外觀和功能中派生出所需要的命令按鈕組。在本實(shí)例中,首先進(jìn)行構(gòu)建定位按鈕類的父類(NAVBUTTON類),再創(chuàng)建子類定義四種定位按鈕的特定功能和外觀。這四個(gè)按鈕為:NVATOP、NAVPRIOR、NAVNEXT和NAVBOTTOM。最后,創(chuàng)建VCR容器類,每一種按鈕都被加入到容器類中。如果該容器可以加到表單或工具欄中,就可以用來向表單提供表中記錄的定位功能。第1步、構(gòu)建定位按鈕父類。若要?jiǎng)?chuàng)建父類NAVBUTTON,要2024/8/1570
將如下六個(gè)類定義(NAV_BUTTON、NAVTOP、NAVPRIOR、NAVTEXT、NAVBOTTOM和VCR)保存到一個(gè)程序文件中。*通用定位按鈕父類的定義DEFINECLASSNAVBUTTONASCOMMANDBUTTON&&定義定位按鈕的父類HEIGHT=25
&&給類設(shè)置大小屬性WIDTH=75TABLEALIAS=””&&使用TableAlias自定義屬性來保存需要進(jìn)行定位操作的表別名。&&若設(shè)置了TableAlias,父類過程在子類定位代碼執(zhí)行以前選擇有該別名的表。&&否則,將假定用戶需要對(duì)當(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步、定義四個(gè)定位按鈕類。所有特定的定位按鈕都基于NAVBUTTON類,下面的代碼定義了定位按鈕組中的TOP(第一條)按鈕,并給出比較詳細(xì)的注釋,其它的三類定位按鈕與第一類相似,注釋簡(jiǎn)略。*TOP定位按鈕類定義DEFINECLASSNAVTOPASNAVBUTTON&&定義Top定位按鈕類
CAPTION=”第一條”&&設(shè)置Caption(按鈕名)屬性
PROCEDURECLICK&&創(chuàng)建控件發(fā)生點(diǎn)擊事件所執(zhí)行的方法程序代碼
DODEFAULT()&&調(diào)用父類Navbutton的Click事件代碼,
&&以便當(dāng)TableAlias屬性設(shè)置之后,可以選擇適當(dāng)?shù)膭e名。
GOTOP&&包含將記錄指針移向首記錄的代碼:GoTop THIS.REFRESHFORM ENDPROC&&點(diǎn)擊過程結(jié)束。ENDDEFINE
&&類定義結(jié)束。說明:調(diào)用父類的RefreshForm方法程序,沒有必要使用域操作符(::)、因?yàn)樵谧宇愔袥]有與父類中此方法程序重名的方法程序,但父類和子類中都有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. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 激光跟蹤儀與D掃描技術(shù)考核試卷
- 疊拼別墅裝飾施工方案
- 比較分析2025年證券從業(yè)資格證考試試題及答案
- 2025年【河北省安全員A證】模擬考試題及答案
- 石油開采業(yè)的能源轉(zhuǎn)型與碳排放削減考核試卷
- 反不正當(dāng)競(jìng)爭(zhēng)考核試卷
- 2024年項(xiàng)目管理專業(yè)人士考試重要知識(shí)點(diǎn)試題及答案
- 屋面鋼模板施工方案
- 2025年關(guān)于證券從業(yè)資格證的深度探索試題及答案
- 珠寶首飾行業(yè)綠色發(fā)展策略考核試卷
- 企業(yè)健康管理計(jì)劃規(guī)劃方案討論
- 隧道高空作業(yè)施工方案
- 雨季三防知識(shí)培訓(xùn)
- 危險(xiǎn)性較大的分部分項(xiàng)工程專項(xiàng)施工方案嚴(yán)重缺陷清單(試行)
- 2025年上半年第二次商務(wù)部國(guó)際貿(mào)易經(jīng)濟(jì)合作研究院招聘7人重點(diǎn)基礎(chǔ)提升(共500題)附帶答案詳解
- 2025年陜西省土地工程建設(shè)集團(tuán)有限責(zé)任公司招聘筆試參考題庫(kù)附帶答案詳解
- 第7課《不甘屈辱 奮勇抗?fàn)帯返?課時(shí) 虎門銷煙 課件 五年級(jí)道德與法治下冊(cè) 統(tǒng)編版
- DB13-T5742-2023醇基燃料使用安全規(guī)范
- 《慢性阻塞性肺疾病的健康宣教》課件
- 江蘇省蘇北四市(徐州、宿遷、淮安、連云港) 2025屆高三第一次調(diào)研考試物理試題(含答案)
- 2025年廣投資本管理有限公司招聘筆試參考題庫(kù)含答案解析
評(píng)論
0/150
提交評(píng)論