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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

2024-8-121

VFP6程式設計基礎

2024-8-1225.1.1VFP6程式設計基本概念

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

過程化程式設計:它是採用結構化編程語句來編寫的程式。這類方法的特點是容易把一個複雜的程式分解為若干個較小的過程,每個過程都可進行獨立的調試。這類設計方法發(fā)展的總思想是從程式員角度考慮使程式設計更簡單,而較少從使用角度去考慮。使用這類方法設計的程式流程完全由程式員控制,使用者只能做由程式員預先安排好的事情。2024-8-125

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

1、過程化程式設計基本操作(1)建立過程檔。在VFP中,一個過程檔就是一個ASCII文本檔,因而可用各類編輯工具來建立。在VFP中有下麵二種簡易方法來建立:■在【檔】菜單下的【新建】菜單項中,選擇“程式”可選項。■在命令窗口中使用MODIFYCOMMAND命令。返回2024-8-126格式:MODIFYCOMMAND[<檔案名>/?]

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

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

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

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

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

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

返回2024-8-12145.1.3VFP程式設計編程方式

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

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

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

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

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

6、使用VFP設計工具編寫代碼借助表單設計器、類設計器和菜單設計器,用戶可以很容易地把程式代碼與用戶介面連接起來,這樣應用程式便可回應用戶的輸入並執(zhí)行相應的代碼。同樣,報表設計器將程式代碼與報表檔聯(lián)繫起來,以定制結構複雜並且符合用戶要求的報表。如果想充分發(fā)揮VFP的強大功能,應充分使用剛才提到的設計工具。

返回2024-8-12195.2VFP6的程式設計語言基礎5.2.1VFP的互動式輸入輸出命令5.2.2VFP6程式設計的條件與迴圈返回退出2024-8-12205.2.1VFP的互動式輸入輸出命令

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

格式:ACCEPT[<提示資訊>]TO<記憶體變數(shù)名>

功能:將從鍵盤上接收的字串數(shù)據(jù)存入指定的記憶體變數(shù)中。提供此命令是為了向後相容,在VFP中可以用文本框控制命令代替。參數(shù)描述:[<提示資訊>]:指定提示資訊字串,其後是數(shù)據(jù)輸入?yún)^(qū)。在VFP中,提示文本的字體與VFP主窗口的字體相同。但輸入的字元數(shù)據(jù)用9磅FoxFont字體顯示。2024-8-1221

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

螢幕顯示編輯窗口。在編輯窗口輸入如下程式代碼後用Ctrl+W存盤,返回命令窗口。CLEARSETTALKOFFACCEPT"請輸入表檔案名"TOFileNameUSE(FileName)LISTUSERETURN

說明:程式中第四句使用了宏代換函數(shù),這是由於FileName本身不是檔案名,而其內容才是檔案名。(2)通用數(shù)據(jù)接收命令

ACCEPT語句只能給字元型記憶體變數(shù)提供數(shù)據(jù)。如果用戶想給其他類型的記憶體變數(shù)提供數(shù)據(jù),可以使用下列命令:格式:INPUT[<提示資訊>]TO<記憶體變數(shù)名>2024-8-1223功能:用於接收從鍵盤上輸入的運算式,並將計算結果存入指定的記憶體變數(shù)或數(shù)組元素中。包含此命令也是為了提供向後的相容性。在VFP中,該命令也可以用文本框控制代替。參數(shù)描述:[<提示資訊>]:提示資訊,提示用戶輸入數(shù)據(jù)。[<記憶體變數(shù)名>]:指定一個記憶體變數(shù)或數(shù)組元素,存儲從鍵盤輸入的數(shù)據(jù)。如果指定的記憶體變數(shù)或數(shù)組元素不存在,VFP將自動創(chuàng)建該記憶體變數(shù)或數(shù)組。說明:INPUT語句與ACCEPT語句的執(zhí)行過程相同,功能相似。<記憶體變數(shù)名>的數(shù)據(jù)類型取決於輸入數(shù)據(jù)的類型。可以為數(shù)字型、字元型、日期型和邏輯型。

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

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

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

功能:結束程式的運行,返回命令窗口,同時關閉所有打開的檔。格式二:SUSPEND

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

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

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

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

格式:TEXT <文本字串>

ENDTEXT功能:將<文本字串>原樣輸出。這條命令通常是用於程式中對用戶說明某些問題。返回2024-8-12295.2.2VFP6程式設計的條件與迴圈

VFP的程式結構可以分為三種:順序結構、分支結構、迴圈結構。下麵將以一個程式演示條件分支結構的迴圈結構,並對這些概念詳細說明?!纠?-5】假設某單位有很多員工,並且要給月工資高於或等於1000元的員工增加5%的工資,給月工資低於1000元的員工增加10%的工資。下麵的示例程式將完成這一任務。此示例程式假定已在當前工作區(qū)打開了員工工資表,表中有一個名為“月工資”的數(shù)值型字段。*L505CTALK=SET("TALK")SETTALKOFFSCAN IF月工資>=1000

