崔麗紅
摘要:該文介紹了利用VFP編程實現(xiàn)具有記憶功能的系統(tǒng)菜單實現(xiàn)的方法。
關(guān)鍵詞:系統(tǒng)菜單;記憶功能;實現(xiàn);方法
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2015)10-0072-02
我們大家知道,在使用Microsoft Word編輯文檔時,用戶可以在文件菜單下看到,Word系統(tǒng)可以保存用戶最近編輯過文檔的文件名字信息,用戶可以直接用鼠標選擇打開某一文檔,使用起來即方便又快捷。那么大家知道,利用VFP菜單生成器生成的菜單,系統(tǒng)編譯后,菜單項將不能被改變,那么如果在VFP編寫的應用程序中也實現(xiàn)這樣的功能呢?其實只要巧妙的利用修改菜單程序,通過調(diào)用數(shù)據(jù)表中指定的字段中保存的文件位置信息,重新生成菜單程序文件即可實現(xiàn)這樣的功能。編程思路:首先,利用菜單設(shè)計器設(shè)計菜單并生成一個擴展名為.mpr的菜單程序,然后直接修改生成的菜單程序,通過PROMPT()函數(shù)返回菜單欄中最近選定的菜單標題或菜單項文本,并保存到數(shù)據(jù)庫中,最后通過表單調(diào)用該菜單,表單中的Show Window屬性一定要設(shè)置為2-作為頂層表單,這樣才可以調(diào)用菜單程序,下面介紹功能實現(xiàn)步驟:
1)新建一個項目文件,創(chuàng)建一個數(shù)據(jù)表名稱為mylist.dbf,該表有兩個字段文件名和時間,其中文件名字段為字符型,寬度可為256,時間字段為時間日期型,默認寬度。
2)利用VFP提供的菜單生成器設(shè)計生成一個包含“文件”和“幫助”兩個菜單項的菜單,并為“文件”菜單項添加“打開”、“退出”兩個菜單項,最后編譯生成一個菜單文件程序,命名為mymenu.mpr。
3)使用modi comm.命令直接打開mymenu.mpr文件,修改其中的程序代碼,使修改后的程序代碼如下:
LPARAMETERS oFormRef, getMenuName, lUniquePopups, parm4, parm5, parm6, parm7, parm8, parm9
LOCAL cMenuName, nTotPops, a_menupops, cTypeParm2, cSaveFormName
IF TYPE("m.oFormRef") # "O" OR ;
LOWER(m.oFormRef.BaseClass) # 'form' OR ;
m.oFormRef.ShowWindow # 2
MESSAGEBOX([只能從頂層表單調(diào)用該菜單。請設(shè)置表單的 ShowWindow 屬性為 2。])
RETURN
ENDIF
m.cTypeParm2 = TYPE("m.getMenuName")
m.cMenuName = SYS(2015)
m.cSaveFormName = m.oFormRef.Name
IF m.cTypeParm2 = "C" OR (m.cTypeParm2 = "L" AND m.getMenuName)
m.oFormRef.Name = m.cMenuName
ENDIF
IF m.cTypeParm2 = "C" AND !EMPTY(m.getMenuName)
m.cMenuName = m.getMenuName
ENDIF
DEFINE MENU (m.cMenuName) IN (m.oFormRef.Name) BAR
DEFINE PAD _13d0jjdhw OF (m.cMenuName) PROMPT "文件(\ KEY ALT+F, "" DEFINE PAD _13d0jjdhz OF (m.cMenuName) PROMPT "幫助(\ KEY ALT+H, "" ON PAD _13d0jjdhw OF (m.cMenuName) ACTIVATE POPUP 文件f ON SELECTION PAD _13d0jjdhz OF (m.cMenuName); DO phelp IN LOCFILE("mymenu" ,"MPX;MPR|FXP;PRG" ,"WHERE is MYMENU?") DEFINE POPUP 文件f MARGIN RELATIVE SHADOW COLOR SCHEME 4 DEFINE BAR 1 OF 文件f PROMPT "打開(\ KEY CTRL+O, "Ctrl+O" ; MESSAGE "打開已有文件" DEFINE BAR 2 OF 文件f PROMPT "\-" ON SELECTION BAR 1 OF 文件f DO pselect in mymenu.mpr with PROMPT() ACTIVATE MENU (m.cMenuName) NOWAIT DO pselect in mymenu.mpr with "MyInit" IF m.cTypeParm2 = "C" m.getMenuName = m.cMenuName m.oFormRef.Name = m.cSaveFormName ENDIF PROCEDURE phelp messagebox("歡迎測試使用功能",46,"幫助信息")
PROCEDURE pselect(mystr)
set exact on &&設(shè)置字符精確比較
do case
case mystr="打開(O)..."
myfile=getfile("TXT|PRG")
if !empty(myfile)
if !used("mylist")
use mylist
endif
select mylist
count to fileNo for !empty(mylist.文件名) and upper(alltrim(mylist.文件名))<>upper(alltrim(myfile))
if fileNo>0
select top 3 * from mylist ;
where !empty(mylist.文件名) and upper(alltrim(mylist.文件名))<>upper(alltrim(myfile)) order by 時間 DESC into array amylist
select mylist
replace 文件名 with space(0) all
go top
replace 文件名 with myfile,時間 with datetime()
for i=1 to alen(amylist,1)
select mylist
count to ifcz for upper(alltrim(文件名))= =upper(alltrim(amylist(i,1)))
if ifcz=0
go i+1
replace 文件名 with amylist(i,1),時間 with amylist(i,2)
endif
endfor
****加入菜單項***
select * from mylist where !empty(文件名) order by 時間 into array amylist
for i=1 to alen(amylist,1)
BarNo=i+2
define bar BarNO of 文件f PROMPT ("\<"+alltrim(str(i))+" "+alltrim(amylist(i,1)))
temp=alltrim(amylist(i,1))
on selection bar BarNo of 文件f modify File '&temp'
endfor
DEFINE BAR BarNo+1 OF 文件f PROMPT "\-"
DEFINE BAR BarNo+2 OF 文件f PROMPT "退出(\ ON SELECTION BAR BarNo+2 OF 文件f quit else select mylist go top replace 文件名 with myfile,時間 with datetime() define bar 3 of 文件f PROMPT (alltrim(myfile)) temp=alltrim(myfile) on selection bar 3 of 文件f modify File '&temp' DEFINE BAR 4 OF 文件f PROMPT "\-" DEFINE BAR 5 OF 文件f PROMPT "退出(\ ON SELECTION BAR 5 OF 文件f quit endif modify File &myfile. endif case mystr="MyInit" if !used("mylist") use mylist endif select mylist count to fileNo for !empty(mylist.文件名) if fileNo>0 select * from mylist where !empty(mylist.文件名) ; order by 時間 DESC into array amylist if alen(amylist)<>0 for i=1 to alen(amylist,1) BarNo=i+2 define bar BarNo of 文件f PROMPT ("\<"+alltrim(str(i))+" "+alltrim(amylist(i,1))) temp=alltrim(amylist(i,1)) on selection bar BarNo of 文件f modify File '&temp' endfor DEFINE BAR BarNo+1 OF 文件f PROMPT "\-" DEFINE BAR BarNo+2 OF 文件f PROMPT "退出(\ endif else DEFINE BAR 3 OF 文件f PROMPT "退出(\ ON SELECTION BAR 3 OF 文件f quit endif endcase endproc 4)新建一個表單名命為main,將該表單的ShowWindow屬性設(shè)為2,在表單的LOAD事件中添加如下代碼: DO Mymenu.mpr with this,.t. 5)運行這個表單,使用“文件”菜單項下的“打開”菜單項打開一個任意文件后,我們可以發(fā)現(xiàn)當前打開的這個文件名就被加入到“文件”菜單項下,按文件被打開時間排序,打開時間最早的文件即排列在第一位的文件名稱被移走,最后打開的這個文件名被列菜單項最后位置,這樣我們看到系統(tǒng)中的菜單可以隨時發(fā)生變化,按照這樣的原理,就可以設(shè)計出豐富多采的菜單功能,有興趣的讀者不妨一試。