具有记忆功能的系统菜单实现方法谈

2015-05-29 12:26崔丽红
电脑知识与技术 2015年10期
关键词:实现方法

崔丽红

摘要:该文介绍了利用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)运行这个表单,使用“文件”菜单项下的“打开”菜单项打开一个任意文件后,我们可以发现当前打开的这个文件名就被加入到“文件”菜单项下,按文件被打开时间排序,打开时间最早的文件即排列在第一位的文件名称被移走,最后打开的这个文件名被列菜单项最后位置,这样我们看到系统中的菜单可以随时发生变化,按照这样的原理,就可以设计出丰富多采的菜单功能,有兴趣的读者不妨一试。

猜你喜欢
实现方法
学习方法
可能是方法不对
信息系统安全评价系统设计及实现
高校声像档案数字化管理的实现路径
办公室人员尚需制定个人发展规划
浅析铁路通信传输的构成及实现方法
用对方法才能瘦
四大方法 教你不再“坐以待病”!
赚钱方法
捕鱼