注册 登录
编程论坛 VB6论坛

vb 如何设置目录的对象变量

w360989426 发布于 2014-05-13 21:48, 1234 次点击
Private Sub Form_Load()
    Dim 目录 As Object
    Set 目录 = CreateObject("")
    Adodc1.ConnectionString = strCn
    If id_公司部门名称 = 5 Then
        Command1.Visible = True
    End If

    sql1 = "select 一级目录名称 from 系统一级目录"
    Adodc1.RecordSource = sql1
    Adodc1.Refresh
    For i = 1 To Adodc1.Recordset.RecordCount
        目录 = Trim(Adodc1.Recordset.Fields("一级目录名称"))    不知道如何实现对对象变量的赋值还望指教谢谢
        目录.Item(1).Enabled = False
        Adodc1.Recordset.MoveNext
    Next
End Sub
18 回复
#2
w3609894262014-05-14 11:18
无人回答???
#3
风吹过b2014-05-14 14:39
关键你要做什么。看你的代码,你的问题,猜不出来。

要目录列表?
那可能使用 dir 控件
要文件列表,可以使用 file 控件。
#4
w3609894262014-05-14 17:47
回复 3 楼 风吹过 b
我将menu控件的名字都存入到了sql中,在系统分配权限的时候,读取相应的名称,对目录设置可以访问或者不可以访问,
如果menu控件的名字是 订单录入系统
那么在sql中查询出来也是“订单录入系统”,但是是字符串,如何使这个字符串变成对象名来使用
#5
xzlxzlxzl2014-05-14 18:50
权限控制似乎不是目录吧?
首先,在设计时对所有有操作能力的按钮、菜单最好统一命名规范(比如全部以字符menu打头),其次对不同管理类别进行分组,最后对在用户组和用户名里设一个权限字段,记录管理权限组。在程序启动之初,对controls集合名称符合规范的先enabled=false,进入登陆时根据权限字段找到权限组,根据权限组的权限名称开通controls集合里的。enabled=true.
#6
w3609894262014-05-15 08:35
回复 5 楼 xzlxzlxzl
我就是想问例如“订单管理系统”这个字符串如何转换成变量名。例如用一个menu对象名称为“订单管理系统” 如何是这个字符串可以转换为对象名,并且可以使用
#7
风吹过b2014-05-15 08:58
权限控制吧。

建立统一的权限库。
权限库分为二个表。
一个是 各个权限的名字。一个是各个用户的授权。
表1:  ID(自动编号),权限名
表2:ID(自动编号),权限ID(与表1ID关联),用户名

所有功能,每个功能(如每个窗体)初始化时,执行判断
先自己定义自己的功能。
然后查表1,得到权限ID,如果查表没有这个权限名,就添加进去。把新的ID传回来。 这是一个函数。
然后查表2,2个参数,一个是权限ID,一个是当前用户ID(或用户名,建议用户ID)。这是第二个函数。
       返回当前用户有权限,或无权限。
根据这个返回的结果,决定是否停止执行该功能。

编写过程中,一个一个的功能去实现,然后执行一遍后,就会在表1中找到这个功能,然后再分配用户。
当然,你要有一个超级用户,该用户是自动拥有所有的权限。
#8
w3609894262014-05-15 09:28
回复 7 楼 风吹过 b
只有本站会员才能查看附件,请 登录

这是我的sql权限图,我要问的不是具体权限怎么去弄,而是问的从数据库中读取的字符串如何转换成对象名称使用!
#9
风吹过b2014-05-15 11:49
在调用每个对象时 判断。或者在显示按钮时判断。

按我 7 楼的说明
比如要调用 XX目录 ,该目录名字为 XX目录,对象 XX2
先查表一,那么表1一定会有这一行,如果没有,就需要临时添加。再重新查。最后一定可以查到一个ID。
ID    权限名
1    XX目录
查到 ID是1 。返回 1

然后再查表二,表2 可能有这行。需要提供当前登录用户,比如是 张三
ID   权限ID  用户名
1      1      张三
查表二,用 1 和张三去查,查到有数据。返回真
然后就允许张三继续向下执行

再比如当前登录的用户中李四,
在表二中没有 李四,用李四去查询时,在表2中就查不到记录。返回 假 。
这种情况,就应该停止执行后面的命令,而是提示 无权限。

Private Sub Form_Load()
Dim obj As Object

For Each obj In Me.Controls                  '遍类所有的按件
    If TypeName(obj) = "CommandButton" Then    '是按钮。如果有其它,再增加判断
        If 查表2(查表1(obj.Caption), 用户) Then      '调用二个函数。
            obj.Enabled = True                 '有权限,按钮有效
        Else
            obj.Enabled = False                '否则无效
        End If
    End If
Next
End Sub

查表1,查表2 这两个函数,自己完成。功能看最上面的描述。

