開發(fā)過應(yīng)用系統(tǒng)的人都知道,使用FoxPro for Win-dows在用屏幕生成器進行數(shù)據(jù)窗口設(shè) 計的過程中,經(jīng)常要使用彈出式菜單(POPUP)來設(shè)計進行數(shù)據(jù)輸入的數(shù)據(jù)入口。彈出式菜單平 常在屏幕上只會顯示一個選項的內(nèi)容,當(dāng)您用鼠標(biāo)選擇它或按下空白鍵、ENTER鍵時,它就在 屏幕上出現(xiàn)一個窗口和一些供用戶選擇的選項。使用彈出式菜單有兩個方面的優(yōu)點:一個優(yōu) 點是用戶可以不在該數(shù)據(jù)入口中輸入數(shù)據(jù),而只需在該彈出項提供的有效選項中選擇一項即可;使用彈出式菜單的另一個優(yōu)點是它能保證數(shù)據(jù)輸入的有效性,由于用戶只限于從菜單彈出 的選項中選擇數(shù)據(jù),所以不會產(chǎn)生輸入錯誤。但是,我們在開發(fā)軟件的過程中發(fā)現(xiàn)彈出式菜單 存在一個缺點:就是當(dāng)彈出式菜單所彈出的選項不包括用戶所要輸入的數(shù)據(jù)時,則系統(tǒng)無法讓 用戶輸入正確的數(shù)據(jù)。本文所敘述的方法(以FoxPro 2.5 for Windows為例),就是為了改進 彈出式菜單的這一缺點,為彈出式菜單增加讓用戶輸入數(shù)據(jù)的功能,并能夠?qū)⒂脩糨斎氲臄?shù)據(jù)自動添加到彈出式菜單的選項中(即我們所說的自學(xué)習(xí)功能),以便用戶以后輸入數(shù)據(jù)時選擇 使用。
實現(xiàn)效果
我們可以在數(shù)據(jù)窗口中將一個數(shù)據(jù)入口定義為彈出式菜單(POPUP),并在該彈出式菜單的 相同位置上定義一個輸入字段(INPUT FIELD),該字段與彈出式菜單大小相同,其初始狀態(tài)為 Initially Disable Field,被彈出式菜單完全覆蓋。當(dāng)?shù)谝淮问褂迷搹棾鍪讲藛螘r,其彈出 的選項中只出現(xiàn)"其它"一項。如果用戶輸入數(shù)據(jù)時發(fā)現(xiàn)菜單彈出的選項中不包括所要輸入的 數(shù)據(jù),則可以選"其它"項。這時數(shù)據(jù)窗口中在彈出式菜單的位置上將出現(xiàn)一個輸入字段,并且該輸入字段可以把彈出式菜單完全覆蓋,用戶就可以在這個輸入字段上輸入新的數(shù)據(jù),輸入完 畢后該輸入字段將又被彈出式菜單覆蓋,屏幕上彈出式菜單顯示為剛輸入的內(nèi)容。用戶每次 在這個輸入字段中輸入的新數(shù)據(jù)(必須是原彈出式菜單的選項中沒有的)都將作為一個新的選 項加入到彈出式菜單的選項中,而選項中的"其它"項將始終是選項的最后一項。
實現(xiàn)方法
我們假設(shè)是為數(shù)據(jù)庫ab.dbf定義一個數(shù)據(jù)窗口ab.scx,數(shù)據(jù)庫ab.dbf中有一個字符型字 段aa,數(shù)據(jù)窗口ab.scx中將與aa字段相對應(yīng)的數(shù)據(jù)入口變量m.aa定義為彈出式菜單(POPUP), 其Array Popup的名為aalist。另為該彈出式菜單定義一個相對應(yīng)的輸入字段(INPUT FIELD ),其字段名為m.newaa。
(一)定義數(shù)據(jù)窗口ab.scx,選擇Screen/Layout后進入Screen Code,在
Screen Setup Co de中輸入以下程序段:
&& 該程序段的功能是初始化和生成數(shù)組aalist
PRIVATE m.popupedit, m.savrec, m.aacnt
m.popupedit = .F.
m.aacnt = 0
DIMENSION aalist[1]
m.savrec = RECNO()
GO
SCAN FOR NOT DELETED()
m.string = ALLTRIM(aa)&& 取字段內(nèi)容
IF NOT EMPTY(m.string) AND ASCAN(aalist
m.string) = 0
&& 確認(rèn)數(shù)組aalist中是否不包括該字段內(nèi)容
m.aacnt = m.aacnt + 1
IF m.aacnt > ALEN(aalist)
DIMENSION aalist[m.aacnt]
ENDIF
aalist[m.aacnt] = m.string && 把該字段內(nèi)容加入
到數(shù)組aalist中
ENDIF
ENDSCAN
DIMENSION aalist[m.aacnt]
= ASORT(aalist) && 為數(shù)組aalist排序
m.aacnt = m.aacnt + 1
DIMENSION aalist[m.aacnt]
aalist [m.aacnt] = "其它"&& 把"其它"項加入到數(shù)組aalist的最后一項
GOTO RECORD m.savrec
SCATTER MEMVAR MEMO BLANK
(二)在數(shù)據(jù)窗口ab.scx中定義一個彈出式菜單,進入Popup對話框,把該對話的Variab le欄定義為m.aa,Option欄中選Array Popup,并在該欄輸入數(shù)組名aalist。Clause欄中選Va lid項,輸入以下程序段:
&& 該程序段的功能是當(dāng)在彈出式菜單中選擇"其它"時,激活輸入字段m.newaa
IF m.aa = "其它"
m.popupedit = .T.
SHOW GET m.newaa ENABLE
_CUROBJ = OBJNUM(m.newaa)
ENDIF
(三)在數(shù)據(jù)窗口ab.scx中與彈出式菜單相同的位置上定義一個輸入字段(INPUT FIELD) ,并調(diào)整該字段的大小使其可以把彈出式菜單完全覆蓋。進入Field對話框后,在Field欄選I nput Field (Get)項,Options欄選In-itially Disable Field和Select Field on Entry兩 項,Input欄輸入m.newaa。Clause欄中選Valid項,然后輸入以下程序段:
IF EMPTY(m.newaa) OR ASCAN(aalist, m.newaa)<>0
RETURN .T.
ENDIF &&m.newaa為空或已存在于aalist中,則返回
= AINS(aalist,m.aacnt)
aalist[m.aacnt] = ALLTRIM(m.newaa)&&在aalist中插入新元素,其內(nèi)容為m.newaa
= ASORT(aalist)&& 為數(shù)組aalist排序
m.aacnt = m.aacnt+1
DIMENSION aalist[m.aacnt]
aalist[m.aacnt] = "其它"&& "其它" 項追加到數(shù)組aalist的最后
REPLACE aa WITH ALLTRIM(m.newaa) && 修改數(shù)據(jù)庫中的字段
m.newaa = ""
m.popupedit = .F.
SHOW GET m.newaa DISABLE
SHOW GET m.aa
(四)在數(shù)據(jù)窗口ab.scx中,選擇Screen/Object Order進入Object Order屏幕。在這個屏 幕中調(diào)整彈出式菜單m.aa與輸入字段m.newaa的排列順序,使得m.aa排列在m.newaa的前面,屏 幕顯示時m.aa就可以將m.newaa覆蓋。這樣,在輸入過程中先輸入m.aa,當(dāng)用戶在m.aa中選擇 "其它"項時,輸入字段m.newaa才顯示出來讓用戶輸入新的數(shù)據(jù)。
(五)在定義輸入字段m.newaa的過程中,應(yīng)在其Clause欄Valid項的程序段中,適當(dāng)加入一 些有關(guān)數(shù)據(jù)有效性校驗的命令,以保證輸入數(shù)據(jù)正確、有效。
實現(xiàn)效果
我們可以在數(shù)據(jù)窗口中將一個數(shù)據(jù)入口定義為彈出式菜單(POPUP),并在該彈出式菜單的 相同位置上定義一個輸入字段(INPUT FIELD),該字段與彈出式菜單大小相同,其初始狀態(tài)為 Initially Disable Field,被彈出式菜單完全覆蓋。當(dāng)?shù)谝淮问褂迷搹棾鍪讲藛螘r,其彈出 的選項中只出現(xiàn)"其它"一項。如果用戶輸入數(shù)據(jù)時發(fā)現(xiàn)菜單彈出的選項中不包括所要輸入的 數(shù)據(jù),則可以選"其它"項。這時數(shù)據(jù)窗口中在彈出式菜單的位置上將出現(xiàn)一個輸入字段,并且該輸入字段可以把彈出式菜單完全覆蓋,用戶就可以在這個輸入字段上輸入新的數(shù)據(jù),輸入完 畢后該輸入字段將又被彈出式菜單覆蓋,屏幕上彈出式菜單顯示為剛輸入的內(nèi)容。用戶每次 在這個輸入字段中輸入的新數(shù)據(jù)(必須是原彈出式菜單的選項中沒有的)都將作為一個新的選 項加入到彈出式菜單的選項中,而選項中的"其它"項將始終是選項的最后一項。
實現(xiàn)方法
我們假設(shè)是為數(shù)據(jù)庫ab.dbf定義一個數(shù)據(jù)窗口ab.scx,數(shù)據(jù)庫ab.dbf中有一個字符型字 段aa,數(shù)據(jù)窗口ab.scx中將與aa字段相對應(yīng)的數(shù)據(jù)入口變量m.aa定義為彈出式菜單(POPUP), 其Array Popup的名為aalist。另為該彈出式菜單定義一個相對應(yīng)的輸入字段(INPUT FIELD ),其字段名為m.newaa。
(一)定義數(shù)據(jù)窗口ab.scx,選擇Screen/Layout后進入Screen Code,在
Screen Setup Co de中輸入以下程序段:
&& 該程序段的功能是初始化和生成數(shù)組aalist
PRIVATE m.popupedit, m.savrec, m.aacnt
m.popupedit = .F.
m.aacnt = 0
DIMENSION aalist[1]
m.savrec = RECNO()
GO
SCAN FOR NOT DELETED()
m.string = ALLTRIM(aa)&& 取字段內(nèi)容
IF NOT EMPTY(m.string) AND ASCAN(aalist
m.string) = 0
&& 確認(rèn)數(shù)組aalist中是否不包括該字段內(nèi)容
m.aacnt = m.aacnt + 1
IF m.aacnt > ALEN(aalist)
DIMENSION aalist[m.aacnt]
ENDIF
aalist[m.aacnt] = m.string && 把該字段內(nèi)容加入
到數(shù)組aalist中
ENDIF
ENDSCAN
DIMENSION aalist[m.aacnt]
= ASORT(aalist) && 為數(shù)組aalist排序
m.aacnt = m.aacnt + 1
DIMENSION aalist[m.aacnt]
aalist [m.aacnt] = "其它"&& 把"其它"項加入到數(shù)組aalist的最后一項
GOTO RECORD m.savrec
SCATTER MEMVAR MEMO BLANK
(二)在數(shù)據(jù)窗口ab.scx中定義一個彈出式菜單,進入Popup對話框,把該對話的Variab le欄定義為m.aa,Option欄中選Array Popup,并在該欄輸入數(shù)組名aalist。Clause欄中選Va lid項,輸入以下程序段:
&& 該程序段的功能是當(dāng)在彈出式菜單中選擇"其它"時,激活輸入字段m.newaa
IF m.aa = "其它"
m.popupedit = .T.
SHOW GET m.newaa ENABLE
_CUROBJ = OBJNUM(m.newaa)
ENDIF
(三)在數(shù)據(jù)窗口ab.scx中與彈出式菜單相同的位置上定義一個輸入字段(INPUT FIELD) ,并調(diào)整該字段的大小使其可以把彈出式菜單完全覆蓋。進入Field對話框后,在Field欄選I nput Field (Get)項,Options欄選In-itially Disable Field和Select Field on Entry兩 項,Input欄輸入m.newaa。Clause欄中選Valid項,然后輸入以下程序段:
IF EMPTY(m.newaa) OR ASCAN(aalist, m.newaa)<>0
RETURN .T.
ENDIF &&m.newaa為空或已存在于aalist中,則返回
= AINS(aalist,m.aacnt)
aalist[m.aacnt] = ALLTRIM(m.newaa)&&在aalist中插入新元素,其內(nèi)容為m.newaa
= ASORT(aalist)&& 為數(shù)組aalist排序
m.aacnt = m.aacnt+1
DIMENSION aalist[m.aacnt]
aalist[m.aacnt] = "其它"&& "其它" 項追加到數(shù)組aalist的最后
REPLACE aa WITH ALLTRIM(m.newaa) && 修改數(shù)據(jù)庫中的字段
m.newaa = ""
m.popupedit = .F.
SHOW GET m.newaa DISABLE
SHOW GET m.aa
(四)在數(shù)據(jù)窗口ab.scx中,選擇Screen/Object Order進入Object Order屏幕。在這個屏 幕中調(diào)整彈出式菜單m.aa與輸入字段m.newaa的排列順序,使得m.aa排列在m.newaa的前面,屏 幕顯示時m.aa就可以將m.newaa覆蓋。這樣,在輸入過程中先輸入m.aa,當(dāng)用戶在m.aa中選擇 "其它"項時,輸入字段m.newaa才顯示出來讓用戶輸入新的數(shù)據(jù)。
(五)在定義輸入字段m.newaa的過程中,應(yīng)在其Clause欄Valid項的程序段中,適當(dāng)加入一 些有關(guān)數(shù)據(jù)有效性校驗的命令,以保證輸入數(shù)據(jù)正確、有效。

