




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2024-8-121
VFP6程式設計基礎
2024-8-1225.1.1VFP6程式設計基本概念
VFP6支持過程化程式設計和麵向對象程式設計兩種程式設計與開發的類型。下麵是一個完整的VFP過程化程式,可以引出幾個基本概念。*功能說明:求圓形的面積。*檔案名:L501.PRGCLEARCTALK=SET("TALK")SETTALKOFFINPUT"請輸入圓的半徑,半徑="TORS=PI()*R*R?"半徑為"+ALLTRIM(STR(R))+"的圓,面積=",SSETTALK&CTALKRETURN2024-8-1231、從形式上看,VFP的程式是由若干有序的命令行組成,且滿足下列規則:(1)一個命令行內只能寫一條命令,命令行的長度不得超過2048個字元,命令行以回車鍵結束。(2)、一個命令行可以由若干個物理行組成,即一條命令在一個物理行內寫不下時,可以分成幾行。換行的方法有兩種:一種是在物理行的末尾加符號“;”,表示下一行輸入的內容是本行的繼續;另一種是系統自動換行,即輸入程式時,只管逐條命令輸入,無需考慮本條語句是否超過螢幕行寬的最大限度,當輸入的語句超過螢幕的最大行寬時,系統自動換行。輸入時只需在一行結束時按回車鍵,通知系統本命令行輸入完畢。(3)為便於閱讀,可以按一定的格式輸入程式,即一般程式結構左對齊,而控制結構內的語句序列比控制結構的語句縮進若干格。2、從功能上看,程式可以分為三個部分:第一部分是程式的說明部分,在本例程式中是前面的四行,一2024-8-124般用於說明程式的功能、檔案名等需要說明的有關資訊。第二部分是進行數據處理的部分,在本例程式中是從第五行開始的三行。通常任何一個有意義的程式,總是要有一些原始數據,否則,這個程式就沒有處理對象。同樣,程式運行的結果也有必要顯示或列印出來,否則,用戶將不知道程式幹了一些什麼。因此,第二部分程式常包括下列三個部分,依次為:提供原始數據部分、數據處理部分、輸出結果部分。第三部分是程式的控制返回部分,在本例中就是最後二條命令。它控制程式返回到調用該程式的調用處。過程化程式設計與面向對象程式設計
過程化程式設計:它是採用結構化編程語句來編寫的程式。這類方法的特點是容易把一個複雜的程式分解為若干個較小的過程,每個過程都可進行獨立的調試。這類設計方法發展的總思想是從程式員角度考慮使程式設計更簡單,而較少從使用角度去考慮。使用這類方法設計的程式流程完全由程式員控制,使用者只能做由程式員預先安排好的事情。2024-8-125
面向對象程式設計:這類程式設計思想是面向對象,即設計的重要任務在於描述對象。程式是由事件驅動的,因而,在執行過程中,持續等待的是一個發生在對象上的事件。而發生什麼事件則要看使用者的操作,如單擊、雙擊滑鼠等。至於下一步的程式流向,則要看驅動的是什麼事件。這類程式設計的主要目的是從任何方便與簡化使用入手,由使用者控制程式流向,這在一定程式上增加了編程的難度。5.1.2VFP6程式設計基本操作
1、過程化程式設計基本操作(1)建立過程檔。在VFP中,一個過程檔就是一個ASCII文本檔,因而可用各類編輯工具來建立。在VFP中有下麵二種簡易方法來建立:■在【檔】菜單下的【新建】菜單項中,選擇“程式”可選項。■在命令窗口中使用MODIFYCOMMAND命令。返回2024-8-126格式:MODIFYCOMMAND[<檔案名>/?]
功能:打開文本編輯窗口,編寫程式代碼。參數描述:[<檔案名>]:為可選項,指定打開或創建的程式檔案名。若不指定新建程式檔的擴展名,VFP自動指定.PRG為擴展名。MODIFYCOMMAND命令支持含有“*”和“?”通配符的檔梗概。名稱與這個梗概匹配的每一個檔都在編輯窗口中打開。若省略檔案名,將給打開的編輯窗口賦一個初始名稱“程式1.PRG”。當關閉編輯窗口時,可以用另外的檔案名保存該檔。[?]:顯示“打開”對話框。可以從中選擇一個已有程式或輸入要創建的新程式名。說明:修改程式檔之後,更新過的檔將寫到磁片上。除非在配置檔中用TEDIT指定一個外部編輯器,否則,一般使用VFP的內置編輯器。2024-8-127【例5-2】用戶通過VFP6的命令窗口建立上例程式檔。在VFP6的命令窗口中輸入下條命令後按回車鍵。MODIFYCOMMANDL501打開程式編輯窗口在程式編輯窗口中輸入程式代碼用Ctrl+W存盤退出編輯窗口,或單擊程式編輯窗口上的【關閉】按鈕,在彈出的對話窗口中確定存盤,生成L501.prg檔。2024-8-128(2)運行程式下麵的任一方法均可運行程式:■選擇【程式】菜單下的“運行”菜單,利用“運行”對話框選擇要運行的程式;■在命令窗口中輸入如下命令:DO<程式檔案名>
系統就會運行這個程式。如果檔不加擴展名,系統會假定它具有.PRG的擴展名,如果想運行一個具有其他擴展名的命令檔時,在輸入命令時必須給出這個命令檔的全名。如:要運行上例中編輯的程式,可以在命令窗口中輸入:
DOL501然後按回車鍵執行。2024-8-1292、事件驅動程式設計基本操作VFP6提供了真正的無模式操作,使用戶不僅能夠輕鬆地進行多個表單的自動協調,而且可以很容易地同時運行一個表單的多個實例。VFP6還提供了事件處理機制,可以給用戶提供一個更為豐富的交互環境。事件驅動程式設計基本操作,關鍵是確定事件以及對事件發生時應作出的反應。一個事件發生時,VFP6系統應作出的反應,仍可通過一個過程來實現,即用過程化程式設計的方法來處理某一事件發生時系統應作出的回應。通常,VFP6程式設計時應考慮的事件有:(1)核心事件表5-1是VFP6中核心事件列表,這些事件適用於大多數的控件。(2)容器事件和對象事件。為控件編寫事件代碼時,請注意以下兩條規則:■容器不處理與所包含的控件相關聯的事件;■若沒有與某控件相關聯的事件代碼,則VFP在該控件所在類層次結構中逐層向上檢查是否有與該事件相關聯的代碼。2024-8-1210表5-1VFP6核心事件
返回1652024-8-1211當用戶以任意一種方式(使用Tab鍵、單擊滑鼠等)與對象交互時,對象事件被觸發。每個對象獨立接受自己的事件。例如,在圖5-2中,儘管命令按鈕位於表單上,當用戶單擊命令按鈕時,不會觸發表單的Click事件,只觸發命令按鈕的Click事件。若沒有與命令按鈕相關聯的Click事件代碼,儘管有與表單相關聯的Click事件代碼,當用戶單擊按鈕時,也不會執行與表單相關聯的Click事件代碼。圖5-2容器、控件事件代碼相對獨立
這些規則也適用於表格控件。表格事件包含列,列又包含標頭和控件。事件發生時,只有與事件相關聯的最底層對象識別該事件,更高層的容器不識別這個事件。圖5-3演示了當用戶在表格上移動滑鼠時,哪個對象處理這個MouseMove事件。2024-8-1212圖5-3表格的MouseMove事件
例如:在一個命令按鈕上,按下滑鼠左鍵並拖動滑鼠指針離開命令按鈕,儘管滑鼠指針可能已經在表單上,但這個命令按鈕的MouseMove事件還在不斷產生。當在表單上而不是在命令按鈕上釋放滑鼠時,發生的MouseUp事件是與命令按鈕相關聯的,而不是與表單的MouseUp事件相關聯。2024-8-1213(3)VFP6中類和控件事件若表單上的控件基於一個用戶自定義的類,當一個事件發生時,VFP首先在該控件中查看是否有與此事件相關聯的代碼,若找到,則執行它;否則,VFP將在類層次中向上一層檢查。無論VFP在類層次的哪個地方找到該事件的代碼,都執行它,如圖5-4所示。圖5-4若沒有與對象相關聯的事件代碼,則VFP將檢查父類
返回2024-8-12145.1.3VFP程式設計編程方式
VFP程式由代碼組成,代碼包括以命令形式出現的指令、函數和VFP可以理解的任何操作。這些指令包含在“命令”窗口、程式檔、表單設計器與類設計器的事件或方法程式代碼窗口、菜單設計器的過程代碼窗口、報表設計器的過程代碼窗口中。使用“命令”窗口可以在“命令”窗口中鍵入VFP命令並按Enter鍵執行。若要重新執行該命令,還可以將游標移到此命令所在行並按Enter鍵。甚至可以在“命令”窗口中像獨立程式一樣執行多行代碼。要在“命令”窗口中運行多行代碼,可以按下述方法執行:(1)選取代碼行。(2)按Enter鍵或右擊並在快捷菜單中選擇“運行所選區域”。因為“命令”窗口是一個編輯窗口,所以在編輯命令時可以使用VFP提供的編輯工具。在“命令”窗口中可以修改、插入、刪除、剪切、複製和粘貼正文。2024-8-1215在“命令”窗口中執行命令的優點是:能夠立即執行被鍵入的命令,不需要將其保存為檔並用程式方式執行。此外,在菜單或對話框中所作的選擇可以馬上轉換成“命令”窗口中的命令。用戶可以將這些命令複製並粘貼到VFP程式中,然後重複執行這些程式。這樣做可以很容易地重複執行成百上千條的命令。2、創建程式VFP程式是包含一系列命令的文本檔。在VFP中可以通過下述途徑創建程式:(1)在專案管理器中,選定“代碼”選項卡中的“程式”項;(2)選擇“新建”命令。或者:(1)在【檔】菜單中選擇【新建】命令;(2)在“新建”對話框中選擇“程式”;(3)單擊【新建檔】按鈕。或者在“命令”窗口中鍵入:MODIFYCOMMAND2024-8-12163、保存程式創建程式後,一定要注意保存程式。若要保存程式,可以從【檔】菜單中選擇【保存】命令。或者按Ctrl+W組合鍵保存,若不想保存對新建程式或已有程式所做的修改,也可以使用Ctrl+Q組合鍵,不存盤而退出編輯窗口。若要關閉一個沒有保存的程式,則會彈出相應對話框,提示用戶是否保存已作的修改。若保存了一個由專案管理器創建的程式,則該程式被加入到專案中。若保存一個尚未命名的程式,則會打開“另存為…”對話框,提示用戶可以在其中為程式指定程式名。程式保存後,可以運行或修改它。4、修改程式程式保存後可以修改。首先,按以下四種方法之一打開想要修改的程式檔:■若程式包含在一個專案中,則在專案管理器中選定它並選擇2024-8-1217修改命令。
■在【檔】菜單中選擇【打開】命令,這時彈出一個包含檔列表的對話框,在“檔類型”列表框中選擇“程式”,然後在檔列表中選定要修改的程式,單擊【確定】按鈕。
■在“命令”窗口中按如下方式鍵入要修改的程式名:MODIFYCOMMAND<程式檔案名>
■在“命令”窗口中輸入:MODIFYCOMMAND?
然後從檔列表中選擇要修改的程式,單擊【打開】按鈕。打開檔之後便可進行修改,修改完成後就可以保存。5、運行程式程式創建之後便可以運行。若要運行程式,有以下三種方法:■若程式包含在一個專案中,則可在專案管理器中選定它,並選擇【運行】命令。2024-8-1218■在【程式】菜單中選擇【運行】菜單項,然後在程式列表中,選擇想要運行的程式,並單擊【運行】按鈕。■在“命令”窗口中,按如下方式鍵入DO以及要運行的程式檔案名:DO<程式檔案名>
6、使用VFP設計工具編寫代碼借助表單設計器、類設計器和菜單設計器,用戶可以很容易地把程式代碼與用戶介面連接起來,這樣應用程式便可回應用戶的輸入並執行相應的代碼。同樣,報表設計器將程式代碼與報表檔聯繫起來,以定制結構複雜並且符合用戶要求的報表。如果想充分發揮VFP的強大功能,應充分使用剛才提到的設計工具。
返回2024-8-12195.2VFP6的程式設計語言基礎5.2.1VFP的互動式輸入輸出命令5.2.2VFP6程式設計的條件與迴圈返回退出2024-8-12205.2.1VFP的互動式輸入輸出命令
設計程式,就是用一系列命令存儲數據並操作這些數據。程式設計的原材料是數據和數據的存儲容器,而處理這些原材料的工具是命令、函數的操作符。1、互動式輸入命令(1)字元接收語句
格式:ACCEPT[<提示資訊>]TO<記憶體變數名>
功能:將從鍵盤上接收的字串數據存入指定的記憶體變數中。提供此命令是為了向後相容,在VFP中可以用文本框控制命令代替。參數描述:[<提示資訊>]:指定提示資訊字串,其後是數據輸入區。在VFP中,提示文本的字體與VFP主窗口的字體相同。但輸入的字元數據用9磅FoxFont字體顯示。2024-8-1221
[<記憶體變數名>]:指定存儲字元數據的記憶體變數或數組元素。如果沒有定義此記憶體變數,ACCEPT將自動創建。如果沒有輸入數據就按Enter鍵,記憶體變數或數組元素則為空字元串。說明:在VFP中可用表單設計器或DEFINECLASS來創建文本框控制。ACCEPT命令允許直接向記憶體變數或數組元素輸入字元數據,輸入時不需要用引號將字元括起來。執行此語句時,先在螢幕上顯示<提示資訊>,游標緊隨其後,然後暫停程式運行,等待用戶從鍵盤上輸入資訊。輸入的資訊可以是任何可顯示的ASCII碼字串,並以回車鍵結束。系統將此字串資訊存入指定的記憶體變數中,然後,繼續運行暫停的程式。【例5-3】試編程完成下述功能:從鍵盤隨機輸入某個表的檔案名,要求打開並顯示此表的內容。在命令窗口輸入下列命令:MODIFYCOMMANDL503(檔案名中的擴展名.PRG可省略,以後不再說明)2024-8-1222
螢幕顯示編輯窗口。在編輯窗口輸入如下程式代碼後用Ctrl+W存盤,返回命令窗口。CLEARSETTALKOFFACCEPT"請輸入表檔案名"TOFileNameUSE(FileName)LISTUSERETURN
說明:程式中第四句使用了宏代換函數,這是由於FileName本身不是檔案名,而其內容才是檔案名。(2)通用數據接收命令
ACCEPT語句只能給字元型記憶體變數提供數據。如果用戶想給其他類型的記憶體變數提供數據,可以使用下列命令:格式:INPUT[<提示資訊>]TO<記憶體變數名>2024-8-1223功能:用於接收從鍵盤上輸入的運算式,並將計算結果存入指定的記憶體變數或數組元素中。包含此命令也是為了提供向後的相容性。在VFP中,該命令也可以用文本框控制代替。參數描述:[<提示資訊>]:提示資訊,提示用戶輸入數據。[<記憶體變數名>]:指定一個記憶體變數或數組元素,存儲從鍵盤輸入的數據。如果指定的記憶體變數或數組元素不存在,VFP將自動創建該記憶體變數或數組。說明:INPUT語句與ACCEPT語句的執行過程相同,功能相似。<記憶體變數名>的數據類型取決於輸入數據的類型。可以為數字型、字元型、日期型和邏輯型。
INPUT語句與ACCEPT語句的區別是:ACCEPT命令只能接收字串,而INPUT語句可以接收任意類型的VFP運算式;如果輸入的是字串,ACCEPT語句不要使用字元型定界符,而INPUT語句必須用定界符括起來。2024-8-1224【例5-4】試編程完成下列功能。從鍵盤上隨機輸入一個正數,以此數為半徑,求圓面積和球體積,並輸出結果。程式如下:*L504.PRGCLEARCTALK=SET("TALK")SETTALKOFFINPUT"半徑="TORS=PI()*R*RV=4/3*PI()*R**3?"圓面積=",S?"球體積=",VSETTALK&CTALKRETURN程式中的第一行為注釋行,說明此程式檔案名;第四行的功能是不顯示命令處理資訊,第十行的功能是恢復顯示命令處理資訊。在命令窗口中執行:DOL504螢幕顯示半徑=輸入10後按Enter鍵10顯示結果圓面積=314.16球體積=4188.7902052024-8-1225(3)輸入一個字元語句格式:WAIT[<提示資訊>][TO<記憶體變數名>]功能:暫停正在運行的程式,直到輸入一個字元為止。此語句與ACCEPT語句的功能部分相似。若選擇TO<記憶體變數名>子句,則將輸入的單個字元存入指定的記憶體變數。若直接輸入回車鍵,則記憶體變數中存入空字元串。記憶體變數的類型為字元型。若選擇<提示資訊>子句,執行此命令時,螢幕上將顯示提示資訊,否則,螢幕上將顯示“按任意鍵繼續…”WAIT語句主要用於下列兩種情況。■暫停程式的運行,以便觀察程式的運行情況,檢查程式運行的中間結果。
■根據實際情況輸入某個字元,以控制程式的執行流程。比如,在某應用程式的“Y/N”選擇中,常用此命令暫停程式的執行,等待用戶回答“Y”或“N”,由於這時只需輸入單個字元,也不用按回車鍵,操作簡便,回應迅速。2024-8-12262、格式化輸出命令前面的章節中在螢幕上顯示資訊時,使用的是非格式化輸出命令:“?”或“??”,為了能按一定的要求來設計螢幕格式,使之美觀、方便,下麵介紹一個螢幕顯示格式控制命令。格式:@<行號,列號>SAY<運算式>
功能:從指定的行、列號開始輸出運算式的值。說明:①<運算式>可以是常數、字段變數及由它們組成的運算式。②定位輸出時,一次只能輸出一個運算式。3、程式設計輔助命令(1)、中止程式運行■在程式運行過程中,按Esc鍵可以中止程式的運行,系統會顯示警告對話框讓用戶選擇:【取消】中止程式運行,這是缺省選擇;【掛起】暫停程式運行,返回命令窗口。當選擇【程式】菜單下的【繼續執行】選項或在命令窗口中輸入“Resume”命令,系統2024-8-1227則從中止的地方繼續程式的執行;【忽略】忽略所給的Esc,繼續程式的執行。通常在程式的開始時加有命令:SETESCAPEOFF執行該命令後,Esc鍵處於關閉狀態,在程式運行過程中,用戶不能通過Esc鍵來中止程式的運行,因為在應用程式中,不希望中止它;而在程式調試階段,通常不關閉這個鍵,讓程式在運行過程中,隨時都可以中斷執行,以檢查程式中間的運行狀況。格式一:CANCEL
功能:結束程式的運行,返回命令窗口,同時關閉所有打開的檔。格式二:SUSPEND
功能:暫時中止程式運行,返回命令窗口。當在菜單中選擇【程式】|【繼續執行】時,或在命令窗口中輸入RESUME命令時,系統再次從中止的地方繼續執行程式。2024-8-1228(2)、注釋命令
格式一:NOTE/*<注釋字串>格式二:&&<注釋字串>
說明:上述命令不作任何操作,只是注釋標記,用於說明程式或命令的功能等。注釋內容不需要用定界符定界,執行時也不顯示。注釋資訊如果在一行內沒有寫完,換行時也必須再寫注釋命令。NOTE或*是用於整行注釋的,因此,它必須寫在每一個注釋行的開頭;而&&命令是用於注釋一行的部分內容的,因此,它可以寫在行中(命令的尾部、注釋資訊的頭部),這是程式中唯一可以在一個邏輯行寫二個語句的命令。
USESTUDENT&&打開STUDENT表(3)文本顯示命令
格式:TEXT <文本字串>
ENDTEXT功能:將<文本字串>原樣輸出。這條命令通常是用於程式中對用戶說明某些問題。返回2024-8-12295.2.2VFP6程式設計的條件與迴圈
VFP的程式結構可以分為三種:順序結構、分支結構、迴圈結構。下麵將以一個程式演示條件分支結構的迴圈結構,並對這些概念詳細說明。【例5-5】假設某單位有很多員工,並且要給月工資高於或等於1000元的員工增加5%的工資,給月工資低於1000元的員工增加10%的工資。下麵的示例程式將完成這一任務。此示例程式假定已在當前工作區打開了員工工資表,表中有一個名為“月工資”的數值型字段。*L505CTALK=SET("TALK")SETTALKOFFSCAN IF月工資>=1000
REPLACE月工資WITH月工資*1.052024-8-1230ELSE REPLACE月工資WITH月工資*1.1
ENDIFENDSCAN SETTALK&CTALKRETURN在這一示例程式中用到了順序結構、迴圈結構和條件分支結構。1、條件語句條件分支根據條件的計算結果執行不同的操作。條件分支結構邏輯流程圖:入口條件判斷真假語句序列1出口語句序列2VFP中有兩條命令實現條件分支:格式:IF<條件運算式> <語句序列1> [ELSE <語句序列2>] ENDIF單條件選擇命令2024-8-1231參數描述:<條件運算式>:指定要計算的邏輯運算式。如果<條件運算式>的值為“真”,則執行IF語句之後的<語句序列1>;如果<條件運算式>的值為“假”,而且包含ELSE語句和<語句序列2>,則執行<語句序列2>;如果<條件運算式>的值為“假”,而且不包含ELSE語句和<語句序列2>,則程式忽略IF語句和ENDIF語句之間的所有語句,程式從ENDIF語句後的第一條命令開始繼續往下執行其他程式。
說明:一個IF…ENDIF語句塊中可以嵌套另一個IF…ENDIF語句塊。從【例5-5】所示的程式中可以看到:當當前記錄中“月工資”字段的值大於等於1000元時,將使“月工資>=1000”這個條件運算式的值為“真”,此時,程式控制執行<語句序列1>“REPLACE月工資WITH月工資*1.05”,即將月工資高於或等於1000元的工資上調5%。否則,即當當前記錄中“月工資”字段的值低於10002024-8-1232元時,將使“月工資>=1000”這個條件運算式的值為“假”,此時,程式控制執行<語句序列2>“REPLACE月工資WITH月工資*1.1”,即將月工資低於1000元的工資上調10%。(2)多條件選擇語句格式:DOCASECASE<條件運算式1> <語句序列1>[CASE<條件運算式2> <語句序列2> …CASE<條件運算式N> <語句序列N>][OTHERWISE <語句序列N+1>]ENDCASE
參數描述:
CASE<條件運算式1><語句序列1>…:VFP在執行這條多條件選擇命令時,按命令行中寫出的條件運算式的順序逐條檢查<條件運算式>,當遇到第一個結果為“真”的<條件運算式>時,就執行它後面的語句序列。語句序列中的命令逐條被執行,直到遇到下一個CASE或OTHER-WISE或ENDCASE,然後,2024-8-1233再從ENDCASE語句後的第一條命令開始繼續執行其他命令。如果一個CASE<條件運算式>的<條件運算式>為“假”,就忽略它後面的語句序列。【例5-6】運行一個程式,隨機輸出一條資訊:CLEARAA=INT(RAND()*10)&&隨機產生一個10以內的整數DOCASE CASEAA=0 ?“這次產生的亂數是:0”
CASEAA=1 ?“這次產生的亂數是:1”
CASEAA=2 ?“這次產生的亂數是:2”
CASEAA=3 ?“這次產生的亂數是:3”
OTHERWISE ?“這次產生的亂數是:大於3!”
ENDCASE2024-8-12342、迴圈語句程式設計中的迴圈,是指在程式中從某處開始,有規律地反復執行某一個程式塊的現象。VFP的迴圈命令有三類:基於條件的迴圈、基於計數的迴圈和基於表的迴圈。(1)基於條件的迴圈:DOWHILE命令格式:DOWHILE<條件運算式> [<語句序列>] [EXIT] [LOOP] ENDDO參數描述:<條件運算式>:指定一個邏輯運算式,它的值決定是否執行DOWHILE和ENDDO之間的命令集合。如果<條件運算式>的值為“真”,就執行命令集。[<語句序列>]:指定當<條件運算式>計算為“真”時要執行的2024-8-1235[LOOP]:直接將程式控制返回到DOWHILE語句,並重新計算條件值。LOOP可以放在DOWHILE和ENDDO之間的任何位置。[EXIT]:將程式控制從DOWHILE和ENDDO迴圈的內部轉到ENDDO後的第一條命令。EXIT可以放在DOWHILE和ENDDO之間的任何位置。ENDDO:表明DOWHILE語句的結束。【例5-7】計算連續自然數之和,並且顯示和剛大於1000的最後一個自然數。STORE0TOAA,BBDOWHILEAA<=1000 BB=BB+1 AA=AA+BBENDDO?BB結果顯示為45。VFP命令集。2024-8-1236【例5-8】求連續N個不是7的倍數的自然數之和,當和是101的倍數時顯示最後的自然數和它們的和。STORE0TOAA,BB&&定義二個變數,用以保存累加值和累加數DOWHILE.T. BB=BB+1 IFMOD(BB,7)=0&&判斷BB是否為7的倍數
LOOP&&如果BB是7的倍數則返回去將BB再加1
ENDIF AA=AA+BB&&將BB不是7的倍數的連續自然數累加求和
IFMOD(AA,101)=0&&判斷AA是否是101的倍數
EXIT&&如果AA是101的倍數,則結束程式的迴圈
ENDIFENDDO?BB,AA螢幕顯示結果為207和18483。2024-8-1237(2)基於計數的迴圈:FOR命令
格式:FOR<記憶體變數>=<初始值>TO<終值>[STEP<步長>] <語句序列> [EXIT] [LOOP] ENDFOR/NEXT
參數描述:<記憶體變數>:指定作為計數器的記憶體變數或數組元素。在執行FOR…ENDFOR語句之前,此記憶體變數或數組元素不一定存在。<初始值>TO<終值>:<初始值>是計數器的初始值,而<終值>是計數器的終止值。[STEP<步長>]:是計數器遞增或遞減的步長。如果<步長>是負值,則計數器遞減;如果省略STEP子句,計數器每次遞增1。<語句序列>:指定要執行的VFP命令,它可以包含任意數量的命令。2024-8-1238[EXIT]:將控制權交給緊接在ENDFOR後面的命令。可以在FOR與ENDFOR之間的任何地方放置EXIT。[LOOP]:將控制權直接交給FOR子句,不再執行LOOP與ENDFOR之間的語句。計數器正常遞增或遞減,就像執行到ENDFOR子句一樣。可以在FOR與ENDFOR之間的任何地方放置LOOP。說明:可以用記憶體變數或數組元素作為計數器,指定FOR…ENDFOR迴圈中VFP命令的執行次數。在遇到ENDFOR或NEXT之前,始終執行FOR後面的VFP命令。執行過程中,每迴圈一次,計數器都會產生一次計數,計數增量由<步長>值控制,然後把計數器的值與<終值>進行比較,決定是否進行下一次迴圈。【例5-9】求1到100中偶數的和AA=0FORII=2TO100STEP2 AA=AA+IIENDFOR?AA螢幕顯示為:25502024-8-1239(3)基於表的迴圈命令
格式:SCAN[<範圍>][FOR<條件>][WHILE<條件>] [<語句序列>] [LOOP] [EXIT] ENDSCAN參數描述:[<範圍>]:指定對當前表中記錄掃描的範圍。只有在範圍之內的記錄才有可能掃描到。SCAN命令的默認範圍為ALL。[FOR<條件>]:只有條件運算式的計算結果為“真”的記錄,才能對其執行命令。包含FOR子句可以篩選出不想掃描的記錄。[WHILE<條件>]:指定一個邏輯運算式作為執行命令的條件,只要邏輯運算式計算為“真”,就對記錄執行命令,直到遇到使運算式不為“真”的記錄為止。[<語句序列>]:指定要執行的VFP命令集。2024-8-1240[LOOP]:把控制權直接交給SCAN子句。LOOP子句可以放在SCAN和ENDSCAN之間的任何地方。[EXIT]:把控制權力從SCAN…ENDSCAN迴圈語句交給ENDSCAN下麵的命令。EXIT子句可以放在SCAN和ENDSCAN之間的任何地方。ENDSCAN:標誌SCAN過程的結束。說明:SCAN命令自動將記錄指針移到下一條滿足條件的記錄,並執行相應的命令塊。【例5-10】逐條顯示STUDENT表中男生的情況。USESTUDENTSCANFOR性別=”男”
DISP WAITENDSCANUSE或者使用下列代碼:
USESTUDENTSCAN IF性別#”男”
LOOP ENDIFDISP WAITENDSCANUSE2024-8-12413、使用過程和自定義函數
(1)副程式和過程的調用副程式或過程的編寫和修改方式與一般的程式一樣,不同的是過程的最後一個語句必須是返回語句(RETURN),調用過程的程式是主程序,過程可以嵌套,即一個副程式可以再調用其他副程式,但不能形成迴圈嵌套。副程式或過程的調用也是用DO命令:格式:DO<過程名>[IN<程式檔案名>][WITH<參數表>]
功能:執行過程名所指定的副程式。WITH用於主程序和副程式間參數的傳遞。參數描述:
<過程名>:指定要執行的過程名稱。VFP首先在當前執行的程式中查找此過程,如果在該程式中找不到此過程,VFP就在用SETPROCEDURE命令打開的過程檔中查找此過程,如果還未找到,則以反向調用順序在當前打開的其他程式檔中查找此內2024-8-1242內部過程;若仍未找到,則在磁片上檢索以.FXP為擴展名的外部過程;若還未找到,最後檢索以.PRG擴展名的外部過程,並把它編譯為.FXP檔。在執行一個可執行檔或應用程式中,多個過程可以有相同的過程名。當使用DO去啟動一個可執行檔或一個應用程式的過程時,VFP只在可執行檔或應用程式的主程序中搜索指定的過程。IN<程式檔案名>:執行<程式檔案名>指定的程式檔中的一個過程。當找到該檔時就執行該過程。如果找不到該程式檔,就會顯示“檔不存在”的資訊。如果找到了程式檔,但指定的過程不存在,就會顯示“找不到過程”的資訊。[WITH<參數表>]:指定要傳遞給程式或過程的參數。列在<參數表>中的可以是運算式、記憶體變數、字母和數字、字段或用戶自定義函數。默認情況下,參數按引用傳遞給程式和過程,也可以將參數放在括弧中按值傳遞。傳遞給程式或過程的參數的最大數目為27。2024-8-1243(2)副程式或過程的返回語句
格式:RETURN[<運算式>/TOMASTER/TO<過程名>]
功能:將程式控制權返回給調用程式。參數描述:
[<運算式>]:指定返回給調用程式的運算式。如果省略RETURN命令或省略返回運算式,則自動將“真”返回給調用程式。[TOMASTER]:將控制權返回給最高層的調用程式。[TO<過程名>]:將控制權返回給指定的過程。說明:RETURN終止程式、過程或函數的運行,並將控制權返回給調用程式、最高次調用程式、另一個程式或窗口。當執行RETURN命令時,VFP釋放PRIVATE(專用)類型的記憶體變數。通常,RETURN放在程式、過程或函數的末尾,用來將控制返回給高層的程式。但是,如果省略RETURN命令,一個隱含的RETURN命令也將被執行。2024-8-1244副程式或過程調用及返回示意圖
【例5-11】計算圓面積的主程序為MYMAIN.PRG,副程式為MYSUB.PRG*MYMAIN.PRGCTALK=SET("TALK")SETTALKOFFCLEARSTORE0TORR,AREA2024-8-1245DOWHILE.T.INPUT"請輸入圓的半徑:"TORR DOMYSUBWITHRR,AREA ?"圓的面積是:",AREA WAIT"還要繼續計算嗎(Y/N)?"TOANSWER IFUPPER(ANSWER)="Y" LOOP ELSE EXIT ENDIFENDDOSETTALK&CTALK
*MYSUB.PRGPROCEDUREMYSUBPARAMETERSR,SS=PI()*R^2RETURN}以一個獨立的檔形式存在2024-8-1246(3)過程檔的建立
在實際的程式設計中,需要調用的過程不是一個或二個,而是幾個、十幾個甚至上百個,這就有可能使打開的檔數超過系統允許打開的檔數,而且將導致磁片目錄過於龐大,使系統調用檔的速度降低,程式執行速度也隨之下降,因而有必要將若干個過程按一定的規定放在一個大檔中,這個檔稱為過程檔。1)過程檔的建立命令格式與建立程式檔一樣:格式:MODIFYCOMMAND<過程檔案名>
過程檔的格式要求每個過程檔的開頭必須用下列語句:格式:PROCEDURE<過程名>
功能:標明是一個過程。參數描述:<過程名>:指定過程名稱。命名方法與檔案名的命名方法相同。2024-8-1247過程檔的內容如下:
PROCEDURE<過程名1><語句序列1>RETURNPROCEDURE<過程名2><語句序列2>RETURN……PROCEDURE<過程名N><語句序列N>RETURN說明:在一個過程檔中可以包含多個過程,在同一個過程檔中不允許出現相同的過程名,如果有相同的過程名,則只有第一次出現的過程才有被調用的可能。一個過程檔中最多允許包含128個過程。2)過程檔的調用過程檔和表檔一樣,都是在先打開後才能使用。①過程檔的打開命令
格式:SETPROCEDURETO<過程檔案名>
在主程序中應先打開過程檔,將過程檔中的所有過程都調入2024-8-1248記憶體(打開一個過程檔只算打開了一個檔)當過程檔不再用時應將其關閉,以節省記憶體空間。系統允許打開一個過程檔,當打開另一個過程檔時,先已打開的過程檔系統會自動將其關閉。【例5-12】程式中常用到計算圓面積、長方形面積、階乘等,現將它們編為三個過程,放在一個過程檔(MYPROCED.PRG)中,被主程序MYMAIN.PRG調用。*MYMAINCLEARTEXT這是一個計算圓面積、長方形面積、階乘等的程式,先輸入功能選擇:1--計算圓面積;2--計算長方形面積;3--計算階乘;4--退出。再輸入參數:所有數據之間用逗號","分隔。如計算長方形面積則在下面的提示資訊後面輸入2,10,15。ENDTEXTCTALK=SET("TALK")SETTALKOFFSETPROCEDURETOMYPROCEDDOWHILE.T.ACCEPT"請輸入您的功能選擇及參數:"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"輸入的參數錯誤,請重新輸入!"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③遞歸調用在過程中不但可以調用另外一個過程,而且還可以調用自己,這就叫遞歸調用。【例5-13】求一個30以內的自然數的階乘。*MYMAIN.PRGCTALK=SET("TALK")SETTALKOFFSETPROCEDURETOMYSUBINPUT“請輸入一個30以內的正整數:”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將程式定義為過程或函數
返回2024-8-12535.3.1對任務進行說明
開始解決問題之前,需要將其說明清楚。有時調整問題的說明方式會有助於問題的解決。假設從不同的數據源獲得一批數據,其中大部分是數值型數據,但有些數據中,除包含數字字元外,還夾雜著一些虛線和空格。現在需要從字段中清除這些虛線和空格,並將所得到的數字型數據加以保存。可以按如下方式說明需要這個程式達到的目的,而不是簡單地立即著手從原始數據中除去空格和虛線。目標——用新值替換字段中的原值,新值包含原值中除空格和虛線以外的所有內容。這種說明方式的優點在於避免在處理長字串時遇到的困難。5.3.2分解問題
因為最終是以操作、命令和函數的方式將具體的指令提供給VFP6,所以需要將問題分解為多個獨立的步驟。在本問題中,最容易分離出來的方法是在字串中逐個掃描字元,只有將單個字元分離出來才能解決是否應該保存它。返回2024-8-1254在掃描字元的時候,將檢查它是否為虛線和空格。到了這一步也許想要更詳細地說明這個問題,括弧之後的數據應該如何提取,貨幣符號、逗號和句號該如何消除等一系列問題將出現在大腦中。代碼越通用,為將來節省的時間就越多,問題在於如何做到事半而功倍。下麵給出一個比從前適用範圍更廣的問題說明方式。精煉的目標——用原始數據中的數值型字元更新字段值。這便是在字元的層次上重新說明問題。如果字元是數值則保留,否則將指針移向下一個字元。當用原始字串中的數值重新構成一個只包含有數值元素的新串時,用這個新串替換掉原來的字串。如此迴圈,直到將所有記錄中的數據全部更新。概括起來,全部問題可以分解成以下一些模組:■逐個檢查字元;■判斷該字元是否為數值;■若是數值,則將其複製到新串中;■檢查完字串的全部後,用只含數字的新串替換原串;■重複上述步驟,直到表中的全部記錄都被更新。返回2024-8-12555.3.3編制模組
清楚了要達到的目標以後,便可以開始用VFP6的命令、函數和操作符構造各模組。因為命令和函數是用來處理數據的,所以需要一些數據來測試其功能。這些用於測試的數據應與實際數據儘量相近。例如,在命令窗口中輸入如下命令,將一個測試字串賦值給變數:cTest=”123_456_789_0”1、逐個檢查字元首先,用SUBSTR()函數(子字串截取函數)在字串中逐個字元截取檢查。?Substr(cTest,1,1)?Substr(cTest,4,1)?Substr(cTest,10,1)?Substr(cTest,11,1)
輸出結果:1-(空格)82024-8-1256
也可以使用迴圈結構多次重複執行相同的操作。因為用以測試的字串有固定的字元數(15),即使在表的記錄中這個字段的長度不是定長,也能夠使用FOR迴圈命令。因為FOR迴圈的計數器每執行一遍增1,因此,可以在SUBSTR()函數中使用該計數器。所以可以編寫一個示例程式:FORII=1TO15 ??SUBSTR(cTest,II,1)ENDFOR將此程式保存為L508.PRG後運行運行結果123_456_789_02、判斷字元是否為數字從字串中分離出單個字元之後便可以判斷它是否為數字。在命令窗口中輸入如下命令:?ISDIGIT(“2”)
運行結果.T.?ISDIGIT(“_”)?ISDIGIT(SUBSTR(cTest,10,1))
.F..F.2024-8-12573、若字元為數值,將它複製到新串中既然可以逐一檢查字元是否為數值,下麵可以使用記憶體變數來保存該數字。為了創建一個變數,需要給它賦一個初值——一個零長度的字串。cNumbVar=””因為FOR迴圈掃描整個字串,所以最好用一個變數暫存每次分離出來的字元以便處理。cCharacter=SUBSTR(cTest,II,1)提示:在計算、求值以及在函數中得到的結果,最好保存在內存變數中,這樣便於直接處理這些變數而不必重新計算或求值。可以使用以下代碼將每個被確認為數字的字元添加到新串中: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程式運行結果
輸出似乎是正確的,但在測試模組過程中改變被測試字串將出現問題。如在命令窗口中執行下一條命令後再運行這部分代碼將出現問題:
cTest=”123_456_789ab0”
程式運行結果123_456_789ab0123456789123_456_789_01234567890因為FOR迴圈只執行15次,而被測試字串的長度有16個字元。2024-8-1259對於可變長字串需要用另外的辦法。能否有一種方法,讓FOR迴圈知道被測試字串的長度?迴圈次數由被測試字串的長度來決定?事實上VFP提供了一個函數LEN()可以檢測字串的長度。如果將它放在FOR迴圈命令中,那麼程式在上述兩種情況下都能很好地運行。cNumbVar=””FORII=1TOLEN(cTest) cCharacter=SUBSTR(cTest,II,1) IFISDIGIT(cCharacter) cNumbVar=cNumbVar+ccharacter
ENDIFENDFOR?cTest?cNumbVar程式運行結果123_456_789ab01234567890在命令窗口中執行下一條命令後再運行這部分代碼cTest="123_456_789ab0cd1e23"程式運行結果123_456_789ab0cd1e231234567890123返回2024-8-12605.3.5組裝全部模組
若要完善此程式,則要從表中讀取數據。在對表進行操作時,需要逐條掃描記錄,針對表中記錄的字段而不是變數進行操作。為了說明此步驟,先將STUDENT表中的“學號”字段的值進行修改後作為一個測試用表,修改後的STUDENT表中數據如圖5-9所示:圖5-9測試用數據
在對字段中的字串進行處理後,目的並不是要將結果保存在內存變數中,而是要將處理後的值用來替換原來字段中的值。要對字段的值進行替換,前面已經講過可以用REPLACE命令:2024-8-1261REPLACE學號WITHcNumbVar在將此條語句加入到程式中後,因為這個程式的功能目前還只是對當前一條記錄的“學號”字段進行處理,而不是對表中所有記錄同時進行處理,這離要求還差一步。通過前面講到的要對表中的記錄進行全部或部分記錄進行處理時,可以使用基於表的迴圈命令SCAN…ENDSCAN命令。將這些進行組裝時要注意,因為前面的程式是基於記憶體變數編寫的,現在是要將這些代碼用於對表中記錄進行處理,為此要將原字串變數名cTest改為表中的字段名“學號”,最後的程式如下:SCAN cNumbVar=”” FORII=1TOLEN(學號)
cCharacter=SUBSTR(學號,II,1) IFISDIGIT(cCharacter) cNumbVar=cNumbVar+ccharacter
ENDIF ENDFOR REPLACE學號WITHcNumbVarENDSCAN返回2024-8-12625.3.6整體測試
完成全部代碼之後,在處理實際數據之前,必須用示例數據進行測試。運行此程式時,如果當前工作區中沒有表打開,此程式將要求先打開一個表,如果先將STUDENT表打開後再運行此程式,則此程式可正常運行。程式運行後螢幕顯示的結果如圖5-9所示:圖5-10運行程式測試後STUDENT表中的部分數據
到此,程式設計基本完成,但為了使程式更可靠,需要進行下麵的改進工作。返回2024-8-12635.3.7提高程式的可靠性
所謂可靠的程式是指一個程式不僅能夠完成設計的功能,還可以預料到可能發生的錯誤並進行排錯處理。上面的程式包含有二個假設,只有滿足了這兩個條件,程式才能正常運行。這兩個假設是:在當前目錄中有STUDENT表,或者有一個打開的表;同時,STUDENT表中有“學號”字段,或者當前工作區中打開的表中有“學號”字段。如果事先指定打開表,就會限制程式的使用範圍,最好的辦法是在運行程式時,由用戶根據情況決定打開哪個表。下麵是改進後的程式,它具備了預料並排除錯誤的功能:ACCEPT“請輸入要處理的表檔案名”TOTABNAMESRLtableOK=.F.&&此變數確定程式正常運行的條件之一是否成立。
&&初始值為.F.,假設條件不成立。LfieldOK=.F.&&此變數確定程式正常運行的另一條件是否成立。TABNAME=””&&定義一個變數用於保存表檔案名IFAT(“.”,TABNAMESR)=0 TABNAME=TABNAMESR+”.DBF”&&使輸入的檔案名帶有擴展名2024-8-1264ENDIFDOWHILE.T.
IFFILE(TABNAME)
&&判斷所輸入的檔案名是否存在。
USE(TABNAME)&&打開所輸入的表檔
LtableOK=.T.&&將表的標誌置為“.T.”
EXIT&&跳出循環體
ELSE
=MESSAGEBOX(“當前目錄中沒有所輸入的表檔!”,64,”表名錯誤!”)
USE?&&顯示“打開”對話框,重新選擇表
IFUSED()&&判斷是否將一個表打開
EXIT &&若有表打開也跳出循環體
ENDIF ENDIFENDDO*這部分代碼檢查當前表的每一個字段,直到發現有一個名為“學號”的字段,*發現該字段存在後,設置LfieldOK為.T.,同時執行EXIT命令跳出循環體,*否則LfieldOK變數仍為.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將程式定義為過程或函數
可以將刪除字串中非數字字元的程式代碼轉換成為函數,使其運行更可靠。所建立的函數返回字串中的所有數字字元。【例5-15】刪除字串中非數字字元示例過程:FUNCTIONNUMBERONLY(CMIXEDVAL)cNumbVar=””FORII=1TOLEN(CMIXEDVAL) cCharacter=SUBSTR(CMIXEDVAL,II,1) IFISDIGIT(cCharacter) cNumbVar=cNumbVar+ccharacter
ENDIFENDFORRETURNcNumbVarENDFUNCSCAN REPLACEFIELDNAMEWITHNUMBERONLY(FIELDNAME)ENDSCAN或者,可以更簡單地寫為:REPLACEALLFIELDNAMEWITHNUMBERONLY(FIELDNAME)
除了可以使用戶在許多條件下使用這些代碼之外,函數還提高了程式的可讀性。如果要對一個已打開表的某個字段使用該功能,可以運行下列代碼:返回2024-8-12675.4面向對象的程式設計技術5.4.1面向對象應用程式示例5.4.2類的概念5.4.3對象和方法5.4.4類的封裝、繼承和多態性
退出5.4.5類的操作方法返回2024-8-12685.4.1面向對象應用程式示例
設計一組記錄定位按鈕。使用定位按鈕組來允許用戶在表中移動記錄指針,其中典型的便是在表中上移或下移一條記錄,或者移向表的首記錄或尾記錄。因為所有的應用程式中用到的定位按鈕組都有一些共同的特點和動作,所以創建一個定位按鈕類是一個好方法。在此之後,便可以很容易地從這些共同的外觀和功能中派生出所需要的命令按鈕組。在本實例中,首先進行構建定位按鈕類的父類(NAVBUTTON類),再創建子類定義四種定位按鈕的特定功能和外觀。這四個按鈕為:NVATOP、NAVPRIOR、NAVNEXT和NAVBOTTOM。最後,創建VCR容器類,每一種按鈕都被加入到容器類中。如果該容器可以加到表單或工具欄中,就可以用來向表單提供表中記錄的定位功能。第1步、構建定位按鈕父類。若要創建父類NAVBUTTON,要2024-8-1269
將如下六個類定義(NAV_BUTTON、NAVTOP、NAVPRIOR、NAVTEXT、NAVBOTTOM和VCR)保存到一個程式檔中。*通用定位按鈕父類的定義DEFINECLASSNAVBUTTONASCOMMANDBUTTON&&定義定位按鈕的父類HEIGHT=25
&&給類設置大小屬性WIDTH=75TABLEALIAS=””&&使用TableAlias自定義屬性來保存需要進行定位操作的表別名。&&若設置了TableAlias,父類過程在子類定位代碼執行以前選擇有該別名的表。&&否則,將假定用戶需要對當前工作區中的表進行定位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&&創建控件發生點擊事件所執行的方法程式代碼
DODEFAULT()&&調用父類Navbutton的Click事件代碼,
&&以便當TableAlias屬性設置之後,可以選擇適當的別名。
GOTOP&&包含將記錄指針移向首記錄的代碼:GoTop THIS.REFRESHFORM ENDPROC&&點擊過程結束。ENDDEFINE
&&類定義結束。說明:調用父類的RefreshForm方法程式,沒有必要使用域操作符(::)、因為在子類中沒有與父類中此方法程式重名的方法程式,但父類和子類中都有Click事件的方法程式代碼。2024-8-1271*NEXT定位按鈕類的定義DEFINECLASSNAVNEXTASNAVBUTTON&&定義Next定位按鈕類
CAPTION=”下一條”&&設置Caption屬性
PROCEDURECLICK&&定義Click事件代碼
DODEFAULT()&&執行父類的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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 抚顺师范高等专科学校《国际贸易实务实验》2023-2024学年第二学期期末试卷
- 郑州旅游职业学院《结构力学》2023-2024学年第二学期期末试卷
- 烟台市龙口市2025年五下数学期末考试试题含答案
- 教育产品销售部员工培训
- 护理不良事件安全课件
- 电缆过水施工方案
- 信息技术 第二册(五年制高职)课件 9.3.4 智能翻译系统
- 信息技术 第二册(五年制高职)课件 8.3.2 自定义函数
- 江苏省镇江市丹阳市2024-2025学年高一下学期3月月考化学试题(含答案)
- 收费站收费员业务知识解答
- 校服采购投标方案(技术标)
- 儿童压力性损伤评估量表与预防措施
- 高中数学开放题赏析
- 品质部工作计划
- 《浙江省工业建设项目用地控制指标》(修订)
- 微生物课件(老师版) 1.流感病毒
- 旅行社运营实务电子课件 2.3 办理旅游交易手续
- 屁股-也许是最重要的学习器官-主题微班会
- 市政工程施工工期定额(定稿)
- 2023年大学生《思想道德与法治》考试题库附答案(712题)
- 检验检测机构开展新检验项目建议审批表
评论
0/150
提交评论