為FoxPro中的彈出式菜單增加自學(xué)習(xí)功能

字號(hào):

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