用treeview建立用户权限遇到以下问题,请高手帮忙解决:1.菜单转树目录代码如下,但是遇到菜单的分节符"-"也显示在树目录里面,怎么在目录树里面去掉它呢?
function Tczywhfrm.InitMenu(MainMenu: TMainMenu; ItemsOwner: TTreeView): TTreeNodes;
procedure lop(SubMenu:TMenuItem;var TreeItem:TTreeNodes;SubNode:TTreeNode);
var
SCount,Slop:integer;
SSubNode:TTreeNode;
begin
SCount := SubMenu.Count;
For Slop := 1 to SCount do
begin
SSubNode := TreeItem.AddChild(subNode,SubMenu.items[Slop-1].Caption);
SSubNode.StateIndex := 1;
Lop(SubMenu.Items[Slop-1],TreeItem,SSubNode);
end;
end;
var
RetuMenu:TTreeNodes;
SubItem,ParentItem:TTreeNode;
MenuCount,lops:integer;
begin
Result:=nil;
RetuMenu:=TTreeNodes.Create(ItemsOwner);
ParentItem:=RetuMenu.AddFirst(nil,'系统权限');
ParentItem.ImageIndex:=2;
parentitem.SelectedIndex:=3;
MenuCount:=MainMenu.Items.Count;
for lops := 0 to MenuCount-1 do
begin
SubItem := RetuMenu.Addchild(ParentItem,MainMenu.Items[lops].Caption);
SubItem.StateIndex := 0;
lop(MainMenu.Items[lops],RetuMenu,SubItem);
end;
Result := RetuMenu;
end;
2.权限管理问题
代码如下
procedure Tczywhfrm.TreeView1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure pSelect(mTreeNode: TTreeNode; mChecked: Boolean);
var
I: Integer;
begin
mTreeNode.ImageIndex := Ord(mChecked);
mTreeNode.SelectedIndex := Ord(mChecked);
for I := 0 to mTreeNode.Count-1 do pSelect(mTreeNode[I], mChecked);
end;
procedure pUpdate(mTreeNode: TTreeNode);
var
I: Integer;
S: set of Byte;
begin
while Assigned(mTreeNode.Parent) do
begin
S := [];
for I := 0 to mTreeNode.Parent.Count - 1 do
Include(S, mTreeNode.Parent[I].ImageIndex);
if S = [0] then
begin
mTreeNode.Parent.ImageIndex := 0;
mTreeNode.Parent.SelectedIndex := 0;
end else
if S = [1] then
begin
mTreeNode.Parent.ImageIndex := 1;
mTreeNode.Parent.SelectedIndex := 1;
end else
begin
mTreeNode.Parent.ImageIndex := 1;
mTreeNode.Parent.SelectedIndex := 1;
end;
mTreeNode := mTreeNode.Parent;
end;
end;
var
vTreeNode: TTreeNode;
begin
if not (htOnIcon in TTreeView(Sender).GetHitTestInfoAt(X, Y)) then Exit;
vTreeNode := TTreeView(Sender).GetNodeAt(X, Y);
TTreeView(Sender).Items.BeginUpdate;
try
pSelect(vTreeNode, vTreeNode.ImageIndex = 0);
pUpdate(vTreeNode);
finally
TTreeView(Sender).Items.EndUpdate;
end;
end;
我的问题是想使树的最上层即'系统权限'节点打开时显示图片3,全部收缩时显示图片2,而不是赋给权限值.
3.第三个问题,也是最关键的问题,怎么能把权限保存到数据库里.

