崔丽红
摘要:该文介绍了利用VFP编程实现具有记忆功能的系统菜单实现的方法。
关键词:系统菜单;记忆功能;实现;方法
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)10-0072-02
我们大家知道,在使用Microsoft Word编辑文档时,用户可以在文件菜单下看到,Word系统可以保存用户最近编辑过文档的文件名字信息,用户可以直接用鼠标选择打开某一文档,使用起来即方便又快捷。那么大家知道,利用VFP菜单生成器生成的菜单,系统编译后,菜单项将不能被改变,那么如果在VFP编写的应用程序中也实现这样的功能呢?其实只要巧妙的利用修改菜单程序,通过调用数据表中指定的字段中保存的文件位置信息,重新生成菜单程序文件即可实现这样的功能。编程思路:首先,利用菜单设计器设计菜单并生成一个扩展名为.mpr的菜单程序,然后直接修改生成的菜单程序,通过PROMPT()函数返回菜单栏中最近选定的菜单标题或菜单项文本,并保存到数据库中,最后通过表单调用该菜单,表单中的Show Window属性一定要设置为2-作为顶层表单,这样才可以调用菜单程序,下面介绍功能实现步骤:
1)新建一个项目文件,创建一个数据表名称为mylist.dbf,该表有两个字段文件名和时间,其中文件名字段为字符型,宽度可为256,时间字段为时间日期型,默认宽度。
2)利用VFP提供的菜单生成器设计生成一个包含“文件”和“帮助”两个菜单项的菜单,并为“文件”菜单项添加“打开”、“退出”两个菜单项,最后编译生成一个菜单文件程序,命名为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([只能从顶层表单调用该菜单。请设置表单的 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 &&设置字符精确比较
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属性设为2,在表单的LOAD事件中添加如下代码: DO Mymenu.mpr with this,.t. 5)运行这个表单,使用“文件”菜单项下的“打开”菜单项打开一个任意文件后,我们可以发现当前打开的这个文件名就被加入到“文件”菜单项下,按文件被打开时间排序,打开时间最早的文件即排列在第一位的文件名称被移走,最后打开的这个文件名被列菜单项最后位置,这样我们看到系统中的菜单可以随时发生变化,按照这样的原理,就可以设计出丰富多采的菜单功能,有兴趣的读者不妨一试。