REPLACE月工資WITH月工資*1.052024-8-1230ELSE REPLACE月工資WITH月工資*1.1

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

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

參數(shù)描述:

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

CASEAA=1 ?“這次產生的亂數(shù)是:1”

CASEAA=2 ?“這次產生的亂數(shù)是:2”

CASEAA=3 ?“這次產生的亂數(shù)是:3”

OTHERWISE ?“這次產生的亂數(shù)是:大於3!”

ENDCASE2024-8-12342、迴圈語句程式設計中的迴圈,是指在程式中從某處開始,有規(guī)律地反復執(zhí)行某一個程式塊的現(xiàn)象。VFP的迴圈命令有三類:基於條件的迴圈、基於計數(shù)的迴圈和基於表的迴圈。(1)基於條件的迴圈:DOWHILE命令格式:DOWHILE<條件運算式> [<語句序列>] [EXIT] [LOOP] ENDDO參數(shù)描述:<條件運算式>:指定一個邏輯運算式,它的值決定是否執(zhí)行DOWHILE和ENDDO之間的命令集合。如果<條件運算式>的值為“真”,就執(zhí)行命令集。[<語句序列>]:指定當<條件運算式>計算為“真”時要執(zhí)行的2024-8-1235[LOOP]:直接將程式控制返回到DOWHILE語句,並重新計算條件值。LOOP可以放在DOWHILE和ENDDO之間的任何位置。[EXIT]:將程式控制從DOWHILE和ENDDO迴圈的內部轉到ENDDO後的第一條命令。EXIT可以放在DOWHILE和ENDDO之間的任何位置。ENDDO:表明DOWHILE語句的結束。【例5-7】計算連續(xù)自然數(shù)之和,並且顯示和剛大於1000的最後一個自然數(shù)。STORE0TOAA,BBDOWHILEAA<=1000 BB=BB+1 AA=AA+BBENDDO?BB結果顯示為45。VFP命令集。2024-8-1236【例5-8】求連續(xù)N個不是7的倍數(shù)的自然數(shù)之和,當和是101的倍數(shù)時顯示最後的自然數(shù)和它們的和。STORE0TOAA,BB&&定義二個變數(shù),用以保存累加值和累加數(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ù),則結束程式的迴圈

ENDIFENDDO?BB,AA螢幕顯示結果為207和18483。2024-8-1237(2)基於計數(shù)的迴圈:FOR命令

格式:FOR<記憶體變數(shù)>=<初始值>TO<終值>[STEP<步長>] <語句序列> [EXIT] [LOOP] ENDFOR/NEXT

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

格式:SCAN[<範圍>][FOR<條件>][WHILE<條件>] [<語句序列>] [LOOP] [EXIT] ENDSCAN參數(shù)描述:[<範圍>]:指定對當前表中記錄掃描的範圍。只有在範圍之內的記錄才有可能掃描到。SCAN命令的默認範圍為ALL。[FOR<條件>]:只有條件運算式的計算結果為“真”的記錄,才能對其執(zhí)行命令。包含F(xiàn)OR子句可以篩選出不想掃描的記錄。[WHILE<條件>]:指定一個邏輯運算式作為執(zhí)行命令的條件,只要邏輯運算式計算為“真”,就對記錄執(zhí)行命令,直到遇到使運算式不為“真”的記錄為止。[<語句序列>]:指定要執(zhí)行的VFP命令集。2024-8-1240[LOOP]:把控制權直接交給SCAN子句。LOOP子句可以放在SCAN和ENDSCAN之間的任何地方。[EXIT]:把控制權力從SCAN…ENDSCAN迴圈語句交給ENDSCAN下麵的命令。EXIT子句可以放在SCAN和ENDSCAN之間的任何地方。ENDSCAN:標誌SCAN過程的結束。說明:SCAN命令自動將記錄指針移到下一條滿足條件的記錄,並執(zhí)行相應的命令塊?!纠?-10】逐條顯示STUDENT表中男生的情況。USESTUDENTSCANFOR性別=”男”

DISP WAITENDSCANUSE或者使用下列代碼:

USESTUDENTSCAN IF性別#”男”

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

(1)副程式和過程的調用副程式或過程的編寫和修改方式與一般的程式一樣,不同的是過程的最後一個語句必須是返回語句(RETURN),調用過程的程式是主程序,過程可以嵌套,即一個副程式可以再調用其他副程式,但不能形成迴圈嵌套。副程式或過程的調用也是用DO命令:格式:DO<過程名>[IN<程式檔案名>][WITH<參數(shù)表>]

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

