本文介绍利用框架的自响应控件来完成设置表单的开发。
一、新建框架表单
配置新建表单类为框架表单类
点选菜单:工具->选项->表单(选项卡)->选中Qiyu单笔维护.vcx->qiyu_form_singlecursor表单类
点击空项目的表单->新建
如上图,表单新建完成
二、拖入相应自响应控件,设置好表单
三、过一下大脑
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类,打祺佑框架代码生成器
2、展示权限的SQL
select MODULE,DESCRIPTION,ENABLED,roleright.ID from roleright
inner join rights on roleright.right_id=rights.id
复制到自定义CA的文本框,选择好远程表名,获取远程表,点击生成CA代码。
生成好的代码,保存到DAL目录中 (规范文件存放)
因为需要传递参数,我们需要修改生成的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
保存即可。
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
实现编辑模式下点击左侧表格,右边的权限表格重新按用户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()
重设Qiyu_grid_sort1表格(用户列表)自响应行为
业务逻辑写法:如果是浏览模式下,用户列表表格控件可用,否则不可用。
Qiyu_grid_sort1表格(用户列表)的SetState方法
If Inlist(This.Opcode,0) &&浏览模式
This.Enabled=.T.
Else
This.Enabled=.F.
Endif
编辑按钮Qiyu_cmdedit1按钮click事件
Thisform.opcode=2 &&编辑模式
撤消按钮Qiyu_cmdcancel1按钮click事件
Thisform.Oca.Undo()
Thisform.Opcode=0
保存按钮Qiyu_cmdcancel1按钮click事件
If !Thisform.Oca.Save()
Messagebox(Thisform.Oca.msg) &&显示错误信息
Return
Endif
Thisform.Opcode=0 &&浏览模式
Wait Windows "保存成功"
OK,此时运行表单,似乎一切就绪。
但在动图的最后出现了缓冲区不能修改的问题,这个BUG是因为,明明我的表格设为只读状态了,你点击CHECHKBOX虽然不能改变里面的内容,但是会引发了表的缓冲状态变化,此时再调用Cursorrefresh就会触发这个错误。
那就打个补丁,在表格的refresh事件添加如下代码
If Inlist(Thisform.Opcode,1,2)
This.ReadOnly=.F.
This.column3.Enabled=.T.
Else
This.ReadOnly=.T.
This.column3.Enabled=.F.
Endif
思考题:
添加用户,添加新菜单都需要往RoleRigth写相应的权限数据。这个写入数据的业务逻辑代码写在哪里更好呢?