用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.第三个问题,也是最关键的问题,怎么能把权限保存到数据库里.
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.第三个问题,也是最关键的问题,怎么能把权限保存到数据库里.
第二个问题没仔细看
第三个问题是看你数据库是怎么设计的了
我的数据数据库sql2000,用户表有三个字段,姓名,口令,权限(text型,想把下拉菜单的name存到里面)
if ....='-' then
break//continue;
如果此用户名有此权限就显示节点名为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节点,其相应的菜单节点名称
怎么知道呢?
...
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表示有操作权限。
第二个问题及第三个问题.设置一个权限表, 里面有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;
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;