解决方案 »

  1.   

    TreeView使用问题。偏要说成权限问题。妈的。
      

  2.   

    第一个问题应该是在循环中判断menu是否是-,如果是则break掉
    第二个问题没仔细看
    第三个问题是看你数据库是怎么设计的了
      

  3.   

    怎么break掉.
    我的数据数据库sql2000,用户表有三个字段,姓名,口令,权限(text型,想把下拉菜单的name存到里面)
      

  4.   

    加判断
    if ....='-' then
     break//continue;
      

  5.   

    数据库user字段name(用户名) 字段psw(密码) 字段enable(权限text型,存主菜单名节点名称比如<n1><n2><n4><n11><n15><t1><t2>)
    如果此用户名有此权限就显示节点名为n1,n2,n4,n11,n15,t1,t2的菜单,其它不显示.
    adoquery1.sql.clear;
    adoquery1.sql.add(select enabel from user where name='用户名');
    adoquery1.open;
    a1:= mainmenu1.items[i].count-1;
    for i:=0 to a1 do
    下面就不会写了,因为enable字段里有很多个菜单名称存在里面,想用包含语句,好像没这说法,请高手帮帮忙.先谢谢了!
    if adoquery1.FieldByName('enable').asstring 包含 mainmenu1.items[i].name 
    .
    .
     then 
    mainmenu1.items[i].visable:=true;当在treeview权限设置点击节点,通过图片转换时,相应的菜单节点名称会自动存入enable里面.关键问题是点击treeview节点,其相应的菜单节点名称
    怎么知道呢?
      

  6.   

    第一个问题:
    ...
    for lops := 0 to MenuCount-1 do 
    begin 
    if MainMenu.Items[lops].Caption = '-' then continue;
    SubItem := RetuMenu.Addchild(ParentItem,MainMenu.Items[lops].Caption); 
    SubItem.StateIndex := 0; 
    ...第二个问题没有去研究
    第三个问题:
    我一般没有按菜单去设置权限,而是按功能模块去设置,系统有多少功能模块我是知道的,并且保存在数据库的一个表中,
    该表中有模块的上下级关系,这样才可以方便地生成树结构;然后在权限中有个字段来表示权限,其值如 1111010001011101 这样,
    多少位表示有多少个功能模块,每位对应为1表示有操作权限。
      

  7.   

    zhouzuoji,不怪别人说你,你还真把你妈挂嘴边了``无耻
      

  8.   

    第一个问题,就是放一个ImageList, 里面放两个图片,分别对应关闭和展开时要显示的图片, 然后,设置treeview的images属性为该ImageList即可.
    第二个问题及第三个问题.设置一个权限表, 里面有treeview的ID及一个权限标志(如1代表允许, 0代表禁止),然后每一个treeview的Item对应一个ID及标志.
    在显示Treeview时,从数据库中读取权限表,如果该Item对应的标志为0的话,不向Treeview中添加该Item就行了。关于为TreeView的Item添加属性值:
    1、定义指针、类,如:
      PNodeInfos = ^TNodeInfos;
      TNodeInfos = record
        Id: String;
        ParentId: String;
        Captions: String;
        IconIndex: Integer;
        //...你可以任意添加你想附加的信息
      end;2、在显示Treeview时,为Item添加信息, 下面的例子是从数据表中取出数据,生成树,并为每个项目添加相应的附加信息procedure TForm1.SetTreeView;
    var
      Node, RootNode, SubNode: TTreeNode;
      PNode: PNodeInfos;
      DataSet: TClientDataSet;//也可以用ADOQuery等
      IsDelete: Boolean;
    begin
      TreeView1.Items.Clear;
      new(PNode);
      RootNode := TreeView1.Items.AddChild(nil, '根');
      PNode^.Id := '0';
      PNode^.ParentId := '0';
      PNode^.Captions := '根';
      RootNode.Data := PNode;
      RootNode.ImageIndex := 0;
      RootNode.SelectedIndex := 1;  DataSet := TClientDataSet.Create(nil);
      try
        with DataSet do
        begin
          Data := GetRoomTreeData;//取树对应的表的数据
          while not Eof do
          begin
            if FieldbyName('PID').AsString = '0' then//在此可以判断是否有权限显示此项目,如无可以跳过,自已写吧
            begin
              new(PNode);
              SubNode := TreeView1.Items.AddChild(RootNode, FieldByName('Captions').AsString);
              PNode^.Id := FieldByName('KID').AsString;
              PNode^.ParentId := '0';
              PNode^.Captions := FieldByName('Captions').AsString;
              //.......其它信息
              SubNode.Data := PNode;
              SubNode.ImageIndex := 0;
              SubNode.SelectedIndex := 1;
              DataSet.Delete;
            end else
              Next;
          end;    // while
          First;
          while True do
          begin
            while not Eof do
            begin
              Node := TreeView1.Items.GetFirstNode;
              while Node <> nil do
              begin
                IsDelete := False;
                if PNodeInfos(Node.Data)^.Id = FieldByName('PID').AsString then
                begin
                  New(PNode);
                  SubNode := TreeView1.Items.AddChild(Node, FieldByName('Captions').AsString);
                  PNode^.Id := FieldByName('KID').AsString;
                  PNode^.ParentId := FieldByName('PID').AsString;
                  PNode^.Captions := FieldByName('Captions').AsString;
                  //.......其它信息
                  SubNode.Data := PNode;
                  SubNode.ImageIndex := 0;
                  SubNode.SelectedIndex := 1;
                  IsDelete := True;
                  DataSet.Delete;
                  break;
                end else
                  Node := Node.GetNext;
              end;
              if IsDelete then Continue else Next;
            end;
            if DataSet.RecordCount = 0 then break else
            begin
              if Eof then First else Next;
            end;
          end;    // while
        end;    // with
      finally
        DataSet.Free;
      end;
      TreeView1.Items.Item[0].Selected := True;;
      TreeView1.Items.Item[0].Expand(True);
    end;3、当点击时取出相应的值
    procedure TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      ClickInfo:THitTests;
      S: String;
    begin
      ClickInfo:=Treeview1.GetHitTestInfoAt(X,Y);
      if htOnItem in ClickInfo then
      begin
        S := PNodeInfos(TreeView1.Selected.Data)^.Id;
        //以此类推,可取出所有的附加信息
      end;
    end;
      

  9.   

    1.你在生成之前做一下判断if SubMenu.items[Slop-1].Caption <> '-' then
    2.判断level
    3.用TBlobStream保存
    delphi的例子:
    procedure TForm1.Button1Click(Sender: TObject);var
      Stream1: TBlobStream;
      Stream2: TStream;
    begin
      Stream1 := TBlobStream.Create(Table1Notes, bmRead);
      try
        ClientDataSet1.Edit;
        { here抯 a different way to create a blob stream } 
        Stream2 := ClientDataSet1.CreateBlobStream(ClientDataSet1.FieldByName('Res'), bmReadWrite);
        try
          Stream2.CopyFrom(Stream1, Stream1.Size);
          ClientDataSet1.Post;
        finally
          Stream2.Free;
        end;  finally
        Stream1.Free;
      end;
    end;