如何做菜单权限管理(要求很简单有一串字符111100,1有权限,0无权限)权限表只有一个如下:xm                qx             pass系统管理员    111111111111       1231 
张三          010011110010       41132

解决方案 »

  1.   

    什么意思?
    只要取出某一位判断是否为0就行了, qx and $0001 <> 0 then 1位有权限
      

  2.   

    读取权限至字符串,与ActionList配合,因为字符串也是数组,所以与ActionList配合使用很方便。
    ActionList与菜单或按钮绑定,即可。
      

  3.   

    楼主不嫌麻烦的话可以在form.create属性下写代码去判断用户对各菜单的权限。
    先读取权限值存入str变量,然后用copy函数取得各位的数值:q1 := copy(str,1,1)
    再进行判断,if q1=0 then N1.enable := false;  
      

  4.   

    1、将所有菜单全部不可见或者不可用;
    2、读取权限值 cs;
    3、循环用 and 找出值不为 0 的权限值,然后找到相应菜单,然后让其可见或者可用,例如:
    for i := 0 to 31 do begin
    c := 1 shl i;
    if (cs and c) > 0 then begin
    ...
    end;
    end;
      

  5.   

    楼主可以将所有菜单不可用或不可见,然后取出权限字符串将对应位转换为0或者1 直接 enable 或者visible = 值即可
      

  6.   

    代码最少的办法: 在集合中(如数据库)保存各个控件(按扭/菜单/等)的name,登录时遍历窗体控件,不同用户查询的集合不同,非集合内的name一律禁用(或设置不可见)。
      

  7.   

    1、将所有菜单全部不可见或者不可用;
    2、读取权限值 cs(字符串值);
    for i := 1 to Length(CS) do
    begin
       菜单.Visible:=Bool(strtoint(CS[i]));
    end;
      

  8.   

    自动遍历得出所有菜单项,对每个菜单项进行权限设置,即设置有权操作的用户,按照遍历菜单顺序,为每个用户生成一个权限字符串保存,然后将菜单顺序保存。
    启动后,讲菜单顺序读取到一个队列或栈中,通俗的点说就是读取到一个listbox中保存,在进行菜单操作时,根据菜单项内容,得出菜单在队列中序号,然后获取用户权限字符串相应位置的字符内容,1有权操作,0无权操作
      

  9.   

    有更简单的。
    var
      s:String;s:=adoquery1.FieldByName('qx').asstring;btn1.Enabled:=s[1]='1';
    btn2.Enabled:=s[2]='1';
    btn3.Enabled:=s[3]='1';
    硬写吧。
      

  10.   

    不过提醒你一下,虽然简单。不能扩展,一旦扩展,代码重改。
    写到数据库里,不是蛮方便的吗? ref #8
      

  11.   

    我写了一个,大家给点意见。测试可行。
    function preOrder(sender:TObject;no:integer):integer;
    var
      node:TMenuItem;
      root:TMainMenu;
      i:integer;
    begin//
      result:=no;
      if(sender is TMainMenu) then begin
        root:=sender as TMainMenu;
        if root<>nil then
          for i:=0 to root.Items.Count-1 do begin
            inc(result);
            result:=preOrder(root.Items[i],result);
          end;
      end
      else begin
        node:=sender as TMenuItem;
        doSomeThing(node,'1000111110100',no);
        if node<>nil then begin
          for i:=0 to node.Count-1 do begin
            inc(no);
            result:=preOrder(node.Items[i],no);
          end;
        end;
      end;
    end;procedure doSomeThing(node:TMenuItem;right:string;no:integer);
    begin    //
      node.Enabled:=right[no]='1';
    end;
      

  12.   

    少了一个调用,no必须为0;  preOrder(m,0);
      

  13.   

    大家参考:
    procedure TfMCzy.tvMenuGetImageIndex(Sender: TObject; Node: TTreeNode);
    begin
      if (not pmItem(node.data).enabled) then
      begin
        node.imageindex:=1;
        node.SelectedIndex:=1;
      end
      else
      begin
        node.imageindex:=0;
        node.SelectedIndex:=0;
      end;
    end;
    procedure TfMCzy.tvMenuGetSelectedIndex(Sender: TObject; Node: TTreeNode);
    begin
      if (pmItem(node.data).enabled) then
        node.selectedIndex:=0
      else
        node.selectedIndex:=1;
    end;
    procedure TfMCzy.tvMenuMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      aNode:TTreeNode;
      R:tRect;
    begin
      aNode:=Ttreeview(Sender).getNodeAt(x,y);
      if aNode<>nil then
      begin
        R:=aNode.DisplayRect(True);
        if (y>=r.top) and (y<=r.bottom) and (x<r.left-4) and (x>r.left-18) then
        begin
          pmItem(aNode..data).enabled:=not pmItem(aNode.data).enabled;
          EnItemsChanged:=True;
          SetChildrenSelState(aNode,pmItem(aNode.data).enabled);
          if aNode.Parent<>nil then
            SetParentSelState(aNode);
          tvMenuGetSelectedIndex(Sender,aNode);
          Ttreeview(Sender).Refresh;
        end;
        tvMenu.Selected:=aNode;
      end;
    end;
    procedure TfMCzy.setChildrenSelState(aNode: TTreeNode; SelState: boolean);
    var
      bNode:TTreeNode;
    begin
      bNode:=aNode.getFirstChild;
      while bNode<>nil do
      begin
        if pmItem(bNode.data).enabled<>selState then
          pmItem(bNode.data).enabled:=selState;
        if  bNode.HasChildren then
          setChildrenSelState(bNode,selState);
        bNode:=bNode.getNextSibling;
      end;
    end;
    procedure TfMCzy.setParentSelState(aNode: TTreeNode);
    var
      bNode:TTreeNode;
    begin
      bNode:=aNode.Parent;
      while bNode<>nil do
      begin
        pmItem(bNode.data).enabled:=hasChildrenSelected(bNode);
        bNode:=bNode.Parent;
      end;
    end;
    function TfMCzy.hasChildrenSelected(aNode: TTreeNode): Boolean;
    var
      has:Boolean;
      bNode:TTreeNode;
    begin
      has:=False;
      bNode:=aNode.getFirstChild;
      while bNode<>nil do
      begin
        has:=pmItem(bNode.data).enabled;
        if (not has) and bNode.HasChildren then
          has:=hasChildrenselected(bNode);
        if has then break;
        bNode:=bNode.getNextSibling;
      end;
      Result:=has;
    end;
    procedure TfMCzy.getMenuItem(Item: TMenuItem; aNode: TTreeNode);
    var
      i:integer;
      bNode:tTreeNode;
      mItem:pmItem;
    begin
      for i:=0 to item.count-1 do
      begin
        if (item.Items[i].caption='-') then
          continue;
        new(mItem);
        mItem.name:=item.Items[i].name;
        mItem.Caption:=item.Items[i].Caption;
        mItem.enabled:=False;
    //    mItem.enabled:=item.Items[i].enabled;
        mItem.father:=Item.name;
        bNode:=tvMenu.items.AddchildObject(aNode,item.Items[i].caption,mItem);
        if item.Items[i].count>0 then
          getMenuItem(item.Items[i],bNode)
      end;
    end;
    procedure TfMCzy.bRefreshClick(Sender: TObject);
    begin
      tvMenu.Items.Clear;
      getMenuItem(fXfMain.MainMenu1.Items,nil);
      tCzyAfterScroll(dmxf.tCzy);
    end;
    procedure TfMCzy.tCzyAfterScroll(DataSet: TDataSet);
    var
      i:integer;
    begin
      //设置允许的菜单
      for i:=0 to tvMenu.items.count-1 do
        pmItem(tvMenu.items[i].data).enabled:=
          pos('<'+pmItem(tvMenu.items[i].data).name+'>',DataSet.FieldByname('enItem').asString)>0;
      tvMenu.Refresh;
    //  EnItemsChanged:=False;
    end;
    procedure TfMCzy.tCzyBeforeScroll(DataSet: TDataSet);
    var
      enItems:string;
      i:integer;
    begin
      //保存允许的菜单
      if not EnItemsChanged then
        exit;
      EnItemsChanged:=False;
      enItems:='';
      for i:=0 to tvMenu.items.count-1 do
        if pmItem(tvMenu.items[i].data).enabled then
          enItems:=enItems+'<'+pmItem(tvMenu.items[i].data).name+'>';
      DataSet.edit;
      DataSet.FieldByName('ENITEM').value:=enItems;
      DataSet.post;
      if DataSet.FieldByName('id').value=dmxf.czyId then
        fXfMain.getMenuitem(fXfMain.mainMenu1.items,nil);
    end;
      

  14.   

    根据菜单的index来copy该index索引的值吧
      

  15.   


    function GetNum(Popnum: string; Position: Byte): Boolean;
    begin
    if Copy(Popnum, Position, 1) = '1' then
    Result := True
    else
    Result := False;
    end;eg:
                          if not GetNum(permission, 1) then
    begin
       ……
    end;