加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

菜单与工具栏(VFP)

(2011-11-17 11:15:49)
标签:

vfp

菜单

工具栏

杂谈

分类: VFP笔记

 

菜单与工具栏(VFP)

菜单SKIP

工具栏按钮

菜单与工具栏的SKIP

 

(有关如何在程序运行过程中对菜单SKIP的控制,参见《成本管理系统》)

菜单SKIP

 

(以下以成本系统为例)

系统菜单SKIP分两个层次:

一)PAD SKIP

在设计菜单时设置。点击"输入(\<I)"后的OPTIONS,在弹出的对话框中作如下设置:

     SKIP FORomybegin.nUSERlevel>2

     PAD NAMEPADO1

(注意,其中omybegin.nUSERlevel进入系统的用户等级

在菜单文件中将生成以下代码。(将扩展名为 MPR的菜单文件改为TXT扩展名,即可查看)

DEFINE PAD PAD01 OF (m.cMenuName) PROMPT "输入(\<I)" COLOR SCHEME 3 ;

    KEY ALT+I, "" ;

    SKIP FOR omybegin.nUSERlevel>2

 

二)菜单项(BARSKIP

1)在程序任一地方都可控制某一个菜单项(BAR)的可用与否。如,要令“输入(\>I)”下的第一个菜单项不可用,可在程序任一地方加入以下语句:

SET SKIP OF BAR 1 OF 输入i .T.

注意 一)这里的 输入i ,  不可加引号,且最后一个字符为小写i 。如果有疑问,可以查看菜单中的代码。(将扩展名为 MPR的菜单文件改为TXT扩展名,即可查看)

) 菜单项(BAR)以序数标记,第一项为1,第二项为2,……以此类推

)如将语中的SKIP改为MARK, 则在菜单项前打勾

2)本系统SET SKIP OF BAR语句集中在过程文件MYPROC中,过程名为SETBARSKIP。在成本计算过程中,每计算一步(每计算完一张表),一般都应调用一次该过程(DO SETBARSKIP IN MYPTOC)。

 

工具栏按钮

有关工具栏的按钮制作参见《在VFP中制作浮动按钮》。

以下是有关工具栏按钮的具体使用:

 

工具栏中的按钮分两类:

A类按钮:一般仅有两个:计算器、退出系统。

退出系统按钮的CLICK事件中只有一条命令:QUIT

对计算器按钮,我们要求:计算器不要重复打开。即:打开一个计算器后,计算器按钮变为灰色(不可用),关闭计算器后,计算器按钮恢复正常。实现方法:分别在计算器窗体的INITDESTRY事件中加入相应语句。

B类按钮:按下此类按钮将打开一个以本系统的数据库作为数据环境的窗体。

由于B类按钮与一个或多个表相关联,为避免重复打开同一个表,我们要求:按下一个B类按钮打开一个窗体后,所有B类按钮将变为灰色(不可用),同时有关菜单项也不可见。

 

以下,详述B类按钮实现上述功能的具体方法:

1)按《在VFP中制作浮动按钮》中所述方法制作按钮后,为各按扭命名。命名时注意:所有B类按钮NAME的前若干位应相同。(本例中,前三位均为“CNT”)。

2)为每个按钮准备色调不同的两幅图(如bmpA,bmpA0。前一幅为正常,后一幅为灰色)。

3)两个菜单:

主菜单Amainmenu.mpr

主菜单Bmenu01.mpr(仅有帮助、退出等不涉及系统数据库的程序可运行)。

 

4)主表单

Thismainmenu:(自添加的方法)

do mainmenu.mpr with this,.t.

thismenu01: (自添加的方法)

do menu01.mpr with this,.t.

 

 5)建一个名为MYMENUSKIP的类,

在其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

  IF UPPE(LEFT(MAINFORM.CNTTOOLBAR1.CONTROLS(N).NAME,3))="CNT"

   MAINFORM.CNTTOOLBAR1.CONTROLS(N).ENABLED=.F.

   MAINFORM.CNTTOOLBAR1.CONTROLS(N).LBL.ENABLED=.F.

   MAINFORM.CNTTOOLBAR1.CONTROLS(N).IMG.ENABLED=.F.

    MAINFORM.CNTTOOLBAR1.CONTROLS(N).IMG.PICTURE=(AA(M))

    M=M+1

    

   ENDIF

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

  IF UPPE(LEFT(MAINFORM.CNTTOOLBAR1.CONTROLS(N).NAME,3))="CNT"

   MAINFORM.CNTTOOLBAR1.CONTROLS(N).ENABLED=.T.

   MAINFORM.CNTTOOLBAR1.CONTROLS(N).LBL.ENABLED=.T.

   MAINFORM.CNTTOOLBAR1.CONTROLS(N).IMG.ENABLED=.T.

    MAINFORM.CNTTOOLBAR1.CONTROLS(N).IMG.PICTURE=(AA(M))

  M=M+1

   ENDIF

