楼主不嫌麻烦的话可以在form.create属性下写代码去判断用户对各菜单的权限。 先读取权限值存入str变量,然后用copy函数取得各位的数值:q1 := copy(str,1,1) 再进行判断,if q1=0 then N1.enable := false;
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;
我写了一个,大家给点意见。测试可行。 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;
少了一个调用,no必须为0; preOrder(m,0);
大家参考: 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;
根据菜单的index来copy该index索引的值吧
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;
只要取出某一位判断是否为0就行了, qx and $0001 <> 0 then 1位有权限
ActionList与菜单或按钮绑定,即可。
先读取权限值存入str变量,然后用copy函数取得各位的数值:q1 := copy(str,1,1)
再进行判断,if q1=0 then N1.enable := false;
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;
2、读取权限值 cs(字符串值);
for i := 1 to Length(CS) do
begin
菜单.Visible:=Bool(strtoint(CS[i]));
end;
启动后,讲菜单顺序读取到一个队列或栈中,通俗的点说就是读取到一个listbox中保存,在进行菜单操作时,根据菜单项内容,得出菜单在队列中序号,然后获取用户权限字符串相应位置的字符内容,1有权操作,0无权操作
var
s:String;s:=adoquery1.FieldByName('qx').asstring;btn1.Enabled:=s[1]='1';
btn2.Enabled:=s[2]='1';
btn3.Enabled:=s[3]='1';
硬写吧。
写到数据库里,不是蛮方便的吗? ref #8
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;
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;
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;