---------------------------
权限设置:
根据表1中的权限,然后对选定的用户,如果给权限,就到表2中增加一行,如果删除权限,就把表2中对应的行删掉。
#10
w3609894262014-05-15 12:36
回复 9 楼 风吹过 b
问题已经解决,但版主始终没有美白我的依稀看
字符串 要转换成 对象名使用
       字符 = Trim(Adodc1.Recordset.Fields("二级目录名称"))
        Set a = Controls(字符)  想问的是这个怎么写
        a.Item(1).Enabled = False
        Adodc1.Recordset.MoveNext


 Dim 字符 As String
    Adodc1.ConnectionString = strCn
    If id_公司部门名称 = 5 Then
        Command1.Visible = True
    End If
    '全部禁止访问目录
    '=================================================
    sql1 = "select 一级目录名称 from 系统一级目录 "
    Adodc1.RecordSource = sql1
    Adodc1.Refresh
    For i = 1 To Adodc1.Recordset.RecordCount
        字符 = Trim(Adodc1.Recordset.Fields("一级目录名称"))
        Set a = Controls(字符)
        a.Item(1).Enabled = False
        Adodc1.Recordset.MoveNext
    Next
    sql1 = "select 二级目录名称 from 系统二级目录"
    Adodc1.RecordSource = sql1
    Adodc1.Refresh
    For i = 1 To Adodc1.Recordset.RecordCount
        字符 = Trim(Adodc1.Recordset.Fields("二级目录名称"))
        Set a = Controls(字符)
        a.Item(1).Enabled = False
        Adodc1.Recordset.MoveNext
    Next
    '========================================

    '=========================================
    '查询职称对于一级目录的访问,放开一级目录的访问权限
    sql1 = "select 一级目录名称 from 系统一级目录,一级目录访问 where 系统一级目录.id_一级目录=一级目录访问.id_一级目录 and id_公司部门名称 ='" & id_公司部门名称 & "'"
    Adodc1.RecordSource = sql1
    Adodc1.Refresh
    For i = 1 To Adodc1.Recordset.RecordCount
        字符 = Trim(Adodc1.Recordset.Fields("一级目录名称"))
        Set a = Controls(字符)
        a.Item(1).Enabled = True
        Adodc1.Recordset.MoveNext
    Next

    '查询职称对于二级目录的访问,放开二级目录的访问权限
    sql1 = "select 二级目录名称 from 系统二级目录,二级目录访问 where 系统二级目录.id_二级目录=二级目录访问.id_二级目录 and id_公司部门职称 ='" & id_公司部门职称 & "'"
    Adodc1.RecordSource = sql1
    Adodc1.Refresh
    For i = 1 To Adodc1.Recordset.RecordCount
        字符 = Trim(Adodc1.Recordset.Fields("二级目录名称"))
        Set a = Controls(字符)
        a.Item(1).Enabled = True
        Adodc1.Recordset.MoveNext
    Next
    '=========================================访问权限结束
#11
xzlxzlxzl2014-05-15 13:02
回复 10 楼 w360989426
你用这种方式解决问题了?我一般是这样解决的
funtion canOption(catalog as string)
'指定目录对应的控件可以执行操作
dim a as control
for each a in me.controls
  if a.name=catalog  then
    a.enabled=true    '该功能按钮有效
    exit function
  endif
next
end function

function noOptionAll
'所有操作按钮不能操作(假设所有按钮名称前四个字符为menu)
dim a as control
for each a in me.controls
  if left(a.name,4)="menu" then a.enabled=false
next
end function
#12
w3609894262014-05-15 13:26
回复 11 楼 xzlxzlxzl
我不知道你这样通不通过数据库,因为涉及到日后要让操作人员自己定义每个部门对于每个一级目录,每个职称对于二级目录的访问。所以我想到了这种方法
#13
风吹过b2014-05-15 15:35
关键在于你的达到什么目的。而不在实现方法。
我说的是另一种的实现方法。
而你的实现方法 从代码上来讲是无法直接实现的。

字符串不能直接生成对象,有名字,只能遍类所有的已知的对象,再去激活该对象。
而不能因为有字符串而创建对象。当然,WINDOWS 自带的对象除外,那种对象就是用字符串来创建的。
#14
w3609894262014-05-15 16:01
回复 13 楼 风吹过 b
问题我已经解决了,字符串可以成为对象名
字符 = Trim(Adodc1.Recordset.Fields("二级目录名称"))
        Set a = Controls(字符)
a.item(1).enabled=true
代码调试通过了。。我本来就是想问的这个问题,如果将字符串变为对象名
#15
lowxiong2014-05-15 18:02
回复 14 楼 w360989426
这是一个好方法。
只要把有操作功能的按钮或菜单名称全部存储到数据库,即可用该方法对按钮或菜单使能或失效。11楼是通过扫描所有控件名称,判断是否和数据库存储的按钮名称是否相等来完成的,没有这种方法效率高,也不直观。
#16
w3609894262014-05-15 19:07
回复 15 楼 lowxiong
呵呵这个问题想了很久,就是被字符串转换成对象名给卡住了,现在解决了
#17
xzlxzlxzl2014-05-15 22:06
学习了,一直只会controls.add动态加载控件,还不知道可以这样。为什么不直接controls(控件名).enabled呢?不需要中间对象变量的。
#18
w3609894262014-05-15 22:14
回复 17 楼 xzlxzlxzl
不知道这样可不可以,没尝试过,
#19
w3609894262014-05-15 22:24
回复 17 楼 xzlxzlxzl
编写c|s 或者b|s的时候最好什么东西都能让用户自己定义,那才比较好
1