<過程名>:指定要執(zhí)行的過程名稱。VFP首先在當前執(zhí)行的程式中查找此過程,如果在該程式中找不到此過程,VFP就在用SETPROCEDURE命令打開的過程檔中查找此過程,如果還未找到,則以反向調用順序在當前打開的其他程式檔中查找此內2024-8-1242內部過程;若仍未找到,則在磁片上檢索以.FXP為擴展名的外部過程;若還未找到,最後檢索以.PRG擴展名的外部過程,並把它編譯為.FXP檔。在執(zhí)行一個可執(zhí)行檔或應用程式中,多個過程可以有相同的過程名。當使用DO去啟動一個可執(zhí)行檔或一個應用程式的過程時,VFP只在可執(zhí)行檔或應用程式的主程序中搜索指定的過程。IN<程式檔案名>:執(zhí)行<程式檔案名>指定的程式檔中的一個過程。當找到該檔時就執(zhí)行該過程。如果找不到該程式檔,就會顯示“檔不存在”的資訊。如果找到了程式檔,但指定的過程不存在,就會顯示“找不到過程”的資訊。[WITH<參數(shù)表>]:指定要傳遞給程式或過程的參數(shù)。列在<參數(shù)表>中的可以是運算式、記憶體變數(shù)、字母和數(shù)字、字段或用戶自定義函數(shù)。默認情況下,參數(shù)按引用傳遞給程式和過程,也可以將參數(shù)放在括弧中按值傳遞。傳遞給程式或過程的參數(shù)的最大數(shù)目為27。2024-8-1243(2)副程式或過程的返回語句

格式:RETURN[<運算式>/TOMASTER/TO<過程名>]

功能:將程式控制權返回給調用程式。參數(shù)描述:

[<運算式>]:指定返回給調用程式的運算式。如果省略RETURN命令或省略返回運算式,則自動將“真”返回給調用程式。[TOMASTER]:將控制權返回給最高層的調用程式。[TO<過程名>]:將控制權返回給指定的過程。說明:RETURN終止程式、過程或函數(shù)的運行,並將控制權返回給調用程式、最高次調用程式、另一個程式或窗口。當執(zhí)行RETURN命令時,VFP釋放PRIVATE(專用)類型的記憶體變數(shù)。通常,RETURN放在程式、過程或函數(shù)的末尾,用來將控制返回給高層的程式。但是,如果省略RETURN命令,一個隱含的RETURN命令也將被執(zhí)行。2024-8-1244副程式或過程調用及返回示意圖

【例5-11】計算圓面積的主程序為MYMAIN.PRG,副程式為MYSUB.PRG*MYMAIN.PRGCTALK=SET("TALK")SETTALKOFFCLEARSTORE0TORR,AREA2024-8-1245DOWHILE.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-1246(3)過程檔的建立

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

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

功能:標明是一個過程。參數(shù)描述:<過程名>:指定過程名稱。命名方法與檔案名的命名方法相同。2024-8-1247過程檔的內容如下:

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

格式:SETPROCEDURETO<過程檔案名>

在主程序中應先打開過程檔,將過程檔中的所有過程都調入2024-8-1248記憶體(打開一個過程檔只算打開了一個檔)當過程檔不再用時應將其關閉,以節(jié)省記憶體空間。系統(tǒng)允許打開一個過程檔,當打開另一個過程檔時,先已打開的過程檔系統(tǒng)會自動將其關閉。【例5-12】程式中常用到計算圓面積、長方形面積、階乘等,現(xiàn)將它們編為三個過程,放在一個過程檔(MYPROCED.PRG)中,被主程序MYMAIN.PRG調用。*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-1249IF(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-1250*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-1251③遞歸調用在過程中不但可以調用另外一個過程,而且還可以調用自己,這就叫遞歸調用?!纠?-13】求一個30以內的自然數(shù)的階乘。*MYMAIN.PRGCTALK=SET("TALK")SETTALKOFFSETPROCEDURETOMYSUBINPUT“請輸入一個30以內的正整數(shù):”TONUMBERII=1DOMYSUBWITHNUMBER,IICLOSEPROCEDURESETTALK&CTALKRETURN

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

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

返回2024-8-12535.3.1對任務進行說明

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

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

清楚了要達到的目標以後,便可以開始用VFP6的命令、函數(shù)和操作符構造各模組。因為命令和函數(shù)是用來處理數(shù)據(jù)的,所以需要一些數(shù)據(jù)來測試其功能。這些用於測試的數(shù)據(jù)應與實際數(shù)據(jù)儘量相近。例如,在命令窗口中輸入如下命令,將一個測試字串賦值給變數(shù):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)