NEXT N

 

6)将MYMENUSKIP类拖入所有与B类按钮相关联的窗体中。

                             

 

菜单与工具栏的“SKIP

(以下以仓库管理系统为例)

实现功能:A)根据不同登录者的权限,隐藏部分功能

B)打开一个有数据环境的窗体时,其它打开有数据环境的窗体的菜单(或工具栏按钮均不可用,以避冲突。

 

一)建一个表(passwords,字段如下:

userName c(8)   (姓名)

passwords c(12)   (密码)

userLevel  n(1,0) (权限)

    权限等级:系统管理---1

录入---2

查询---3

二)USEPARA 类的INIT()中:

this.get_value()  &&SHIS_SYS表中取得系统年度,名称等参数

 

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条件是:OMYBEGIN.Nuserlevel>2

    “查询”、“打印”的菜单的SKIP FOR条件是:OMYBEGIN.Nuserlevel>6

(“查询”、“打印”的SKIP FOR条件之所以如此设定的原因见:五))

 

五)创建一个类MyMeneSkip,并将其拖入每个有数据环境的窗体。

    MyMeneSkip.Init()代码:

this.mylevel=omybegin.nUSERlevel &&为类添加一个属性mylevel,用来保存nUSERlevel

omybegin.nUSERlevel=8  &&只要打开有数据的窗体,nUSERlevel都被临时设为大于6,这样就不能再打开其它有数据环境的窗体。

**以下是工具栏按钮的设置

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

                IF UPPE(LEFT(MAINFORM.CNTTOOLBAR1.CONTROLS(N).NAME,3))="CNT";

                   .AND.UPPE(MAINFORM.CNTTOOLBAR1.CONTROLS(N).NAME)#"CNTNOTE";

                   .AND.UPPE(MAINFORM.CNTTOOLBAR1.CONTROLS(N).NAME)#"CNTFILE"

                 MAINFORM.CNTTOOLBAR1.CONTROLS(N).ENABLED=.F.

                 MAINFORM.CNTTOOLBAR1.CONTROLS(N).LBL.ENABLED=.F.

                 MAINFORM.CNTTOOLBAR1.CONTROLS(N).IMG.ENABLED=.F.

                  MAINFORM.CNTTOOLBAR1.CONTROLS(N).IMG.PICTURE=(AA(M))

                  M=M+1

                  

                 ENDIF

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

                IF UPPE(LEFT(MAINFORM.CNTTOOLBAR1.CONTROLS(N).NAME,3))="CNT";

                   .AND.UPPE(MAINFORM.CNTTOOLBAR1.CONTROLS(N).NAME)#"CNTNOTE";

                   .AND.UPPE(MAINFORM.CNTTOOLBAR1.CONTROLS(N).NAME)#"CNTFILE"

                 MAINFORM.CNTTOOLBAR1.CONTROLS(N).ENABLED=.T.

                 MAINFORM.CNTTOOLBAR1.CONTROLS(N).LBL.ENABLED=.T.

                 MAINFORM.CNTTOOLBAR1.CONTROLS(N).IMG.ENABLED=.T.

  MAINFORM.CNTTOOLBAR1.CONTROLS(N).IMG.PICTURE=(AA(M))

                M=M+1

                 ENDIF

NEXT N

 

六)代码帮助(或查询)窗体的处理

打开代码帮助(或查询)窗体有两种情况:

A)  在“查询”菜单中打开。(DO FORM HELPYLDM WITHBROW”)

这种情况,须作菜单SKIP处理

B)  有输入数据时打开。(DO FORM HELPYLDM WITHHELP”)

这种情况,无须作菜单SKIP处理

因此不能简单的将MyMenuSkip类简单地拖入该窗体。要用代码完成。

 

该窗体的INIT()中的代码:

PARA THISFLAG

THIS.TOP=100

THIS.MYFLAG=THISFLAG  &&添加一个属性存放,否则在destroy()中无法看到

 

IF ALLTRIM(THISFLAG)="BROW"

     SET CLASSLIB TO myclass

     PUBL OMYMENU

     omyMENU=createobject("mymenuskip")

ELSE

    ………

Endif

 

该窗体的DESTROY()中的代码(也可加在unload())

………

IF ALLTRIM(THIS.MYFLAG)="BROW"

RELEASE OMYMENU

ENDIF

 

 

 

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有