




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
第6章表單設計
6.1創(chuàng)建表單6.2容器和控件6.3數(shù)據(jù)環(huán)境6.4屬性窗口6.5添加新的屬性和方法6.6單文檔界面與多文檔界面
6.7表單設計范例6.8類的設計6.9典型的表單設計6.10消息對話框6.1創(chuàng)建表單 6.1.1利用表單向?qū)?chuàng)建表單 本節(jié)以學生成績管理系統(tǒng)中的學生成績表xscj為例(見表6.1),介紹采用表單向?qū)Э焖賱?chuàng)建表單的過程。表6.1學生成績表xscj的結(jié)構(gòu) 1.表單向?qū)? 表單向?qū)且粋€引導用戶用填表和選取選項的方式創(chuàng)建表單的工具。表單向?qū)г谄溥\行過程中,給用戶提供了了比較詳細的中文提示,用戶只要按照提示的說明就可以完成相應的操作。因此,表單向?qū)У氖共⒉焕щy。利用表單向?qū)?chuàng)建表單的步驟如下: (1)
在VisualFoxpro主菜單中,選擇“文件”菜單中的“新建”命令(即選取“文件”/“新建”),彈出“新建”對話框;在“新建”對話框中選擇“表單”單選按鈕,并單擊“向?qū)А卑粹o(見圖6-1),彈出“向?qū)нx取”對話框,見圖6-2。圖6-1“新建”窗口圖6-2“表單向?qū)А贝翱? (1)
在“向?qū)нx取”框中選取“表單向?qū)А保ㄒ妶D6-2)并單擊“確定”按鈕。 (2)
按圖6-3所示在“表單向?qū)А睂υ捒蛑兄付ㄓ糜诒韱蔚臄?shù)據(jù)源(數(shù)據(jù)庫和表),然后進行表單字段的選取操作,在本例中數(shù)據(jù)源選取c:\vfplx\xscj.dbf并將該表所有可用字段都選入到“選定字段”框中。接著單擊“下一步”按鈕。圖6-3選取表單的數(shù)據(jù)源 (4)按圖6-4所示在“表單向?qū)А睂υ捒蛑羞x擇表單樣式和表單按鈕類型。單擊“樣式”框中的樣式名時,對話框左上方的放大鏡中會顯示出相應樣式的例子;表單按鈕類型則利用“按鈕類型”單選按鈕進行選擇,其中“文本按鈕”表示只在按鈕上顯示文字名稱,“圖片按鈕”表示在按鈕上顯示圖標;接著單擊“下一步”按鈕進入步驟3。圖6-4選取表單樣式和表單按鈕類型 按圖6-5所示在“表單向?qū)А睂υ捒蛑羞x擇記錄排序所依據(jù)的字段和記錄的排序方式。最多可以選取3個字段來決定該表中所有記錄的排序,排序方式則有升序或降序兩種選擇。在本例中選取“xh”學號字段作為記錄的排序標識,排序方式則選升序,即按照學號的升序排序來顯示記錄。接著單擊“下一步”按鈕。圖6-5選擇記錄排序所依據(jù)的字段和記錄的排序方式 (6)
按圖6-6所示在“表單向?qū)А睂υ捒蛑羞x擇保存表單的方式,建議選擇“保存表單并在表單設計器用進行修改”。在存儲之前單擊“預覽”按鈕可以對設計的表單進行預覽,最后單擊“完成”按鈕。圖6-6選擇保存表單的方式 在通過回答表單向?qū)У膯栴}所生成的表單中,含有一組標準的記錄定位按鈕,這組按鈕可用以在表單中顯示不同的記錄(第一個、前一個、下一個、最后一個)、編輯記錄、添加記錄、刪除記錄和查找記錄等,見圖6-7。圖6-7利用表單向?qū)гO計的表單
2.快速生成表單 本小節(jié)仍以學生成績管理系統(tǒng)中的學生成績表xscj為例(見表6.1),介紹使用快速生成表單方法創(chuàng)建表單的過程。 (1)
選擇“文件”菜單中的“新建”菜單項,彈出“新建”對話框。 (2)
在“新建”對話框中,選擇“表單”單選按鈕并單擊“新建表單”按鈕,進入表單設計器。 (3)
選擇“表單”/“快速表單”菜單項,彈出表單生成器(如圖6-8所示)。 (4)
在表單生成器中選取數(shù)據(jù)源C:\vfplx\xscj.dbf,并選取該表的全部字段;然后,單擊“確定”按鈕即可生成一個新表單。 新生成表單的界面類似于圖6-7中所示的表單。圖6-8表單生成器 3.一對多表單向?qū)? 本節(jié)在根據(jù)學生成績表xscj.dbf和學生表xs.dbf兩張表,用一對多表單向?qū)韯?chuàng)建表單。這兩張表通過字段“xh”建立關聯(lián)。 學生表xs.dbf的數(shù)據(jù)(庫結(jié)構(gòu))如表6.2所示,學生表xs.dbf的記錄數(shù)據(jù)內(nèi)容如圖6-9所示。表6.2學生表xs.dbf的庫結(jié)構(gòu)圖6-9學生表記錄內(nèi)容 學生成績表xscj.dbf的表結(jié)構(gòu)見表6.1,數(shù)據(jù)內(nèi)容如圖6-10所示。圖6-10學生成績表記錄內(nèi)容 使用一對多表單向?qū)У牟僮鞑襟E如下: (1)
選擇“文件”/“新建”,彈出“新建”對話框。 (2)
在“新建”對話框中,選中“表單”單選按鈕,單擊“向?qū)А卑粹o,打開“向?qū)нx取”對話框,在其中選取“一對多表單向?qū)А保ㄒ妶D6-11)并單擊“確定”按鈕。 (3)
在“一對多表單向?qū)А敝?,首先指定一個表作為一對多表單的父表(本例為學生表xs.dbf),然后進行字段選取(見圖6-12),接著單擊“下一步”按鈕。圖6-11向?qū)нx取圖6-12指定父表并選取字段 (4)
在“一對多表單向?qū)А敝校付ㄒ粋€表作為一對多表單中的子表(本例為學生成績表xscj.dbf),然后選取所需字段并單擊“下一步”按鈕。 (5)
在圖6-13所示的“一對多表單”向?qū)е校蓚€表的關聯(lián)關系,VisualFoxpro默認設置是以兩個表中字段名相同的字段建立關聯(lián)。在本表單中,學生表和學生成績表關聯(lián)字段為“xh”學號。 (6)
在“一對多表單”向?qū)е?,選擇表單樣式和按鈕類型。 (7)
在“一對多表單”向?qū)е校x擇記錄排序所依據(jù)的字段和記錄的排序方式,最多可選取三個字段。選定以“xh”字段的升序排序。圖6-13建立表之間的關聯(lián)關系 (8)
在“一對多表單向?qū)А敝羞x擇保存表單的方式,存儲之前單擊“預覽”按鈕進行預覽。最后單擊“完成”按鈕。本例完成的一對多表單如圖6-14所示。圖6-14一對多表單運行情況 在圖6-14所示的表單中,上半部分對學生表記錄進行維護,下半部分對學生成績表記錄進行維護,表單中顯示的是同一個學生的信息,即以“xh”學號字段為關聯(lián)字段,學生表和成績表的內(nèi)容保持同步。這里要注意,必須以學生表做為父表,成績表做為子表,兩者不能前后顛倒,否則顯示的內(nèi)容不全。 之所以要提出上述要求的原因是在學生表中每個學生單獨生成一條記錄,而在成績表中同一個學生在一學期中可能有多門課程,即同一個學生會有多條記錄來記載多門課程的成績情況。學生表中的“xh”學號字段與成績表中的“xh”學號字段建立關聯(lián),但兩者的關系是1:N(一對多)的關系。
6.1.2使用表單設計器創(chuàng)建表單 1.建立表單 要新建立一個表單,可以通過以下幾種方法來完成: (1)
選擇“文件”下拉菜單的“新建”按鈕。 (2)
選擇主窗口工具欄中的“新建”命令按鈕。 (3)
打開“項目管理器”,選擇“文檔”/“表單”,點擊“新建”按鈕。 (4)
打開“命令窗口”,輸入窗體創(chuàng)建命令CreateForm[<表單名>]。 通常在創(chuàng)建一個表單時,表單設計窗口的界面由四個窗口組成,這四個窗口分別是表單設計器、表單控件、布局和調(diào)色板(見圖6-15)。圖6-15表單設計界面 通過在表單中添加功能強大、豐富多彩的控件,不用或只用少量代碼就能夠得到賞心悅目的用戶界面。設計時,只要在“表單控件”工具欄中選擇控件,然后將其拖放至表單設計器中合適的位置就可以把該控件對象添加到表單上。這一過程充分體現(xiàn)了面向?qū)ο缶幊碳夹g(shù)的靈活性,也反映了可視化編程技術(shù)的強大能力。 2.使用工具欄 設計表單時要使用“表單控件”工具欄所提供的控件,“表單控件”工具欄如圖6-16所示。在表6.3中詳細介紹“表單控件”工具欄上各控件的具體功能。圖6-16“表單控件”工具欄表6.3“表單控件”工具欄上的控件表略 “表單設計器”工具欄如圖6-17所示。在表6.4中顯示了“表單設計器”工具欄各控件的功能。圖6-17“表單設計器”工具欄表6.4“表單設計器”工具欄上的控件6.2容器和控件 VFP把所有的控件分為容器和控件兩大類型。容器類控件是能夠包含其他控件的控件。如“命令按鈕組”(CommandGroup)可以包含“命令按鈕”(CommandButton),所以“命令按鈕組”是容器類控件。一般的控件不能包含其他控件。VFP中的容器又分為表單容器(含表單集容器)和基容器兩種。表6.5顯示了表單容器和其包含的不同對象。表6.6顯示了基容器和其包含的不同對象。表6.5表單容器及其包含的對象表6.6基容器及其包含的對象 6.2.1容器層次中引用(訪問)對象 1.絕對引用 如圖6-18所示,F(xiàn)ormSet1是一個表單集對象,F(xiàn)orm1是包含在FormSet1中的一個表單對象,Text1和Group1則是包含在Form1中的文本框和選項按鈕組的對象,Opt1和Opt2又是包含在Group1中的選項按鈕對象。其中,F(xiàn)ormSet1、Form1和Group1叫做容器對象,而Text1和Opt1、Opt2叫做控件對象。絕對引用表單集對象中的某個控件時,必須逐層指出各容器控件名和所引用控件的名如:
用絕對引用的方式來引用Text1對象:Formset1.Form1.Txt1 用絕對引用的方式來引用Opt2對象:Formset1.Form1.Group1.Opt2圖6-18對象在表單容器中的層次關系 2.相對引用 相對引用某個對象時,應該明確目標對象相對于當前對象的位置。表6.7是在容器層次中引用對象時的關鍵字和引用關系。表6.7關鍵字和引用關系 若在對象Txt1中要引用對象Group1,則可以使用以下語句: This.Parent.Group1 其中,This代表當前對象Txt1文本框,Thisform和This.Parent指表單對象Form1 同樣,若當前對象為選項框Opt1,要引用對象Txt1,則可以使用以下語句: This.Parent.Parent.Txt1 因為,Opt1包含于容器Group1中,而Group1包含于對象Form1中,故相對于Opt1的Form1為This.Parent.Parent。 6.2.2設置屬性 在程序設計的編程階段或運行階段均可以設置對象的屬性。對象的屬性可用命令方式設置,設置屬性命令的語法格式為:對象.屬性=值設置對象時,要根據(jù)屬性設置的不同位置選擇對象的絕對引用或相對引用方式。例如,要設置Opt2選項為不可見,可用以下命令: Thisformset.Form1.Group1.Opt2.Visible=.F. 若要設置同一個對象的多個屬性,可采用With……….Endwith結(jié)構(gòu)。如:
WithFormset1.Form1.Txt1 &&對Txt1文本框進行設置 .visible=.T. &&使Txt1文本框可視 .enabled=.T. &&使Txt1文本框可用 .backcolor=RGB(255,0,0) &&背景顏色為紅色 .alignment=2 &&文字對齊方式為居中 endwith 6.2.3調(diào)用方法 對象一旦建立之后,就可以在應用程序的任何一處調(diào)用此對象的方法。調(diào)用對象方法的語法是: 對象的絕對位置引用或相對位置引用.方法名稱 調(diào)用時,應根據(jù)屬性設置的不同位置選擇對象的絕對引用或相對引用。例如:要調(diào)用Show方法來顯示表單,可用: Formset1.Form1.show 如果在調(diào)用方法時,需要傳遞參數(shù),應該將參數(shù)用圓括號括起,并置于方法名稱后面。若調(diào)用方法后有返回值,那么,即使沒有參數(shù)傳遞,在方法名稱之后也要加上圓括號。如 This.Move(100,50) &&給方法傳遞參數(shù) This.Caption=Thisform.Getnewcaption()6.3數(shù)據(jù)環(huán)境 6.3.1設計數(shù)據(jù)環(huán)境 數(shù)據(jù)環(huán)境定義了表單或報表使用的數(shù)據(jù)源,包括表、視圖和關系。數(shù)據(jù)環(huán)境與表單或報表一起保存并可使用數(shù)據(jù)環(huán)境設計器進行修改。 定義表單或報表的數(shù)據(jù)環(huán)境之后,只要打開或運行該文件表單或報表文件,VisualFoxPro就會自動打開它的表或視圖,在關閉或釋放該文件時也會自動關閉該表或視圖。 對于表單或表單控件,VisualFoxPro把“數(shù)據(jù)環(huán)境”中的全部字段列在“屬性”窗口中,構(gòu)成ContronlSource屬性列表。 打開“表單設計器”后,可用以下方法打開數(shù)據(jù)環(huán)境設計器: (1)
選取“顯示”/“數(shù)據(jù)環(huán)境”; (2)
打開表單后右擊,并從彈出的快捷菜單中選擇“數(shù)據(jù)環(huán)境”。 這兩種方法實質(zhì)上完成的是同一個FoxPro命令。選擇“數(shù)據(jù)環(huán)境”之后,系統(tǒng)將顯示圖6-19所示的對話框。圖6-19數(shù)據(jù)環(huán)境設計器 用鼠標單擊“數(shù)據(jù)環(huán)境設計器”窗口可彈出一個菜單。表6.8給出了這個菜單中常用命令的意義。表6.8“數(shù)據(jù)環(huán)境設計器”彈出菜單中常用命令的意義 注意,在該彈出菜單中,“添加”和“移去”命令不會同時出現(xiàn)。 在單擊“數(shù)據(jù)環(huán)境設計器”窗口彈出的菜單中,除了表6.8所列的命令之外,還有“屬性”和“代碼”命令。這兩個命令可分別打開用以處理數(shù)據(jù)環(huán)境對象的數(shù)據(jù)“屬性”窗口和“代碼”窗口。常用的數(shù)據(jù)環(huán)境屬性見表6.9。表6.9“數(shù)據(jù)環(huán)境”常用屬性 6.3.2設置關系 關系是表與表之間的一種鏈接。通過建立表之間的鏈接,不僅可以訪問當前選定表中的數(shù)據(jù),而且還可以訪問其他表中的數(shù)據(jù)。這種鏈接實際上是一種連接條件。這里只介紹為數(shù)據(jù)環(huán)境設置關系的方法。 在數(shù)據(jù)環(huán)境設計器中的表如果具有在數(shù)據(jù)庫中設置的永久關系,這些關系就會自動地添加到數(shù)據(jù)環(huán)境中。如果表中沒有永久關系,可以在數(shù)據(jù)環(huán)境設計器中設置這些關系。
在數(shù)據(jù)環(huán)境設計器中設置關系時可采用直觀的拖動方式,即將字段從主表拖動到相關表中相匹配的索引標識上;也可以將字段直接從主表拖動到相關表中的字段上。如果相關表中沒有與之對應的索引標識,系統(tǒng)將提示是否創(chuàng)建該索引標識。在數(shù)據(jù)環(huán)境設計器中以“xh”學號字段建立了一個關系之后,在表之間將有一條連線指出這個關系,見圖6-20。圖6-20設置關系 在數(shù)據(jù)環(huán)境中將“學生表”和“學生成績表”分別選中,直接拖到表單中形成表格,表格的大小可以進行適當?shù)耐戏耪{(diào)整,表格中所有的數(shù)據(jù)源設置均采用系統(tǒng)缺省設置,其運行結(jié)果使兩表狀態(tài)信息保持一致。鼠標單擊學生表中任意一名學生,在學生成績表中就會顯示該學生的所有單科課成績內(nèi)容,見圖6-21所示。圖6-21利用數(shù)據(jù)環(huán)境生成的表 要編輯關系的屬性,應先選擇該關系(單擊線條即可),然后用鼠標右擊彈出快捷菜單,選擇“屬性”,使“屬性”對話框彈出。這時便可以進行屬性設置。 關系的屬性值對應于SETRELATION和SETSKIP命令中的子句。其中,屬性RelationalExpr的默認值被設置為主表中主關鍵字段的字段名。如果相關表以表達式作為索引,就必須將其RelationalExpr屬性設置為這個表達式。如果關系不是一對多關系,則必須將屬性OneToMany設置為“假”。這相當于使用SETRELATION命令時不發(fā)出SETSKIP命令。
如果關系是一對多關系,必須將關系的OneToMany屬性設置為“真”,相當于使用SETRELATION命令時,同時發(fā)出SETSKIP命令。瀏覽父表時,在瀏覽完表中所有相關記錄之前,記錄指針一直停留在同一記錄上。6.4屬性窗口 設計表單時一般要使用“屬性”窗口。例如,設計表單的整體布局時可在“屬性”窗口設置相關的屬性;執(zhí)行用戶指定的操作時可在“屬性”窗口里選中對應的事件,然后編寫方法代碼??傊凇皩傩浴贝翱谥锌梢酝瓿杀韱卧O計的絕大部分工作。 要顯示“屬性”窗口,可以在系統(tǒng)菜單上選擇“顯示/屬性”,或在“表單設計器”或“數(shù)據(jù)環(huán)境設計器”中單擊鼠標右鍵,并在快捷菜單中選擇“屬性”。圖6-22顯示了表單的“屬性”窗口。 根據(jù)所選的對象的不同,“屬性”窗口顯示的內(nèi)容也不盡相同?!皩傩浴贝翱诳偸悄J顯示與當前選定的對象,如表單、數(shù)據(jù)環(huán)境、表、關系或控件有關的屬性、事件和方法程序列表。在設計中或運行中都可以對屬性進行設置或更改。當選擇的對象多于一個時,“屬性”窗口顯示選定對象共有的屬性。 圖6-22顯示的“屬性”窗口頂部有一個對象下拉列表框,里面包含當前表單及在表單上的所有對象的名稱。可用這個下拉列表框選擇對應的對象。根據(jù)所選對象的不同,屬性窗口顯示的內(nèi)容就不同。例如圖6-22顯示的是表單Form1的“屬性”窗口。圖6-22表單的“屬性”窗口 在“屬性”窗口對象列表框的下面是一個頁框選項卡,其中共有5個選項頁,分別是“全部”、“數(shù)據(jù)”、“方法程序”、“布局”和“其他”,選中不同的選項頁窗口顯示的內(nèi)容也不同。各個選項頁的具體含義如下: 全部:顯示對象所有屬性的當前設置以及事件和方法程序的名稱; 數(shù)據(jù):顯示有關對象如何顯示或怎樣操作數(shù)據(jù)的屬性; 方法程序:顯示方法程序和事件; 布局:顯示所有的布局屬性; 其他:顯示其他特殊屬性,包括用戶自定義屬性。 有些屬性值是由用戶設定的一個值或一行文本,如設置Caption屬性時,屬性設置框的右側(cè)會出現(xiàn)一個文本框,允許用戶在其中輸入一個值或一行文本。如果輸入的是一個字符串,不必使用雙引號把字符串括起來,只需輸入字符串內(nèi)容即可。有些屬性如Autocenter的設置值是預定義好的。設置該屬性時,屬性設置框的右側(cè)出現(xiàn)一個下拉列表框,從中可選擇一個屬性值。 屬性設置框下面是屬性列表,里面列出了當前對象所有的屬性、事件和方法的當前默認設置值。有些屬性值以“斜體”顯示,如圖6-22的“BaseClass”屬性,表示用戶不能更改此屬性值。有些屬性值為黑體,則表示屬性值已經(jīng)設置為新值。 雙擊某一個屬性可更改該屬性值。默認情況下,事件或方法都以“[默認過程]”顯示,如果以對事件或方法編寫了程序代碼,顯示內(nèi)容則為“[用戶自定義過程]”。雙擊某一事件或方法時可彈出一個代碼編輯框,在編輯框里就可以為事件或方法編寫程序代碼了。 在屬性列表中單擊鼠標右鍵可彈出屬性的快捷菜單。使用這個快捷菜單能夠恢復屬性的初始值和打開當前位置上的屬性、事件或方法的幫助信息。在屬性設置框里更改屬性值以后,新的屬性值都將在屬性列表里以黑體顯示,以區(qū)別其他未更改的屬性值。同時在表單或表單對象上將反映出屬性修改的結(jié)果,這一點充分體現(xiàn)了可視化編程的魅力。6.5添加新的屬性和方法 每個表單及表單上的每個控件都有許多屬性、事件和方法。一般情況下,這些屬性、事件和方法已經(jīng)能夠滿足設計用戶界面的要求。但是,為了滿足一些特殊的需要,有時會希望增加一些自己定義的變量或函數(shù)。VisualFoxPro允許為控件添加新屬性和新方法,添加屬性或方法的數(shù)量不限,并可以像其他原有屬性或方法一樣使用。要注意的是不能為控件添加事件,因為事件是控件固有的動作,不能擴充。
要往表單添加新屬性或新方法,首先必須打開表單設計器,然后選擇系統(tǒng)菜單上的“表單”/“新建屬性”或“表單”/“新建方法程序”,屏幕就會出現(xiàn)一個對話框;在這個對話框里就可以為表單添加新屬性或新方法。圖6-23所示的對話框中就顯示了為表單添加的一個新屬性Add。圖6-23添加新的屬性 添加屬性時,在圖6-23所示對話框的“名稱”文本框里輸入新屬性的名稱,在說明框中可輸入對該的屬性注釋,注釋內(nèi)容可有可無。圖6-23中加入的是ADD屬性,這個屬性用于判斷表中記錄是否有新的添加操作。只要添加過記錄以后,表單內(nèi)所有過程中均可調(diào)用表單的新屬性ADD,屬性ADD將充當表單中全局變量的角色。 選中“Access方法程序”,可以為新屬性添加一個Access方法。當要查詢該屬性值或欲把該屬性值賦予一個變量時,系統(tǒng)將自動調(diào)用一個Access方法程序。按下“添加”按鈕就可以往表單里添加一個新屬性。在表單的“屬性”窗口的最底部可以看到新添加的屬性。
用戶自定義的函數(shù)可以作為新方法程序添加到表單內(nèi)。添加方法是,選擇系統(tǒng)菜單上的“表單”/“新建方法程序”,在彈出的“新建方法程序”對話框就可以添加新的方法。新添加的方法在屬性窗口里以“[默認過程]”顯示,雙擊該方法名可打開一個代碼編輯框進行程序設計。6.6單文檔界面與多文檔界面 VisualFoxPro創(chuàng)建的應用程序可分為多文檔界面應用程序與單文檔界面應用程序兩類。多文檔界面(Multiple-documentinterface,MDI)指一個應用程序?qū)嵗梢酝瑫r包含一個或多個文檔,它可以同時服務于一個用戶和一個或多個嵌入的容器。例如,VisualFoxPro本身基本上就是一個MDI應用程序,帶有包含于VisualFoxPro主窗口中的“命令”窗口,除此之外還可以同時打開編輯窗口和設計器窗口等其他類型的窗口。
單文檔界面(Single-documentinterface,SDI)指的是應用程序由一個或多個獨立的窗口組成,這些窗口均在Windows桌面上單獨顯示。MicrosoftExchange即是一個SDI應用程序的例子,在該軟件中打開的每條消息均顯示在自己獨立的窗口中。 由單個窗口組成的應用程序通常是一個SDI應用程序,也有一些應用程序綜合了SDI和MDI的特性。例如,VisualFoxPro將調(diào)試器顯示為一個SDI應用程序,而它本身又包含了自己的MDI窗口。為了支持這兩種類型的界面,VisualFoxPro允許創(chuàng)建以下3種類型的表單:
(1)
子表單(ChildForm):子表單包含在另一個窗口里,主要用于創(chuàng)建MDI應用程序的表單。子表單不能移動到父表單(主表單)顯示范圍之外。當子表單最小化時,它將顯示在父表單的底部。若父表單最小化,則子表單也一同最小化。 (2)
浮動表單(FloatingForm):屬于父表單(主表單)的一部分,但并不是包含在父表單里。浮動表單可用于創(chuàng)建MDI應用程序。與子表單不同的是,浮動表單可以移動到屏幕的任何位置,但不能在父窗口后臺移動。若浮動表單最小化,它將顯示在桌面的底部。若父表單最小化時,則浮動表單也一同最小化。 (3)
頂層表單(Top-levelForm):頂層表單和其他Windows應用程序同級,可出現(xiàn)在其前臺或后臺,并且顯示在Windows任務欄里。 這3種表單中有關屬性的具體設置如表6.10所示。表6.10設置3種類型的表單6.7表單設計范例 表單不僅提供給用戶一個用于查看、輸入和操作數(shù)據(jù)的接口,而且還包括了一個能適應用戶事件和系統(tǒng)事件的強有力的對象集。 VFP中,通常按以下步驟設計一個新的表單: (1)
設置表單屬性; (2)
添加適當?shù)目丶? (3)
設置控件的屬性; (4)
編寫事件的代碼。 在前面的章節(jié)中我們介紹了建立和操作表單的基本方法和步驟,不過在實際應用中通常會涉及到多個控件的使用和多種功能的操作。要掌握這些控件和功能的使用與操作,必須通過大量的實踐。本節(jié)將靈活應用前面的介紹的知識并對這知識進行總結(jié)。通過多種方法的綜合應用,幫助讀者掌握一定的面向?qū)ο蟪绦蛟O計的技巧,同時也可以了解和體會一個連貫而完整的表單設計思路和設計過程。 在開始一個表單的設計時,首先要進行表單界面的設計。表單界面的設計可以按其使用目的分為兩大類:與表內(nèi)容有關的數(shù)據(jù)操作界面設計和與表內(nèi)容無關的對話界面設計。本節(jié)主要討論第一種類型,即,與表內(nèi)容有關的數(shù)據(jù)操作界面設計,或稱表內(nèi)容的錄入界面設計。 表內(nèi)容錄入界面的外觀格式并沒有統(tǒng)一的規(guī)定,設計者可以根據(jù)需要和個人的喜好來確定。無論采用何種外觀,表內(nèi)容輸入界面都應完成一些基本的功能操作,包括記錄數(shù)據(jù)錄入、記錄數(shù)據(jù)的前后翻動、記錄數(shù)據(jù)的定位等。 表內(nèi)容輸入界面設計時主要應該考慮數(shù)據(jù)源、顯示數(shù)據(jù)的格式和交互操作的方式等方面的問題。具體來講,應該考慮: (1)
數(shù)據(jù)源:考慮涉及到哪幾個表、各表之間的關系、是否采用數(shù)據(jù)環(huán)境等問題; (2)
顯示數(shù)據(jù)的格式:選用何種格式布局、選用哪些控件對象等問題; (3)
交互操作的方式:用戶如何操作、選用哪些控件對象、事件觸發(fā)時事件代碼程序完成哪些操作、是否需要向表單中添加新的屬性和方法等問題。 下面,以一個單張表(學生成績表)的信息輸入界面設計為例,介紹采用不同的設計方法進行設計的過程。 學生成績表的信息輸入界面要求有以下四個功能: (1)
除數(shù)據(jù)輸入外,學生成績表具有只讀瀏覽功能; (2)
可以隨時添加記錄; (3)
可以取消當前的操作; (4)
可以隨時結(jié)束操作退出表單。 6.7.1設計方法一 1.確定界面效果 先進行分析并勾畫出要設計的“學生成績表”的界面,接下來逐步完善直至最終實現(xiàn)它。我們要設計的“學生成績表”的界面如圖6-24所示。圖6-24學生成績輸入表單外觀 2.創(chuàng)建表單的界面布局 創(chuàng)建表單的界面布局的步驟如下: (1)
選用一種方法,創(chuàng)建一個新表單并進入表單設計器; (2)建立數(shù)據(jù)環(huán)境。這張表單只涉及到一個“學生成績表”,只需將該表添加到數(shù)據(jù)環(huán)境中即可(見圖6-25)。利用數(shù)據(jù)環(huán)境可以省去對表的打開、關閉操作,向表單中添加的需要與數(shù)據(jù)源綁定的控件時,也可以直接得到控件的數(shù)據(jù)源缺省設置。對于初學者而言,這樣做就可以在少代碼或不寫代碼的情況下完成表單的設計操作; (3)
添加數(shù)據(jù)顯示控件,因為該表單主要用表格來顯示信息,因此最簡單的方法就是將數(shù)據(jù)環(huán)境中的“學生成績表”直接拖到表單中形成一個表格,見圖6-26所示。表格的位置、大小可以通過對該表格進行適當拖放操作來調(diào)整,表格中所有數(shù)據(jù)源設置均采用系統(tǒng)缺省設置。圖6-25添加數(shù)據(jù)環(huán)境圖6-26選中學生成績表拖放到表單中 (4)
添加交互式控件。在表單中有3個命令按鈕,使用“表單控件”工具欄向表單中添加3個命令按鈕(見圖6-27)。3個命令按鈕的位置及大小均可以進行適當?shù)耐戏耪{(diào)整或利用“布局”工具欄進行對齊。圖6-27向表單添加3個命令按鈕 (5)
為表單設置新的標題以覆蓋原有的缺省標題,打開表單“屬性”窗口,置表單的Caption值為“成績表數(shù)據(jù)輸入”,并且分別將3個命令按鈕的“屬性”顯示框中Caption值設置為“添加”,“取消”,“退出”(見圖6-28)。圖6-28設置Commond3按鈕的標題為“退出” 3.設置或添加表單中與操作有關的屬性 本表單要求具有對表中的記錄進行添加操作的功能,而且可以取消這一添加操作。要實現(xiàn)這一功能有許多方法和技巧,這里介紹一種新建表單屬性的方法。 該表單要隨時確定是否有添加操作以及所添加記錄的記錄號,以便在事件代碼中進行判斷和相應的處理。由于在每個事件中,變量若沒有特殊定義都只具有本地屬性(Local),在其他事件中不能調(diào)用本事件的變量。于是許多人想到用公用屬性(Public)來定義臨時變量,但公用屬性的變量可以在系統(tǒng)的任何一個模塊中使用,一旦使用不當,勢必將引起整個系統(tǒng)的混亂。 在此種情況下,我們選擇采用向表單添加新屬性的方法,即增添一個屬性變量,然后用這個屬性變量來充當本表單內(nèi)全局變量的角色。這樣既可以在表單的所有事件中引用新添加的屬性變量,又不會造成系統(tǒng)混亂。 在“學生成績表”表單中新增加屬性的步驟如下: (1)
選取“表單”/“新建屬性”(見圖6-29),打開“新建屬性”對話框。 在“新建屬性”對話框中分別添加兩個新屬性:判斷是否添加新記錄的操作變量ADD(邏輯型,缺省的數(shù)據(jù)值為邏輯假)和新添加記錄的記錄號R(數(shù)值型),見圖6-30。圖6-29選擇添加屬性選項圖6-30新屬性添加 4.編制與操作有關的事件代碼1)
編制數(shù)據(jù)環(huán)境的事件過程代碼 本例要求實現(xiàn)刪除新添加新記錄的操作。在VFP中,刪除操作分為物理刪除和邏輯刪除兩種。如果只使用邏輯刪除命令,可能會在數(shù)據(jù)表中留下許多廢記錄,這不利于表的有效管理。因此,在我們設計的系統(tǒng)中最終要物理刪除這些廢記錄,要用命令Pack除去打了刪除標記的記錄。由于VisualFoxpro是一個多用戶環(huán)境,而要使用Pack命令必須獨占表文件,也就是說在打開表文件時必須采用獨占方式。為此,我們在數(shù)據(jù)環(huán)境中打開表文件之前的事件(BeforeOpenTables事件)中設置表的打開方式,見圖6-31、圖6-32。圖6-31數(shù)據(jù)環(huán)境事件圖6-32數(shù)據(jù)環(huán)境事件過程代碼 2)編制表單的事件過程代碼 本例中要求除了添加記錄期間外,其他時間都只能以只讀方式瀏覽表內(nèi)容。實現(xiàn)時,可在添加記錄期間將表格的Readonly屬性設置為“假”,其他時間設置為“真”。為了有效地控制輸入和刪除,還要將表格的AllowAddNew屬性設置為“假”,以防止用戶按下光標鍵時自行添加記錄,將表格中的DeleteMark屬性設置為“假”,以防止用戶刪除記錄。所有上述屬性的設置都選擇在表單的Init事件中進行(見圖6-33,圖6-34)。在Form1的初始化事件Init()中,我們還對對象Grid1的屬性做了初始化,并為新添加的屬性Add和R分別賦上初始值。圖6-33表單的初始化事件(Init)圖6-34表單的初始化(Init)事件代碼 3)控件的對應事件編程 用戶的主要操作多數(shù)集中在控件對象中進行。在本設計中,有3個控件“添加”、“取消”,“退出”,可用于接受用戶的觸發(fā)事件。 當用戶單擊“添加”按鈕時,應實現(xiàn)記錄的添加操作,包括: (1)
將表格中Readonly屬性設置為“假”; (2)
向表中追加一個空記錄:Appendblank; 將表單屬性Add和R分別重新設置為“真”和Recno(); (1)
將輸入的焦點指向新添加的記錄的第一個字段上; (2)
刷新表單的數(shù)據(jù)(按新值顯示)。 對應的事件過程代碼見圖6-35。圖6-35“添加”命令按鈕的Click事件過程代碼 當用戶單擊“取消”按鈕時,應該實現(xiàn)刪除新添加記錄的操作,包括: (1)
根據(jù)表單屬性Add和R判斷是否為新添加的記錄,如果是則執(zhí)行刪除命令Delete將該記錄刪除; (2)
將表單屬性Add和R重新設置為.F.和0; (3)
判斷結(jié)束后,將表格中Readonly屬性設置為“真”; (4)
刷新表單數(shù)據(jù),使按新值顯示。 對應的事件過程代碼見圖6-36所示。 當用戶單擊“退出”按鈕時,應實現(xiàn)物理刪除記錄并做釋放表單的操作: (1)
執(zhí)行命令Pack; (2)
釋放表單。 對應的事件過程代碼見圖6-37。圖6-36“取消”命令按鈕的Click事件過程代碼圖6-37“退出”命令按鈕的Click事件過程代碼 5.運行及調(diào)試 設計結(jié)束后,將表單等存盤并開始運行調(diào)試。 這個表單可在表單設計器中直接運行(單擊常用工具欄中圖標),也可以退出表單設計器,在VisualFoxpro的命令窗口中用命令DoForm“文件名”來運行。在表單的運行過程中反復測試每個命令按鈕,直至完成該表單的全部功能都能順利完成。 6.7.2設計方法二 1.確定界面效果 按照題目的要求并依照前面介紹的考慮要點,經(jīng)過分析我們還可以勾畫出圖6-38所示的另一個“學生成績表”信息輸入表單。在本小節(jié)中,我們將設計實現(xiàn)這個表單。圖6-38學生成績表輸入界面 2.創(chuàng)建表單的界面布局 與上一小節(jié)中所設計的表單界面不同,本節(jié)要設計的表單界面中沒有使用表格,而是使用了多種控件來顯示信息。因此在本節(jié)中,表單界面設計的主要任務按要求加入不同的控件。具體設計步驟如下: (1)
任意選用一種方法,例如在“命令”窗口鍵入createformxssr4命令,進入表單設計器。 (2)
按設計方法一中的介紹步驟添加數(shù)據(jù)環(huán)境。
(3)
添加數(shù)據(jù)顯示控件:添加這些控件比較簡單的方法是直接選數(shù)據(jù)環(huán)境中“學生成績表”的對應字段并拖放到表單中。如果位置及大小不合要求,可進行適當?shù)耐戏耪{(diào)整,見圖6-39。所有控件數(shù)據(jù)源都采用系統(tǒng)缺省設置,以課程名為例,其顯示控件自動綁定數(shù)據(jù)源,見圖6-40所示。圖6-39數(shù)據(jù)環(huán)境中選定字段直接拖到表單中圖6-40課程名綁定控件數(shù)據(jù)源 (1)
添加交互操作控件。按圖6-38所示的位置,使用表單設計器中的“表單控件”工具欄向表單中添加5個命令按鈕。 (2)
設置表單或控件標題。為表單、顯示信息的控件和命令按鈕設置新的標題以覆蓋原有的缺省標題。設置標題的操作步驟與設計方法一中的相應步驟相同。只是增加了設置標題的字型屬性FontName和字號屬性FontSize的操作。 (6)修飾表單。在圖6-38中,我們看到5個命令按鈕被一個線框圍了起來。這個線框起到了一定的裝飾作用,同時對用戶操作也有一定的指導作用。使用表單設計器“表單控件”工具欄中的形狀控件Shape可以在表單中添加方框形狀(其屬性Curvature的值為0),方框的位置及大小可以進行適當?shù)耐戏耪{(diào)整(見圖6-41)。設計時有可能發(fā)現(xiàn)當將方框套在5個命令按鈕上之后,有時就看不到5個命令按鈕了,這時,只要選擇“格式”菜單中的“置后”選項,將方框置于命令按鈕后方,就可以再次看到這5個命令按鈕。圖6-41向表單中添加方框形狀 為了美觀起見,在設計時可以為線框添加一些立體效果。線框的不同效果是通過把線框的BorderStyle屬性、BorderWidth屬性和SpecailEffect設置為不同的值來實現(xiàn)的。其中BorderStyle屬性指定線框的樣式,如實線、虛線等,BorderWidth屬性指定線框的寬度,SpecailEffect屬性指定其不同格式,如平面或0~3維。一般情況下,將BorderStyle屬性設置為1,BorderWidth屬性設置為1,SpecailEffect屬性設置為0~3維即可達到線框的立體效果(見圖6-42)。圖6-42設置線框的立體效果 3.設置或添加與操作有關的屬性 (1)
添加屬性。與設計方法一中相應步驟相同,我們采用向表單中添加新屬性的方法將是否有添加操作的邏輯型屬性ADD和添加記錄的記錄號R(數(shù)值型)添加到表單中。新添加屬性的缺省值為邏輯型“假”,可以在屬性窗口中重新設置或在事件或方法過程代碼中重新設置這些屬性的值。 (2)
設置屬性。與設計方法一中相應步驟相同,其他不變的屬性都采用系統(tǒng)的缺省設置值,而在表單運行過程中要發(fā)生變化的屬性將在事件或方法過程代碼中設置。 4.編制與操作有關的事件過程代碼 1)編制數(shù)據(jù)環(huán)境的事件過程代碼 與設計方法一中的相應步驟相同,選用數(shù)據(jù)環(huán)境中的BeforeOpenTables事件實現(xiàn)獨占方式打開表(見圖6-43)。圖6-43編制數(shù)據(jù)環(huán)境的事件代碼 2)編制表單的事件過程代碼 由于題目要求除了在添加記錄期間外都以只讀方式瀏覽表內(nèi)容,因此在實現(xiàn)時,可以在添加記錄期間把表單中用于顯示數(shù)據(jù)控件的ReadOnly屬性設置為“假”,而其他時候設置為“真”。同時,我們還要為新添加的表單屬性設置初值。這些設置都在表單的Init事件中實現(xiàn)(見圖6-44)。圖6-44編制表單初始化的Init事件 3)編制控件的事件過程代碼 用戶的主要操作大多集中在控件對象上。在本表單中共設計了5個命令按鈕,用于接受用戶的觸發(fā)事件。當用戶單擊“添加”按鈕時,應該實現(xiàn)記錄的添加操作: (1)
將表單中用于顯示數(shù)據(jù)的文本框的ReadOnly屬性設置為“假”,并將“后翻”按鈕的Enable屬性為“假”,因為這時記錄指針已經(jīng)在最后一個記錄上了,應禁止向后翻頁操作; (2)
向表中追加一個空記錄:APPENDBLANK; (3)
將表單屬性ADD和R重新設置為“真”和RECNO()。 (4)
將輸入焦點指向新添加的記錄的第一個字段上。 (5)
刷新表單的顯示內(nèi)容,使其按新值顯示。 對應的事件過程代碼見圖6-45。圖6-45“添加”命令按鈕的Click事件代碼 當用戶單擊“取消”按鈕時,應該實現(xiàn)刪除添加記錄的操作。對應的事件過程代碼見圖6-46。圖6-46“取消”命令按鈕的Click事件代碼 當用戶單擊“退出”按鈕時,應該實現(xiàn)記錄的物理刪除操作并釋放表單: (1)
退出前判斷一下當前記錄的首字段是否無值,如果是,將其刪除,以確保表中信息的有效性; (2)
執(zhí)行PACK命令; (3)
釋放表單。 對應的事件過程代碼見圖6-47。圖6-47“退出”命令按鈕的Click事件代碼 當用戶單擊“前翻”按鈕時,應該實現(xiàn)記錄的向前翻頁操作: (1)
將表單中用于顯示數(shù)據(jù)的文本框的ReadOnly屬性設置為“真”,并將“后翻”按鈕的Enabled屬性設置為“真”,因為這時記錄指針已經(jīng)離開最后一個記錄,因此,允許向后翻頁操作; (2)
將表單屬性ADD和R重新設置為“假”和0; (3)
判斷記錄指針是否指到了表頭,如果不是,記錄指針向前跳一個記錄,否則,將當前按鈕(“前翻”按鈕)的Enabled屬性設置為“假”; (4)
刷新表單的顯示內(nèi)容,使其按新值顯示。 對應的事件過程代碼見圖6-48。圖6-48“前翻”命令按鈕Click事件代碼 當用戶單擊“后翻”按鈕時,應該實現(xiàn)記錄的向后翻頁操作: (1)
將表單中用于顯示數(shù)據(jù)的文本框的ReadOnly屬性設置為“真”,并將“前翻”按鈕的Enable屬性設置為“真”,因為這時記錄指針已經(jīng)離開首記錄,因此,允許向前翻頁操作; (2)
將表單屬性ADD和R重新設置為“假”和0; (3)
判斷記錄指針是否指到了表底,如果不是,記錄指針向后跳一個記錄,否則,將當前按鈕(“后翻”按鈕)的Enable屬性設置為“假”; (4)
刷新表單的顯示內(nèi)容,使其按新值顯示。 對應的事件過程代碼見圖6-49。圖6-49“后翻”命令按鈕的Click事件代碼 5.運行及調(diào)試 設計結(jié)束,將設計的表單存盤,然后分別進行運行、測試和調(diào)試等操作。運行后表單可以逐項進行測試,如前翻、后翻、添加、取消和退出。如果出現(xiàn)問題應該進行相應的修改并繼續(xù)調(diào)試直到運行成功。 6.7.3設計方法三 1.確定界面效果 按照題目的要求并依照前面介紹的考慮要點,經(jīng)過分析設計可以勾畫出如圖6-50所示的第三種“學生成績表”信息輸入表單。圖6-50學生成績表輸入界面 2.創(chuàng)建表單的界面布局 按和設計方法二類似的方法創(chuàng)建一個新的表單,然后再添加數(shù)據(jù)環(huán)境和相應的控件。在本設計中,表單的命令按鈕用命令按鈕組來實現(xiàn)。選中命令按鈕組后,單擊鼠標右鍵選中“生成器”,在彈出的“命令字組生成器”窗口中即可設置按鈕類型和布局(見圖6-51,圖6-52)。圖6-51設置命令按鈕組圖6-52“命令組生成器” 很多用戶在應用程序的操作過程中感到利用鼠標來選取按鈕的方式不太方便。為此,可以為每個按鈕設置一個快捷鍵。所謂快捷鍵就是為每個按鈕指定一個字母,操作時使用鍵盤中Alt鍵再加上按鈕對應的字母鍵就可以選中該按鈕。 設置快捷鍵的方法是在為控件設置標題時,在標題的尾部加上“\<”符號,再輸入一個字母即可。例如圖6-52中,“添加”命令按鈕的標題內(nèi)容為“添加\<A”,則用戶按下Alt+A組合鍵和用鼠標單擊“添加”命令按鈕兩者執(zhí)行相同的操作。另外,為了讓用戶知道如何使用快捷鍵,可在表單最后一行添加一個標簽,用于快捷鍵操作提示。表單界面的設計效果如圖6-53所示。圖6-53完成設計后表單內(nèi)的控件 3.設置與操作有關的屬性 不變的屬性都采用系統(tǒng)的缺省設置值,而在表單運行中要發(fā)生變化的屬性,將在事件或方法過程代碼中設置。 4.編制與操作有關的事件過程代碼 1)編制數(shù)據(jù)環(huán)境中的事件代碼 操作與前面介紹的相應步驟相同,代碼見圖6-55。圖6-54數(shù)據(jù)環(huán)境中事件代碼 2)
編制表單的事件過程代碼 表單的Init事件用于處理最初在表單中顯示的數(shù)據(jù),由于最初表單顯示的內(nèi)容是表中首記錄數(shù)據(jù)。故應該使命令按鈕“首記錄”和“前翻”按鈕不可選。表單Init事件的代碼見圖6-55。圖6-55表單的Init事件代碼
3)編制控件的事件過程 由于采用了中一個帶7個按鈕的命令按鈕組,因此,編制命令按鈕操作代碼時,可選用命令按鈕組(Commandgroup1)的單擊Click事件,不必逐個編制每個命令按鈕的單擊事件代碼。命令按鈕組的單擊事件過程代碼如下: Docase Casethis.value=1 &&用戶單擊第一個命令按鈕(“添加”) Appendblank This.cmdfirst.enabled=.T. &&將組中“首記錄” 和“后翻”命令設置為可操作
This.cmdnext.enabled=.T. Thisform.txtxh.Setfocus &&學號字段獲得焦點,即光標位于該字段 Casethis.value=2 &&用戶單擊“刪除”命令按鈕 Delete If!eof() Skip Else &&記錄指針到文件尾,“尾記錄”和“后翻”命令不能操作 Thisform.cmdprevious.enabled=.F. Thisform.cmdlast.enabled=.F. Endif Casethis.value=3 &&用戶單擊“退出”命令按鈕 Ifempty(Thisform.txtxh.value) &&退出前發(fā)現(xiàn)學號字段為空,做邏輯刪除 Delete Endif Pack &&物理刪除已經(jīng)被邏輯刪除的全部記錄 Thisform.release() Casethis.value=4 &&用戶單擊“首記錄”命令按鈕 Gotop &&記錄指針指向首記錄 This.cmdfirst.enabled=.F. &&“首記錄”、“前翻”命令按鈕不可操作 This.cmdprevious.enabled=.F. This.cmdlast.enabled=.T. &&“尾記錄”、“后翻”命令可操作 This.cmdnext.enabled=.T. Casethis.value=5 &&用戶單擊“尾記錄”命令按鈕 Gobottom &&記錄指針指向尾記錄 This.cmdlast.enabled=.F. &&“尾記錄”、“后翻”命令不可操作 This.cmdnext.enabled=.F. This.cmdprevious.enabled=.T. &&“首記錄”、“前翻”命令按鈕可操作 This.cmdfirst.enabled=.T. Casethis.value=6and!bof() &&單擊“前翻”而且記錄指針沒有到文件頭 Skip–1 Ifbof()&&記錄指針到文件頭,“首記錄”、“前翻”命令按鈕不可操作 This.cmdprevious.enabled=.F. This.cmdfirst.enabled=.F. Endif This.cmdnext.enabled=.T. This.cmdlast.enabled=.T. CaseThis.value=7and!eof() &&單擊“后翻”而且記錄指針沒有到文件尾 Skip Ifeof() &&記錄指針到文件尾,“尾記錄”、“后翻”命令按鈕不可操作 This.cmdlast.enabled=.F. This.cmdnext.enabled=.F. Endif This.cmdprevious.enabled=.T. This.cmdfirst.enabled=.T. Endcase Thisform.refresh 考慮到實際記錄指針移動操作中命令按鈕之間存在一定的制約關系,故在上述代碼中每次記錄指針移動操作都詳細考慮了命令按鈕組中7個按鈕的可選或不可選性,充分體現(xiàn)了面向?qū)ο蟪绦蛟O計邏輯思維嚴謹?shù)娘L格。 5.運行及調(diào)試 設計結(jié)束后將設計的表單存盤,然后分別進行運行、測試和調(diào)試等操作。表單的運行情況見圖6-56,圖6-57所示。測試時,可逐項進行測試,如首記錄、尾記錄、前翻、后翻、添加、刪除和退出等。圖6-56單擊“首記錄”按鈕或按下Alt+F
組合鍵時的運行情況圖6-57單擊“添加”按鈕或按下Alt+F
組合鍵時的運行情況6.8類的設計 6.8.1類的創(chuàng)建 在VisualFoxpro中,創(chuàng)建類的具體步驟如下: (1)
打開項目管理器,選擇項目管理器中的“類”選項頁。 (2)
單擊項目管理器的“新建”按鈕,開始創(chuàng)建新的類。 (3)
在彈出“新建類”對話框中(見圖6-58),設置要創(chuàng)建的子類的名稱以及其父類來源,并設置存放該類的可視類庫文件名稱。我們在設計一個新類時,要以一個已存在的類作為基礎,這個已存在的類就是父類,而我們自己創(chuàng)建的類就稱為子類。注意,子類可以繼承父類的所有功能并做新的擴充。圖6-58“新建類”窗口
在圖6-58所示“新建類”對話框的“派生于”框中指定父類為CommandGroup(命令按鈕組),在“類名”框中指定新建類為“記錄移動”,這個新建類保存在C:\vfplx\記錄移動.vcx文件中。 我們新建的這個“記錄移動”類中要實現(xiàn)的功能為向前、向后移動記錄指針或?qū)⒂涗浿羔樢苿拥绞子涗?、尾記錄。在具體程序設計中,可以直接引入創(chuàng)建的新類,使得移動記錄操作的設計變的方便、快捷。 (4)單擊“確定”按鈕,彈出類設計器。在類設計器中,選中新建的“記錄移動”類并用鼠標右鍵單擊,彈出快捷菜單(如圖6-59所示)。在快捷菜單選中“屬性”命令,然后,在“屬性”窗口中,把“記錄移動”類的Buttoncount屬性值修改為4(見圖6-60)。圖6-59類設計器窗口及快捷菜單圖6-60“記錄移動”類的“屬性”窗口 (5)
修改類設計器中4個命令控件的控件名、標題名,并按圖6-61所示調(diào)整它們的顯示布局。圖6-61調(diào)整控件布局 (1)
編寫控件的事件代碼。 “首記錄”按鈕的Click事件中完成的操作包括: §
將記錄指針移到第一條記錄; §
使“前翻”按鈕變灰失去作用,這是因為記錄指針跳到第一條記錄后,在其前方已經(jīng)沒有前一條記錄; §
將“后一條記錄”按鈕設置有效,以解決以下操作問題:若在此之前先前按下“尾記錄”按鈕后并使“后翻”按鈕變灰,那么在按下“首記錄”按鈕后,應該使“后一條記錄”按鈕恢復為有效狀態(tài)(Cmdnext.enabled=.T.)。
§
對整個表單對象或子對象進行更新操作。 “首記錄”按鈕的Click事件代碼如下: gototop this.parent.cmdprevious.enable=.F. this.parent.cmdnext.enable=.T. thisform.refresh 在“前翻”按鈕的Click事件中應完成以下操作: §
向前移動一條記錄; §
判斷當前記錄指針是否到了文件頭,若是,彈出一個對話框提示用戶原先記錄已經(jīng)是第一條記錄,而且使“前翻”按鈕變灰;若不是,使“前翻”按鈕有效,允許用戶繼續(xù)查看上一條記錄;
§
設置“后翻”按鈕有效; §
對整個表單對象或子對象進行更新操作。 在“前翻”按鈕的Click事件代碼如下: skip–1 ifbof() =messagebox("已經(jīng)是第一個記錄!",48,"操作提示") this.enabled=.F. else this.enabled=.T. endif this.parent.cmdnext.enabled=.T. thisform.refresh “后翻”按鈕的Click事件代碼為: skip ifeof() =messagebox("已經(jīng)是最后一條記錄了",48,"操作提示") skip–1 this.enabled=.F. else this.enabled=.T. endif this.parent.cmdnext.enabled=.T. thisform.refresh “尾記錄”的按鈕的Click事件的代碼為: gobottom this.parent.cmdnext.enabled=.F. this.parent.cmdprevious.enabled=.T. thisform.refresh 這樣就創(chuàng)建了一個新類“記錄移動”,下面介紹在表單設計中如何調(diào)用這個類。 6.8.2類的調(diào)用 新建表單,打開表單設計器并添加數(shù)據(jù)環(huán)境,把數(shù)據(jù)環(huán)境中表的相應字段拖到表單中。打開“表單控件”工具欄,單擊圖標后添加新建的記錄移動類庫。當?shù)诙未蜷_表單控件工具欄后,新建的類庫“記錄移動”就顯示在屏幕上(見圖6-62)。單擊“記錄移動”控件的圖標并拖到表單中,就生成一個現(xiàn)成的單表記錄定位的表單(見圖6-63)。圖6-62添加新建的“記錄移動”類圖6-63利用新建類創(chuàng)建的表單6.9典型的表單設計 6.9.1隨機抽獎程序 在電視中我們??吹接嬎銠C隨機抽獎活動,主持人在電腦鍵盤上按下一個鍵,屏幕中出現(xiàn)一串滾動的隨機數(shù)字,再按下一個鍵屏幕中就出現(xiàn)了一組激動人心的幸運數(shù)字。接下來就產(chǎn)生一個新的幸運星……。下面我們以隨機抽獎程序為例介紹典型表單的設計。 隨機抽獎程序最終要完成設計的操作界面如圖6-64所示。圖6-64計算機隨機抽獎程序 隨機抽獎程序抽出的中獎號碼為5位(0~9)阿拉伯數(shù)字。在程序執(zhí)行時的初始界面中按下“開始”按鈕后,5個文本框中隨機滾動0~9共十個阿拉伯數(shù)字,按下鍵盤中的空格鍵產(chǎn)生第一位幸運數(shù)字,后4個文本框中仍然隨機滾動數(shù)字,再按下鍵盤中的空格鍵就可以產(chǎn)生第二位幸運數(shù)字,后3個文本框仍然隨機滾動數(shù)字,依次操作下去……,直到產(chǎn)生最后一個幸運數(shù)字,并在屏幕中醒目顯示該組幸運數(shù)字。
1.表單的設計 在我們要設計的表單中使用以下控件對象:使用5個文本框text1、text2、……text5來顯示數(shù)字;使用2個標簽lable1和lable2來提示操作方法;使用2個命令按鈕command1和command2和1個計時器對象timer1。 2.對象的屬性、方法和事件設置 在設計或運行時,將表單的標題屬性caption設置為“祝您中獎”并且將表單的最大化屬性maxbutton和最小化屬性minbutton設為“假”,2個命令按鈕的標題屬性設置為“開始”和“退出”,將text1和text5等5個文本框的顯示字體顏色為紅色,這樣使得演示的數(shù)字格外醒目。 在表單中新鍵5個屬性,屬性名稱分別為score1,score2,score3,score4,score5作為Public變量存儲產(chǎn)生的5個數(shù)字,它的作用域貫穿于本應用程序的所有事件或過程。 在表單中新建5個ROLL過程并分別命名為ROLL1(),ROLL2(),ROLL3(),ROLL4(),ROLL5()。ROLL()過程通過隨機函數(shù)rand使文本框中的數(shù)字隨機動態(tài)滾動,等待用戶鍵入“空格鍵”后產(chǎn)生一個幸運數(shù)字并且將該數(shù)字賦值給新建的屬性score。 隨機函數(shù)rand的使用格式為:rand(<數(shù)值表達式>)。該函數(shù)返回一個0~1.0之間的隨機數(shù)。如果<數(shù)值表達式>是個負數(shù),由系統(tǒng)時鐘產(chǎn)生一個隨機“種子”。為了獲得真正的隨機序列,可以在使用該函數(shù)之前,先執(zhí)行語句:=rand(-1)作為種子隨機數(shù)產(chǎn)生器。另外,在ROLL()過程中使用text(i).value=int(10*rand()),在文本框中顯示數(shù)字0~9。當用戶鍵入“空格鍵”(空格鍵的ASCII碼值為32),則產(chǎn)生一個幸運數(shù)字,退出當前的過程。 ROLL1()過程的代碼如圖6-65所示,ROLL2()~ROLL4()過程的代碼與之類似。圖6-65表單中的ROLL1()過程代碼 最后一個幸運數(shù)字由ROLL5()過程產(chǎn)生。在ROLL5()過程中還要把計時器的Interval間隔時間設置為0,將Score1~Score5的數(shù)值轉(zhuǎn)化成字符并組成一個字符串作為一組幸運數(shù)字,然后通過Messagebox消息框?qū)⑦@組數(shù)字顯示給用戶并向他(她)表示祝賀!ROLL5()過程的代碼如圖6-66所示。圖6-66表單中的ROLL5()過程代碼 為了使表單執(zhí)行過程中文本框內(nèi)數(shù)字能夠快速顯示而不產(chǎn)生視覺上的停頓感,我們將計時器的Interval屬性設置為40(0.04秒),即每間隔0.04秒系統(tǒng)就會自動執(zhí)行Timer()事件,在Timer()事件中順序執(zhí)行Roll1~Roll5五個過程,見圖6-67。圖6-67計時器的Timer事件 “開始”命令按鈕Comand1和“結(jié)束”命令按鈕Command2分別用于開始和結(jié)束抽獎,對應的鼠標單擊事件如下: “開始”命令按鈕的單擊事件代碼: erval=40&&設置計時器的時間間隔為0.04秒 “退出”命令按鈕的單擊事件代碼: ifmessagebox(“你是否退出幸運大派送!”,4+32,“信息窗口”)=6 thisform.release else return endif &&在退出之前詢問用戶是否真正退出,若不是,則繼續(xù)運行,否則退出系統(tǒng) 抽獎結(jié)束后,用幸運號碼窗口顯示抽出的數(shù)字,見圖6-68。圖6-68產(chǎn)生幸運號碼窗口 6.9.2單張表的查詢 1.表單的設計 本例中設計一個對學生成績表c:\vfplx\xscj.dbf的記錄進行查詢的操作,查詢窗口界面的設計如圖6-69所示。在表單設計中共使用了4個標簽、2個文本框、1個列表框、1個表格等對象。 運行時,在查詢窗口左上角的文本框中輸入學生成績表的表名(c:\vfplx\xscj.dbf),應用程序在左下角的列表框中自動顯示全部字段;輸入查詢表達式后(例如,輸入“cj>80”查詢成績表中單課成績大于80分的學生成績),在右下角的Grid表格中顯示滿足查詢條件的所有記錄,見圖6-70所示。圖6-69表查詢窗口界面圖6-70查詢窗口實際運行效果 2.事件過程代碼 表單的Init事件過程代碼主要用于控制程序執(zhí)行后表單的初始化界面。在初始化界面中,先顯示列表框、列表框的標題,表格、表格的標題則不顯示,如圖6-71所示。Init事件的過程代碼如圖6-72所示。圖6-71運行時表查詢窗口的初始化界面圖6-72表單的Init事件代碼 文本框text1的Valid(驗證)事件用于對用戶輸入的表名進行自動判斷,若該表存在則自動顯示該表的所有字段名,否則不允許退出操作直到輸入正確的表名稱為止。 Valid事件代碼為: tablename=alltrim(this.value)&&取Text1的文本內(nèi)容賦值給全局變量tablename iffile("&tablename")&&判斷該文件是否存在 use(tablename) withthisform .label3.visible=.t. &&設置 Label3,label4,list1,grid1,label4,text2為可見 .list1.visible=.t. .grid1.visible=.t. .label4.visible=.t. .grid1.recordsource="" &&設置表格的數(shù)據(jù)源為空 .text2.text="" endwith fori=1tofcount() &&將表的所有字段名稱填入List1列表框 thisform.list1.additem(field(i)) endfor use return.t. else&&若表不存在給出一個消息提示框
messagebox("你輸入的表文件實際并不存在!",64,"操作提示") return.f.&&不允許退出Text1框,直至填入實際表才退出。 endif thisform.refresh 文本框text2的Valid事件控制用戶輸入查詢條件表達式后自動顯示表中經(jīng)過濾后的記錄等操作,過程代碼見圖6-73所示。查詢功能操作主要利用SQL語句來實現(xiàn),其格式為: select*from源表where查詢條件intocursor臨時表
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 湖南文理學院芙蓉學院《建筑材料學B》2023-2024學年第二學期期末試卷
- 中國計量大學《地方教學名師課堂》2023-2024學年第二學期期末試卷
- 撫順職業(yè)技術(shù)學院《感覺統(tǒng)合訓練》2023-2024學年第一學期期末試卷
- 河南醫(yī)學高等專科學?!稄V告理論與實務》2023-2024學年第二學期期末試卷
- 古代描寫英雄的詩句
- 公共交通車輛更新淘汰制度
- 第3課 “開元盛世”教案2024-2025學年七年級歷史下冊新課標
- 煙道伸縮節(jié)施工方案
- 2025年醫(yī)藥產(chǎn)業(yè)布局洞察:數(shù)據(jù)解析A股市場走勢與板塊表現(xiàn)
- 2025年鋼鐵渣行業(yè)發(fā)展現(xiàn)狀分析:我國鋼鐵渣產(chǎn)量約為1.53億噸
- 網(wǎng)評員隊伍培訓
- 光伏發(fā)電系統(tǒng)試運行管理制度(4篇)
- 建筑工程混凝土運輸方案
- 國殤屈原課件生字詞
- 2024社區(qū)工作者勞動合同
- 呼吸治療師進修匯報
- 老舊小區(qū)電梯更新改造方案
- 課件香港地理教學課件
- 2023年輔導員職業(yè)技能大賽試題及答案
- 2023年天津銀行招聘筆試真題
- 工程質(zhì)量控制流程圖
評論
0/150
提交評論