今天刚写完一个权限管理的程序,本来有很多解决方案可以实现,只是当时灵机一现,突然想到用菜单来进行权限分配,因为大部分项目的权限要通过菜单来控制,对于在窗口中要控制的非菜单的控件,控制他们其实也可以用一个隐藏的菜单来对应,这样有不少好处,至少可以在一登陆的时候就把所有权限用菜单的ENABLED为TRUE和FALSE来处理,以后,在需要判断权限时,取权限对应菜单的ENABLED一看便知,不用去数据库里取了!用菜单来进行权限分配的一大好处就是直观,所见即所得,通过点选菜单,使菜单项的CHECDED为TRUE即表示拥有该权限了。为FALSE即为不拥有该权限。这样的方式,我认为编程比较简单,比用TREEVIEW来的简单,尤其PB6。5的TREEVIEW还不带复选框,用TREEVIEW来分配权限也是不方便,用数据窗口形式,或则列表框都可以实现,不过我还是自以为用菜单来分配方便简单,于是决定要这样做了!不敢独享,放在这里,也算是对所以帮助过我的网友致谢!
设计思想:
前提:
权限是按菜单来分配的,一个菜单项对应是一个权限,窗口中要控制的非菜单控件通过隐性菜单项来体现到菜单上,保证一个菜单项对应一个权限。
1,从数据库表里取到用户组(角色或者用户,都一样处理)所具有的权限
2根据这些权限设置菜单,将相应菜单项的CHECKED=TRUE(有权限)
3。用户在菜单上进行权限设置,要设有权限即设置相应菜单的CHECKED属性为真
反之,则假
4确定用户的选择,遍历菜单将每个菜单项与用户组权限表比较,如果用户权限表里有的权限而在对应菜单里CHECKED=FALSE,则删去此权限,为TRUE则不处理,如果用户权限表中没有的权限而在对应菜单里CHECKED=TRUE,则增加此权限,为FALSE则不处理。
效果图如下
:
在每个菜单项的CLICKED事件里写
this.checked=not this.checked
在做这个程序的时候,碰见一个最大的问题就是,在点选菜单时,一点击左键菜单就不展开了,要为下一个权限点选的时候,又要重新点开菜单,这样是很麻烦的。所以我想要是在点开菜单的同时,可以点选很多子项菜单,这样就可以只需要展开一次菜单,然后可以给多个子菜单项进行权限设置了。
这可是个大问题啊,问了很多高人。子定义可视类不能以菜单为基类。又不能给菜单定义用户事件来映射到WINDOW消息上。而且菜单只有CLICKED和SELECTED两个事件,菜单调用CLICKED事件后会自动变成不展开状态,SELECTED事件里又不能用KEYDOWN函数来判断是否点击了鼠标右键或着键盘按下了某个键,在这个事件里去触发窗口里自定义事件(这个事件里放了KEYDOWN来判断是否有鼠标右键或其他键盘键按下),也不能遂愿。郁闷了我一天啊!
今天手写累了,先到这,要是大家觉得放在这不会玷污大家的眼睛的话,我会尽快努力把下文写完的,
待续!
|