如何使用参数编写 VFP 通用菜单

    技术2022-05-20  76

    如何使用参数编写 VFP 通用菜单     虽然 VFP有生成菜单的工具,笔者是想通过这样一个范例,去表述如何在编写应用程序时,应充分利用参数进行控制,使得应用程序具有自适应性,不因应用需求发生微小的变化而重写或修改源程序,而是要以“不变应多变”,这样会使我们面对多变的客观的需求,而不会忙于奔命。这个理念是工具软件所不具有的,我们必须对大量的应用对象进行归纳,找出某一类的应用所具有的共同属性,从而归纳出共性的特征。虽然这样做很费劲,是常规编程工作的若干倍,一旦提炼成功后,日后的编程量就会大大地减少,而且会使这些自定义的通用模块(或称通用函数)的生命周期大大延长,甚至可以终身受用。下面所示是一个应用菜单范例:数据导入           数据导出            编辑数据            打印数据            外部软件导入工作表         导出工作表          编辑当月变动数据    打印当月明细数据    调用Excel导入纯文本         导出纯文本          编辑基本资料数据    打印当月汇总数据    调用Word导入自由表         导出自由表          新增基本资料数据    /-                             调用浏览器退出                                                   删除基本资料数据    打印某月明细数据                                                                                                                                                 打印汇总明细数据                                                   该范例,若使用传统的编程方法,将是如下所示。PROCEDURE Generalmenu**************** 传统菜单模块***************CLEARSET SYSMENU SAVESET SYSMENU TODEFINE PAD MENUPAD1 OF _MSYSMENU PROMPT '数据导入'DEFINE PAD MENUPAD2 OF _MSYSMENU PROMPT '数据导出'DEFINE PAD MENUPAD3 OF _MSYSMENU PROMPT '编辑数据'DEFINE PAD MENUPAD4 OF _MSYSMENU PROMPT '打印数据'DEFINE PAD MENUPAD5 OF _MSYSMENU PROMPT '外部软件'    

    ON PAD MENUPAD1 OF _MSYSMENU ACTIVATE POPUP POPMENU1ON PAD MENUPAD2 OF _MSYSMENU ACTIVATE POPUP POPMENU2ON PAD MENUPAD3 OF _MSYSMENU ACTIVATE POPUP POPMENU3ON PAD MENUPAD4 OF _MSYSMENU ACTIVATE POPUP POPMENU4ON PAD MENUPAD5 OF _MSYSMENU ACTIVATE POPUP POPMENU5

    DEFINE POPUP POPMENU1 MARGIN RELATIVEDEFINE BAR 1 OF POPMENU1 PROMPT '导入工作表'DEFINE BAR 2 OF POPMENU1 PROMPT '导入纯文本'DEFINE BAR 3 OF POPMENU1 PROMPT '导入自由表'DEFINE BAR 4 OF POPMENU1 PROMPT '退出'

    DEFINE POPUP POPMENU2 MARGIN RELATIVEDEFINE BAR 1 OF POPMENU2 PROMPT '导出工作表'DEFINE BAR 2 OF POPMENU2 PROMPT '导出纯文本'DEFINE BAR 3 OF POPMENU2 PROMPT '导出自由表'

    DEFINE POPUP POPMENU3 MARGIN RELATIVEDEFINE BAR 1 OF POPMENU3 PROMPT '编辑当月变动数据'DEFINE BAR 2 OF POPMENU3 PROMPT '编辑基本资料数据'DEFINE BAR 3 OF POPMENU3 PROMPT '新增基本资料数据'DEFINE BAR 4 OF POPMENU3 PROMPT '删除基本资料数据'

    DEFINE POPUP POPMENU4 MARGIN RELATIVEDEFINE BAR 1 OF POPMENU4 PROMPT '打印当月明细数据'DEFINE BAR 2 OF POPMENU4 PROMPT '打印当月汇总数据'DEFINE BAR 3 OF POPMENU4 PROMPT '/-'DEFINE BAR 4 OF POPMENU4 PROMPT '打印某月明细数据'DEFINE BAR 5 OF POPMENU4 PROMPT '打印汇总明细数据'

    DEFINE POPUP POPMENU5 MARGIN RELATIVEDEFINE BAR 1 OF POPMENU5 PROMPT '调用Excel'DEFINE BAR 2 OF POPMENU5 PROMPT '调用Word'DEFINE BAR 3 OF POPMENU5 PROMPT '调用浏览器'

    ON SELECTION POPUP POPMENU1;DO choice IN Generalmenu WITH PROMPT()

    ON SELECTION POPUP POPMENU2;DO choice IN Generalmenu WITH PROMPT()

    ON SELECTION POPUP POPMENU3;DO choice IN Generalmenu WITH PROMPT()

    ON SELECTION POPUP POPMENU4;DO choice IN Generalmenu WITH PROMPT()

    ON SELECTION POPUP POPMENU5;DO choice IN Generalmenu WITH PROMPT()

    ACTIVATE MENU _MSYSMENU  && 激活系统菜单RETURNPROCEDURE ChoicePARAMETERS Mprompt       && 子菜单条IF Mprompt='退出'SET SYSMENU TOSET SYSMENU TO DEFAULT   && 还原 VFP 系统菜单ELSE  IF FILE(Mprompt+".PRG") OR FILE(Mprompt+".FXP")  DO (Mprompt)           && 执行菜单条模块  ELSE  MESSAGEBOX('['+Mprompt+']功能模块不存在!','系统提示')  ENDIFACTIVATE MENU _MSYSMENU  && 激活系统菜单ENDIFACTIVATE MENU _MSYSMENU  && 激活系统菜单RETURN若使用抽象的通用理念去编写,是利用 VFP 中的数据表作为菜单(参数)的载体,用户可随时变更菜单的内容,而程序始终不变。通用菜单数据表结构如下(暂定数据表名为:通用菜单.DBF):字段      类型     宽度   小数

    菜单栏1   字符型   20 菜单栏2   字符型   20 菜单栏3   字符型   20 菜单栏4   字符型   20 菜单栏5   字符型   20 菜单栏6   字符型   20 菜单栏7   字符型   20 菜单栏8   字符型   20 菜单栏9   字符型   20 菜单栏10  字符型   20 注:菜单栏最多为 10 栏,数据表预置 16 条空白记录,第一条为主菜单栏(PAD),第二至第十六条为对应子菜单(BAR)菜单条,用户可随应用需求填入菜单内容。按范例要求,在数据表内填入菜单内容。菜单栏1            菜单栏2             菜单栏3             菜单栏4             菜单栏5      菜单栏6 ....===========================================================================================================数据导入           数据导出            编辑数据            打印数据            外部软件导入工作表         导出工作表          编辑当月变动数据    打印当月明细数据    调用Excel 导入纯文本         导出纯文本          编辑基本资料数据    打印当月汇总数据    调用Word导入自由表         导出自由表          新增基本资料数据    /-                              调用浏览器退出                                                   删除基本资料数据    打印某月明细数据                                                                                              打印汇总明细数据             ===========================================================================================================该范例,若使用传统的编程方法,将是如下所示。PROCEDURE Generalmenu***************************************** 通用菜单模块  最后修改时间 2011.01.08****************************************PARAMETERS CAIDANBIAO  && 用户菜单数据表CLEARSET SYSMENU TOIF FILE(CAIDANBIAO+".DBF")SELECT 125USE (CAIDANBIAO)ELSEMESSAGEBOX("["+CAIDANBIAO+"]菜单表不存在! ",48,"系统提示")RETURNENDIFRELEASE TS,QD,POMDIMENSION TS(10),QD(10,16),POM[10]CAIDAN=1**************************************************DO WHILE .T.CDL="菜单栏"+ALLTRIM(STR(CAIDAN))  IF EMPTY(&CDL)             && 若菜单栏空  CAIDAN=CAIDAN-1            && 指针减1  EXIT                       && 退出循环  ELSE                       && 否则  TS[CAIDAN]=ALLTRIM(&CDL)   && 主菜单栏  MPAD="MENUPAD"+ALLTRIM(STR(CAIDAN))  PP="POPMENU"+ALLTRIM(STR(CAIDAN))  ****** 定义主菜单栏 ****************************  DEFINE PAD &MPAD OF _MSYSMENU PROMPT TS[CAIDAN]  ****** 激活子菜单 ******************************  ON PAD &MPAD OF _MSYSMENU ACTIVATE POPUP &PP  ****** 定义子菜单 ******************************  DEFINE POPUP &PP MARGIN RELATIVE    CAIDAN=CAIDAN+1            && 指针加1  ENDIFENDDO**************************************************FOR LIE=1 TO CAIDANZCD="菜单栏"+ALLTRIM(STR(LIE))JISUAN=1  DO WHILE .T.  GO JISUAN+1    IF EMPTY(&ZCD)    JISUAN=JISUAN-1    EXIT    ELSE    QD[LIE,JISUAN]=ALLTRIM(&ZCD)    JISUAN=JISUAN+1    ENDIF  ENDDOPOM[LIE]=JISUANENDFOR*-----------------------------------------------------------FOR LAN=1 TO CAIDANPP="POPMENU"+ALLTRIM(STR(LAN))  FOR CDT=1 TO POM[LAN]  DEFINE BAR CDT OF &PP PROMPT QD[LAN,CDT] && 定义子菜单条  ENDFOR*** 当选择子菜单条时,调用 choice 模块 ***ON SELECTION POPUP &PP DO choice ;IN Generalmenu WITH PROMPT()ENDFOR*-----------------------------------------------------------ACTIVATE MENU _MSYSMENU  && 激活系统菜单RETURNPROCEDURE ChoicePARAMETERS Mprompt       && 子菜单条IF Mprompt='退出'SET SYSMENU TOSET SYSMENU TO DEFAULT   && 还原 VFP 系统菜单ELSE  IF FILE(Mprompt+".PRG") OR FILE(Mprompt+".FXP")  DO (Mprompt)           && 执行菜单条模块  ELSE  MESSAGEBOX('['+Mprompt+']功能模块不存在!','系统提示')  ENDIFACTIVATE MENU _MSYSMENU  && 激活系统菜单ENDIFRETURN用户在调用 Generalmenu 通用菜单时,只要编写几句语句即可,而对应的功能模块,则由用户自行编写。PROCEDURE RUN_MENUGeneralmenu("通用菜单")RETURN其它应用模块PROCEDURE 导入工作表...........RETURNPROCEDURE 导入纯文本...........RETURNPROCEDURE 导入自由表...........RETURN...........以上程序在 VFP6 和 VFP7 上通过。

     

     

     


    最新回复(0)