菜单与工具栏(VFP)
(2011-11-17 11:15:49)
标签:
vfp菜单工具栏杂谈 |
分类: VFP笔记 |
菜单与工具栏(VFP)
(有关如何在程序运行过程中对菜单SKIP的控制,参见《成本管理系统》)
菜单SKIP
(以下以成本系统为例)
一)PAD SKIP
在设计菜单时设置。点击"输入(\<I)"后的OPTIONS,在弹出的对话框中作如下设置:
(注意,其中omybegin.nUSERlevel是进入系统的用户等级)
在菜单文件中将生成以下代码。(将扩展名为 MPR的菜单文件改为TXT扩展名,即可查看)
DEFINE PAD PAD01 OF (m.cMenuName) PROMPT "输入(\<I)" COLOR SCHEME 3 ;
二)菜单项(BAR)SKIP
(1)在程序任一地方都可控制某一个菜单项(BAR)的可用与否。如,要令“输入(\>I)”下的第一个菜单项不可用,可在程序任一地方加入以下语句:
SET SKIP OF BAR 1 OF 输入i .T.
注意 一)这里的 输入i ,
二) 菜单项(BAR)以序数标记,第一项为1,第二项为2,……以此类推
三)如将语中的SKIP改为MARK, 则在菜单项前打勾
(2)本系统SET SKIP OF BAR语句集中在过程文件MYPROC中,过程名为SETBARSKIP。在成本计算过程中,每计算一步(每计算完一张表),一般都应调用一次该过程(DO SETBARSKIP IN MYPTOC)。
工具栏按钮
有关工具栏的按钮制作参见《在VFP中制作浮动按钮》。
以下是有关工具栏按钮的具体使用:
工具栏中的按钮分两类:
A类按钮:一般仅有两个:计算器、退出系统。
退出系统按钮的CLICK事件中只有一条命令:QUIT。
对计算器按钮,我们要求:计算器不要重复打开。即:打开一个计算器后,计算器按钮变为灰色(不可用),关闭计算器后,计算器按钮恢复正常。实现方法:分别在计算器窗体的INIT和DESTRY事件中加入相应语句。
B类按钮:按下此类按钮将打开一个以本系统的数据库作为数据环境的窗体。
由于B类按钮与一个或多个表相关联,为避免重复打开同一个表,我们要求:按下一个B类按钮打开一个窗体后,所有B类按钮将变为灰色(不可用),同时有关菜单项也不可见。
以下,详述B类按钮实现上述功能的具体方法:
1)按《在VFP中制作浮动按钮》中所述方法制作按钮后,为各按扭命名。命名时注意:所有B类按钮NAME的前若干位应相同。(本例中,前三位均为“CNT”)。
2)为每个按钮准备色调不同的两幅图(如bmpA,bmpA0。前一幅为正常,后一幅为灰色)。
3)两个菜单:
主菜单A :mainmenu.mpr
主菜单B:menu01.mpr(仅有帮助、退出等不涉及系统数据库的程序可运行)。
4)主表单
Thismainmenu:(自添加的方法)
do mainmenu.mpr with this,.t.
thismenu01: (自添加的方法)
do menu01.mpr with this,.t.
在其INT事件中:
mainform.thismenu01()
DIME AA(15)
AA=""
AA(1)="MYVFP\MYLIB\MYBMP\bmpA0.BMP"
AA(2)="MYVFP\MYLIB\MYBMP\bmpB0.BMP"
AA(3)="MYVFP\MYLIB\MYBMP\bmpC0.BMP"
AA(4)="MYVFP\MYLIB\MYBMP\bmpD0.BMP"
M=1
FOR N=1 TO MAINFORM.CNTTOOLBAR1.CONTROLCOUNT
NEXT N
在其destry事件中:
mainform.thismainmenu()
DIME AA(15)
AA=""
AA(1)="MYVFP\MYLIB\MYBMP\bmpA.BMP"
AA(2)="MYVFP\MYLIB\MYBMP\bmpB.BMP"
AA(3)="MYVFP\MYLIB\MYBMP\bmpC.BMP"
AA(4)="MYVFP\MYLIB\MYBMP\bmpD.BMP"
M=1
FOR N=1 TO MAINFORM.CNTTOOLBAR1.CONTROLCOUNT
NEXT N
6)将MYMENUSKIP类拖入所有与B类按钮相关联的窗体中。
菜单与工具栏的“SKIP”
(以下以仓库管理系统为例)
实现功能:A)根据不同登录者的权限,隐藏部分功能
B)打开一个有数据环境的窗体时,其它打开有数据环境的窗体的菜单(或工具栏按钮均不可用,以避冲突。
一)建一个表(passwords),字段如下:
userName c(8)
passwords c(12)
userLevel
录入---2
查询---3
二)在USEPARA 类的INIT()中:
this.get_value()
stor spac(12) to cPassWord
stor spac(8) to cUserName
stor 9 to nUserLevel
do form frmbegin with this.cyear,this.this_sys_name,this.this_unit_name,this.this_unit_name_e
**在登录窗体frmbegin中取得登录者的姓名与权限,详见该窗体的代码
read event
this.cUsername=cUserName
this.nUserLevel=nUserLevel
release cPassWord,nUserLevel,cUserName
clos all data
三)在主程序中有如下代码:(这样omybegin就保存了年度、系统名称、……以及登录者的信息,在程序任一处都可访问到。 若需要增加另外一些全局变量,也可用此方法)
publ omybegin
omybegin=createobject("userpara")
四)菜单设计器。在MENU BAR中,每个菜单后均有“OPTIONS”按钮,点击它,打开“PROMPT OPTIONS”对话框,在“SKIP FOR”中填入适当条件。如:
“设置”菜单的SKIP FOR条件是:OMYBEGIN.Nuserlevel>1 (只有系统管理员可用)
(“查询”、“打印”的SKIP FOR条件之所以如此设定的原因见:五))
五)创建一个类MyMeneSkip,并将其拖入每个有数据环境的窗体。
this.mylevel=omybegin.nUSERlevel &&为类添加一个属性mylevel,用来保存nUSERlevel
omybegin.nUSERlevel=8
**以下是工具栏按钮的设置
DIME AA(15)
AA=""
AA(1)="MYVFP\MYLIB\myBMP\comein0.BMP"
AA(2)="MYVFP\MYLIB\myBMP\comeout0.BMP"
AA(3)="MYVFP\MYLIB\myBMP\print10.BMP"
AA(4)="MYVFP\MYLIB\myBMP\comein0.BMP"
AA(5)="MYVFP\MYLIB\myBMP\comeout0.BMP"
AA(6)="MYVFP\MYLIB\myBMP\print10.BMP"
M=1
FOR N=1 TO MAINFORM.CNTTOOLBAR1.CONTROLCOUNT
NEXT N
MyMeneSkip.Destroy()代码:
omybegin.nUSERlevel=this.mylevel &&恢复原来的nUSERlevel
DIME AA(15)
AA=""
AA(1)="MYVFP\MYLIB\myBMP\comein.BMP"
AA(2)="MYVFP\MYLIB\myBMP\comeout.BMP"
AA(3)="MYVFP\MYLIB\myBMP\print1.BMP"
AA(4)="MYVFP\MYLIB\myBMP\comein.BMP"
AA(5)="MYVFP\MYLIB\myBMP\comeout.BMP"
AA(6)="MYVFP\MYLIB\myBMP\print1.BMP"
M=1
FOR N=1 TO MAINFORM.CNTTOOLBAR1.CONTROLCOUNT
NEXT N
六)代码帮助(或查询)窗体的处理
打开代码帮助(或查询)窗体有两种情况:
A)
这种情况,须作菜单SKIP处理
B)
这种情况,无须作菜单SKIP处理
因此不能简单的将MyMenuSkip类简单地拖入该窗体。要用代码完成。
该窗体的INIT()中的代码:
PARA THISFLAG
THIS.TOP=100
THIS.MYFLAG=THISFLAG
IF ALLTRIM(THISFLAG)="BROW"
ELSE
Endif
该窗体的DESTROY()中的代码(也可加在unload()中):
………
IF ALLTRIM(THIS.MYFLAG)="BROW"
RELEASE OMYMENU
ENDIF

加载中…