delphi中 读取数据库 信息到 mainmenu中 并且分权限问题

时间:2021-03-10 21:26:25
问过这个问题了的饿。。。。
但是有点小问题。。。
我的表设置
id   mid  name  mark(权限)
1    0    a     1,2,3,4
2    0    b     1
3    0    c     1,2
.
.
11   1    a11   1,2,3
12   1    a12   1,2,3
21   2    a21   1
22   2    a22   1
.
.
.
权限有几个同时可以访问-----------------------------------------------------------------1
有个问题是,我实现时用的是1--9的判断,菜单超过9个就有问题了--------------------------------2
请问谁有其他的方法?-------------------------------------------------------------------3

权限进行设置的时候,在登陆框下拉判断,还要怎么设置好,请高手帮忙解决下,代码+思路,谢谢!!!

我的代码:
      count1 := 0;
      for i := 0 to 8 do
      begin
         k := i;
         s1 := inttostr(k+1);
        //得到第一级的总菜单
             unit2.Form2.ADOQuery1.Close;
             unit2.Form2.ADOQuery1.SQL.Clear;
             unit2.Form2.ADOQuery1.SQL.Text :=('select mname from mlist where idkey='''+s1+'''');
             unit2.Form2.ADOQuery1.Open;
             unit2.Form2.ADOQuery1.First;
             SetLength(files,adoquery1.RecordCount);
             count1 := count1  +  adoquery1.RecordCount;
             for j:=0 to adoquery1.RecordCount-1 do
                begin
                files[j] :=tmenuitem.Create(self);
                files[j].Caption := unit2.Form2.ADOQuery1.FieldByName('mname').AsString ;
                MainMenu1.Items.Add(files[j]);
                unit2.Form2.ADOQuery1.Next;  
 {               if j = 0 then
                begin
                   MainMenu1.Items[j].Visible := false;
                end}
                end
        end;
         //********************第一级菜单完***************

         //*****************得到第二级的菜单*****************
         for num := 0 to count1-1 do
             begin
                s2 := inttostr(num+1);
                unit2.Form2.ADOQuery1.Close;
                unit2.Form2.ADOQuery1.SQL.Clear;
                unit2.Form2.ADOQuery1.SQL.Text :=('select mname from mlist where mid='''+s2+'''');
                unit2.Form2.ADOQuery1.Open;
                unit2.Form2.ADOQuery1.First;
                SetLength(files,adoquery1.RecordCount);
//              count2 := count2 + adoquery1.RecordCount;
                for j := 0 to adoquery1.RecordCount-1 do
                begin
                files[j] :=tmenuitem.Create(self);
                files[j].Caption := unit2.Form2.ADOQuery1.FieldByName('mname').AsString ;
                MainMenu1.Items[num].Add(files[j]);
                unit2.Form2.ADOQuery1.Next;
                end
             end;
       //**************第二级菜单完*****************

       //************得到第三级菜单开始***************
          for i := 0 to count1-1 do
             begin
             k := i;
             s1 := inttostr(k+1);
             for num :=0 to 8 do
                begin
                   s2 := inttostr(num+1);
                   s3 := s1+s2;
                   unit2.Form2.ADOQuery1.Close;
                   unit2.Form2.ADOQuery1.SQL.Clear;
                   unit2.Form2.ADOQuery1.SQL.Text :=('select mname from mlist where mid='''+s3+'''');
                   unit2.Form2.ADOQuery1.Open;
                   unit2.Form2.ADOQuery1.First;
                   SetLength(files,adoquery1.RecordCount);
                   for j := 0 to adoquery1.RecordCount-1 do
                      begin
                      files[num] :=tmenuitem.Create(self);
                      files[num].Caption := unit2.Form2.ADOQuery1.FieldByName('mname').AsString ;
                      MainMenu1.Items[i].Items[num].Add(files[num]);
                      unit2.Form2.ADOQuery1.Next;
                      end
                end
              end   
                 //*****三over*****
             end;

6 个解决方案

#1


直接在初始读数据库数据的时候 没有权限的菜单项就不读了

此菜单项就不会出现在用户菜单列表里了

菜单超过九个有问题不明白什么意思

#2


此类问题,我个人认为用递归 程序比较简单!

或者一次性把菜单读取到本地数组后,再循环处理或者一次性递归处理!我个人觉得为了这么简单的一件事情多次访问数据库
对应程序来说应该不合适或者说不是最好的选择!

#3


 我同意   jason_28693  的方法!!

#4


引用 1 楼 sparklerl 的回复:
直接在初始读数据库数据的时候 没有权限的菜单项就不读了 

此菜单项就不会出现在用户菜单列表里了 

菜单超过九个有问题不明白什么意思

我明白你的意思,我的也是这个意思,就是有权限的就读出来,没有权限的就不读出来或者不可见,但是假如我让上面表中的2  0  b 不能读出来怎么设置?实施起来有点麻烦,这样指定了第一级的,后面的菜单都要不可见,不可能看不见主菜单却看见下面的子菜单了。。。

9个的问题是我建表是用的 主菜单用1 ---  9  第一级的子菜单用的是11 12 13 即第一个菜单的第一个子菜单这样命名的方式 超过了9个就不好命名了,有点局限性,我现在设置用a---z试试  你主菜单还超过26个了还。。。
这样设置是为了方面对以后的操作,要不不读取数据库我直接就可以添加了。。。。。

说的有点乱,请明白了的帮忙解决下,谢谢!!!

#5


引用 2 楼 jason_28693 的回复:
此类问题,我个人认为用递归 程序比较简单! 

或者一次性把菜单读取到本地数组后,再循环处理或者一次性递归处理!我个人觉得为了这么简单的一件事情多次访问数据库 
对应程序来说应该不合适或者说不是最好的选择!



to   jason_28693:
我也觉访问太多了,请具体说明下你的方面,最好加点代码说明,谢谢!!!
我主要想动态加载菜单,方便以后添加,权限设置还有什么意见吗?

#6


基本解决菜单问题了额。。。。

那个权限问题怎么解决?登陆时候如何进行判断?初步考虑是判断mark中有没有关于权限设置的数字,
1,2,3指的是几个管理员操作员能访问的数字设置。。。

看有没有其他的什么解决办法。。。

#1


直接在初始读数据库数据的时候 没有权限的菜单项就不读了

此菜单项就不会出现在用户菜单列表里了

菜单超过九个有问题不明白什么意思

#2


此类问题,我个人认为用递归 程序比较简单!

或者一次性把菜单读取到本地数组后,再循环处理或者一次性递归处理!我个人觉得为了这么简单的一件事情多次访问数据库
对应程序来说应该不合适或者说不是最好的选择!

#3


 我同意   jason_28693  的方法!!

#4


引用 1 楼 sparklerl 的回复:
直接在初始读数据库数据的时候 没有权限的菜单项就不读了 

此菜单项就不会出现在用户菜单列表里了 

菜单超过九个有问题不明白什么意思

我明白你的意思,我的也是这个意思,就是有权限的就读出来,没有权限的就不读出来或者不可见,但是假如我让上面表中的2  0  b 不能读出来怎么设置?实施起来有点麻烦,这样指定了第一级的,后面的菜单都要不可见,不可能看不见主菜单却看见下面的子菜单了。。。

9个的问题是我建表是用的 主菜单用1 ---  9  第一级的子菜单用的是11 12 13 即第一个菜单的第一个子菜单这样命名的方式 超过了9个就不好命名了,有点局限性,我现在设置用a---z试试  你主菜单还超过26个了还。。。
这样设置是为了方面对以后的操作,要不不读取数据库我直接就可以添加了。。。。。

说的有点乱,请明白了的帮忙解决下,谢谢!!!

#5


引用 2 楼 jason_28693 的回复:
此类问题,我个人认为用递归 程序比较简单! 

或者一次性把菜单读取到本地数组后,再循环处理或者一次性递归处理!我个人觉得为了这么简单的一件事情多次访问数据库 
对应程序来说应该不合适或者说不是最好的选择!



to   jason_28693:
我也觉访问太多了,请具体说明下你的方面,最好加点代码说明,谢谢!!!
我主要想动态加载菜单,方便以后添加,权限设置还有什么意见吗?

#6


基本解决菜单问题了额。。。。

那个权限问题怎么解决?登陆时候如何进行判断?初步考虑是判断mark中有没有关于权限设置的数字,
1,2,3指的是几个管理员操作员能访问的数字设置。。。

看有没有其他的什么解决办法。。。