# 菜单权限-用户模式设置表单

本文介绍利用框架的自响应控件来完成设置表单的开发。 一、新建框架表单 配置新建表单类为框架表单类 点选菜单:工具->选项->表单(选项卡)->选中Qiyu单笔维护.vcx->qiyu_form_singlecursor表单类 微信截图_20210302110040.png 点击空项目的表单->新建 微信截图_20210302110236.png 如上图,表单新建完成 二、拖入相应自响应控件,设置好表单 微信截图_20210302112437.png 三、过一下大脑 1 用户列表,不需要增删改,表格的用户名列 enabled=.f. 数据查询用MSSQLHelper查询 2 权限列表,有修改需求,那么编辑、撤消、保存按钮安排上。表格模块,菜单名(enabled=.f.),可用(sparse=.f.),再将其表格列里的TEXT1控件改成CHECKBOX控件,并将该控件的Caption属性清空。 修改,保存用DAL_CA 因为是单表操作,直接用二层结构 (UI层,DAL层)即可完成目的。 3 点击右侧的用户,右侧的权限列表根据用户发生变化(DAL_CA传入user_pass.id参数变化)。

四、业务逻辑代码编写 1、生成DAL_CA类,打祺佑框架代码生成器 微信截图_20210302113151.png 2、展示权限的SQL

select MODULE,DESCRIPTION,ENABLED,roleright.ID from roleright 
inner join  rights on roleright.right_id=rights.id
1
2

复制到自定义CA的文本框,选择好远程表名,获取远程表,点击生成CA代码。 微信截图_20210302173718.png

生成好的代码,保存到DAL目录中 (规范文件存放) 微信截图_20210302132343.png 因为需要传递参数,我们需要修改生成的DAL_CA代码,打开DAL_ROLERIGHT.PRG,找到SetupCA方法, 将 selectcmd的内容改成如下语句 一个id要指定表名,一个where条件

select MODULE,DESCRIPTION,ENABLED,roleright.ID 
from roleright inner join  rights 
on roleright.right_id=rights.id
where userid=?this.uid
1
2
3
4

微信截图_20210302164041.png 保存即可。

2、表单代码编写 表单Load事件 (实现打开即是第一个用户的权限设置)

Do SetEnv &&环境参数设定

oDBSQLhelper=Newobject("MSSQLHelper","MSSQLHelper.prg")
If oDBSQLhelper.SQLQuery("select u_dm,id from user_pass","user_pass")<0
	Messagebox(oDBSQLhelper.errmsg)
	Return .F.
Endif

oCA=Newobject("dal_roleright","dal_roleright.prg")
        oca.uid=user_pass.Id  &&将用户表第一个用户的ID赋值给DAL_CA 传参

If !oCA.CursorFill(.T.)
	Aerror(laerror)
	Messagebox(laerror(2))
	Return .F.
Endif

Thisform.oca=oca

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

实现编辑模式下点击左侧表格,右边的权限表格重新按用户ID取数据。 Qiyu_grid_sort1表格(用户列表)的AfterRowColChange事件

Lparameters nColIndex
Thisform.Oca.uid=user_pass.Id
If !Thisform.Oca.CursorRefresh()
    Aerror(laerror)  &&错误信息
    Messagebox(laerror(2)) 
Endif
Thisform.refresh()   
1
2
3
4
5
6
7

重设Qiyu_grid_sort1表格(用户列表)自响应行为 业务逻辑写法:如果是浏览模式下,用户列表表格控件可用,否则不可用。 Qiyu_grid_sort1表格(用户列表)的SetState方法

If Inlist(This.Opcode,0)  &&浏览模式
	This.Enabled=.T.
Else
	This.Enabled=.F.
Endif
1
2
3
4
5

编辑按钮Qiyu_cmdedit1按钮click事件

Thisform.opcode=2  &&编辑模式
1

撤消按钮Qiyu_cmdcancel1按钮click事件

Thisform.Oca.Undo()
Thisform.Opcode=0
1
2

保存按钮Qiyu_cmdsave1按钮click事件

If !Thisform.Oca.Save()
	Messagebox(Thisform.Oca.msg)  &&显示错误信息
	Return
Endif
Thisform.Opcode=0  &&浏览模式
Wait Windows "保存成功"
1
2
3
4
5
6

OK,此时运行表单,似乎一切就绪。 GIF.gif 但在动图的最后出现了缓冲区不能修改的问题,这个BUG是因为,明明我的表格设为只读状态了,你点击CHECHKBOX虽然不能改变里面的内容,但是会引发了表的缓冲状态变化,此时再调用Cursorrefresh就会触发这个错误。 那就打个补丁,在表格的refresh事件添加如下代码

If Inlist(Thisform.Opcode,1,2)
	This.ReadOnly=.F.
	This.Enabled=.T.	
Else
	This.ReadOnly=.T.
	This.Enabled=.F.
Endif
1
2
3
4
5
6
7

然后在三个按钮的Click事件最后面加上

Thisform.qiyu_grid_sort2.Refresh()
1

思考题: 添加用户,添加新菜单都需要往RoleRight写相应的权限数据。这个写入数据的业务逻辑代码写在哪里更好呢?

注:DEMO源码下载,请于框架会员群中下载。