动态菜单的实现可以分为以下步骤
一 准备工作
建立模块属性表 包括所有需要分配的模块的窗口名称 标题 图标 Microhelp ToolbarItemText等属性
建立部门可用菜单表 包括部门号 menu_bar 顺序 可用窗口名称等属性
建立部门模块管理功能 此功能主要分配某部门可以打开那些模块 以及这些模块如何布置
二 动态菜单实现
创建一个菜单 m_main_frame 含所有部门都需要的项 如[文件] [窗口] [帮助]等 然后在中间加入 个menu_bar 每个menu_bar下建立 个menu_item(可以按实际情况增减)
在每个menu_item下调用函数mf_open_module(this tag) 该函数即用于打开窗口(模块)
程序运行时 在main_frame的open事件中 根据当前用户所在的部门 修改该用户的菜单属性 包括 itemText microhelp toolbarItemName toolbaritemtext visible enabled等等
通过以上步骤 显示给用户的界面就是由系统管理员所定制的菜单
三 优缺点
优点
■快速的开发框架 可以立即进行实际业务系统的开发而不用理会相关开发框架技术上的问题
■可以充分扩展模块 只需要加入某补丁库中即可 其他程序不用修改
■可以由系统管理员充分自由地定制每个部门或用户的可用模块
■模块容量无实际限制 可多可少
■可以扩展给用户自己定义菜单的显示方式 如文字 microhelp 图标等
■对开发人员 可以提供增加模块到模块表中的辅助工具 其他开发框架问题可以不用考虑
缺点
■需要建立额外的两张表(模块表 部门模块定义表) 增加工作量
■目前只能以opensheet()方式打开main形式的窗口(可以扩展打开response pop类型的窗口)
■目前只实现了二级菜单 更多级别的菜单尚未实现 但原理是一致的
函数mf_open_module参考
//////////////////////////////////////////////////////////////////
// Function: mf_open_module
// Access: Public
// Arguments: string as_module_id
// Returns: None
// Description: 打开模块(sheet)
// Designer: 刘建刚
// Date: / /
//////////////////////////////////////////////////////////////////
Integer li_sheet li_Resp
Window lw_Ex lw_sheet
if isnull(as_module_id) or as_module_id = then
messagebox( 参数错误 请检查模块ID设置 )
else
lw_sheet = parenindow GetFirstSheet()
do while isvalid(lw_sheet)
if lw_sheet classname() = as_module_id then
Opensheet(lw_sheet parenindow original!)
return
end if
lw_sheet = parenindow GetNextSheet(lw_sheet)
loop
li_Resp = Opensheet(lw_Ex as_module_id parenindow original!)
end if
方案三 分离为多个子系统
分离为多个子系统方式 即根据业务规则 将模块按业务所在部门进行分类 通常一个业务部门为一个子系统 各子系统有独立的application main_menu main_window 相互之间没有任何关系 有独立的可执行程序 独立的设置
优缺点
优点
■独立性 各业务系统相互关联少
■自由性 可以定制特定的内容 如界面等
■不需要辅助控制
缺点
■各分系统需要考虑各自的框架 增加额外工作量
■系统修改 扩展性差 需要重新编译整个分系统
■代码可重用部分少 容易造成整理不一致
编辑推荐
J EE高级框架实战培训视频教程
数据仓库与数据挖掘培训视频教程
lishixinzhi/Article/program/PB/201311/24629先建立一个菜单对象,假设名为m_analyse。
再假设,你希望在右键点击窗口对象w_test时,d出菜单,你可以在w_test上定义一个用户自定义的事件,如名为ue_rbd。定义这个事件时,最好要选择Event ID为“pbm_rbuttondown”,因为它里面有xpos和ypos参数,可以自动获取鼠标在w_test上的位置。
好了,现在请将下面的代码写到这个自定义的事件中吧:
m_analyse mymenu
mymenu = create m_analyse
mymenupopmenu(xpos + thisx,ypos + thisy)
destroy mymenu
二 查询系统的制作
制作从键盘输入记录号 可查询到该人的档案记录
①制作查询窗口 步骤为 鼠标点按Window图标 新建一窗口 在窗口中 添加一个DataWindow控件 在DataWindow控件上按鼠标右键 选择并单击Properties快捷菜单项 在在Datawindow object name旁按Browse按钮 选择装入前面制作的aaa数据窗口 调整好窗口的大小 再在窗口上放一SingleLineEdit控件 和一CommandButton按钮控件 点中按钮控件并按右键选择Properties 将其显示文本修改为 查询 按钮名称仍为cb_ 点中按钮控件并按右键选择Script… 输入以下脚本
dw_ settransobject(sqlca)
dw_ retrieve(sle_ text)
关闭并保存 按Save图标保存该窗口 窗口取名为aaa
②将查询窗口连接入test应用程序内 点按Application图标 出现test应用程序 双击test 出现名为w_genapp_frame的窗口图标 这是应用程序为我们提供的主窗口的名字 点按w_genapp_frame不放按右键选edit 出现该主窗口 将一按钮控件放入该窗口 按钮显示的文本可改为 唯一查询 也可省略不改 点中该按钮控件并按右键选择Script… 输入 open(aaa) 保存 点按Application图标 再按script图标 出现应用程序的自动生成的主体脚本 部分内容如下 它的任务是将数据库初始化 相当于win ini 假若不要应用程序的模板 则下面的脚本需自己输入 而使用模板后 现在我们只需将//connect 前面的注释号 // 符号删除即可 除省事外还避免了因为排版引起的下面的程序格式错误 (本人经常因为书中个别字母印刷错 或排版引起的程序格式错误造成程序无法运行而痛心不已 )
sqlca DBMS = ProfileString (ls_startupfile database dbms )sqlca database = ProfileString (ls_startupfile database database )sqlca userid = ProfileString (ls_startupfile database userid )sqlca dbpass = ProfileString (ls_startupfile database dbpass )sqlca logid = ProfileString (ls_startupfile database logid )sqlca logpass = ProfileString (ls_startupfile database LogPassWord )sqlca servername = ProfileString (ls_startupfile database servername )sqlca dbparm = ProfileString (ls_startupfile database dbparm )connect;
现在按Run图标运行该程序 结果如下图 为简化程序 我们只加入了多媒体中的字段 成功后 读者可自已增加动画 声音字段
讨论 假若多媒体的字段和数据个数比较少 也可用变量和函数来解决 如
temp =temp+ bmp p_ picturename=temp ole_ insertfile( sample avi )run( c:\acdsee exe c:\aa bmp normal!)
lishixinzhi/Article/program/SQL/201311/16400PB动态建立菜单的步骤如下:1创建模版菜单(m_template) 2a)、在模版菜单里创建动态添加菜单项的函数: /==================================== Funtion name:Of_addmemu Description: 将模版菜单项添加给指定的菜单 Argument:menu am_menu (添加菜单) string as_text(创建菜单项的text) string as_tag(创建菜单项的tag) Return Value : succeed 1 =====================================/ lm_item m_template integer li_itemcount lm_item = create m_template lm_itemtext =as_text lm_itemtag = as_tag li_itemcount = upperbound(am_menuitem[]) li_itemcount = li_itemcount+1 am_menuitem[li_itemcount] = lm_item return 1 b、在模版菜单中创建d出菜单的函数 /==================================== Funtion name:Of_popmemu Description: d出指定的菜单 Argument:menu am_menu (d出菜单) integer ai_x(d出菜单的x坐标) integer ai_y(d出菜单的y坐标) Return Value : NONE =====================================/ am_memupopmenu(ai_x,ai_y)为了能够一次创建多个菜单项定义函数f_dynamic_menuitem()/======================================Funtion name: f_dynamic_menuitemArugment: string as_menuitem[](添加菜单项的名称) integer ai_x(d出菜单的x坐标 ) integer ai_y( d出菜单的y坐标)===================================/integer li_itemcount,im_template lm_dynamic_menuli_itemcount = upperbound(as_menu[])for i = 1 to li_itemcountlm_dynamic_menuof_additem(lm_dynamic_menu,as_menu[i],string(i))nextlm_dynamic_menuof_popmenu(ai_x,ai_y)destory(lm_dynamic_menu)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)