輸出結果:1-(空格)82024-8-1256

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

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

.F..F.2024-8-12573、若字元為數(shù)值,將它複製到新串中既然可以逐一檢查字元是否為數(shù)值,下麵可以使用記憶體變數(shù)來保存該數(shù)字。為了創(chuàng)建一個變數(shù),需要給它賦一個初值——一個零長度的字串。cNumbVar=””因為FOR迴圈掃描整個字串,所以最好用一個變數(shù)暫存每次分離出來的字元以便處理。cCharacter=SUBSTR(cTest,II,1)提示:在計算、求值以及在函數(shù)中得到的結果,最好保存在內存變數(shù)中,這樣便於直接處理這些變數(shù)而不必重新計算或求值??梢允褂靡韵麓a將每個被確認為數(shù)字的字元添加到新串中:cNumbVar=cNumbVar+cCharacter完整的程式cNumbVar=””FORII=1TO15 cCharacter=SUBSTR(cTest,II,1) IFISDIGIT(cCharacter) cNumbVar=cNumbVar+ccharacter

ENDIFENDFOR返回2024-8-12585.3.4測試模組

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

ENDIFENDFOR?cTest?cNumbVar程式運行結果

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

cTest=”123_456_789ab0”

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

ENDIFENDFOR?cTest?cNumbVar程式運行結果123_456_789ab01234567890在命令窗口中執(zhí)行下一條命令後再運行這部分代碼cTest="123_456_789ab0cd1e23"程式運行結果123_456_789ab0cd1e231234567890123返回2024-8-12605.3.5組裝全部模組

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

在對字段中的字串進行處理後,目的並不是要將結果保存在內存變數(shù)中,而是要將處理後的值用來替換原來字段中的值。要對字段的值進行替換,前面已經(jīng)講過可以用REPLACE命令:2024-8-1261REPLACE學號WITHcNumbVar在將此條語句加入到程式中後,因為這個程式的功能目前還只是對當前一條記錄的“學號”字段進行處理,而不是對表中所有記錄同時進行處理,這離要求還差一步。通過前面講到的要對表中的記錄進行全部或部分記錄進行處理時,可以使用基於表的迴圈命令SCAN…ENDSCAN命令。將這些進行組裝時要注意,因為前面的程式是基於記憶體變數(shù)編寫的,現(xiàn)在是要將這些代碼用於對表中記錄進行處理,為此要將原字串變數(shù)名cTest改為表中的字段名“學號”,最後的程式如下:SCAN cNumbVar=”” FORII=1TOLEN(學號)

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

ENDIF ENDFOR REPLACE學號WITHcNumbVarENDSCAN返回2024-8-12625.3.6整體測試

完成全部代碼之後,在處理實際數(shù)據(jù)之前,必須用示例數(shù)據(jù)進行測試。運行此程式時,如果當前工作區(qū)中沒有表打開,此程式將要求先打開一個表,如果先將STUDENT表打開後再運行此程式,則此程式可正常運行。程式運行後螢幕顯示的結果如圖5-9所示:圖5-10運行程式測試後STUDENT表中的部分數(shù)據(jù)

到此,程式設計基本完成,但為了使程式更可靠,需要進行下麵的改進工作。返回2024-8-12635.3.7提高程式的可靠性

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

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

IFFILE(TABNAME)

&&判斷所輸入的檔案名是否存在。

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

LtableOK=.T.&&將表的標誌置為“.T.”

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

ELSE

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

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

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

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

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

LfieldOK=.T.

EXIT2024-8-1265 ENDIFENDFORIFLtableOK.AND.LfieldOK

SCAN

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

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

ENDIF ENDFOR REPLACE學號WITHcNumbVar

ENDSCANENDIF

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

可以將刪除字串中非數(shù)字字元的程式代碼轉換成為函數(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-12675.4面向對象的程式設計技術5.4.1面向對象應用程式示例5.4.2類的概念5.4.3對象和方法5.4.4類的封裝、繼承和多態(tài)性

退出5.4.5類的操作方法返回2024-8-12685.4.1面向對象應用程式示例

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

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

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

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

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

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

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

&&以便當TableAlias屬性設置之後,可以選擇適當?shù)膭e名。

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

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

CAPTION=”下一條”&&設置Caption屬性

PROCEDURECLICK&&定義Click事件代碼

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

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

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

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

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

ENDPROC&&Click事件代碼定義結束ENDDEFINE &&Next類定義結束*PRIOR定位按鈕類的定義DEFINECLASSNAVPRIORASNAVBUTTON CAPTION=”前一條”

PROCEDURECLICK DODEFAULT() SKIP–1 IFBOF() GOTOP ENDIF

溫馨提示

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

評論

0/150

提交評論