Hola.
Te comento como lo hago yo.
Aparte del fichero de usuarios que ya tienes yo manejo un fichero de opciones activas del menú por cada usuario. Tengo un mantenimiento de este fichero en el cuál por cada usuario se activan o desactivan las opciones del menú a las que puede acceder el mismo. Para esto uso un treeview que creo en función a las opciones del menú y se pueden activar o desactivar las mismas que quedaría de la siguiente manera:

Uploaded with
ImageShack.us
El código para componer las opciones a partir del menú es el siguiente:
Código Delphi
[-]
procedure TNTFormUsuarios.ActualizoArbol;
var
LinMenu,LinHijos,N,M: SmallInt;
NodoPadre,NodoHijo: TTreeNode;
TablaLin: TedbTable;
sAux: String;
begin
Screen.Cursor := CrSqlWait;
TablaLin:=Bd.DameTabla('USUARIOSLINEAS');
TablaLin.IndexName := 'USUARIO';
TablaLin.SetRangeStart ;
TablaLin.FieldByName('USUARIO').AsString:=NtEditCodigo.DameValor;
TablaLin.SetRangeEnd ;
TablaLin.FieldByName('USUARIO').AsString:=NtEditCodigo.DameValor;
TablaLin.ApplyRange ;
LinMenu:=FormMenu.MenuPrincipal.Items.Count;
TreeView1.Items.Clear;
for N:=0 To LinMenu-1 do begin
NodoPadre:=TreeView1.Items.Add(nil,StrTran(FormMenu.MenuPrincipal.Items[N].Caption,'&',''));
LinHijos:=FormMenu.MenuPrincipal.Items[N].Count;
for M:=0 To LinHijos-1 do begin
if FormMenu.MenuPrincipal.Items[N].Items[M].Caption<>'-' then begin
NodoHijo:=TreeView1.Items.AddChild(NodoPadre,StrTran(FormMenu.MenuPrincipal.Items[N].Items[M].Caption,'&',''));
NodoHijo.StateIndex := 1;
end;
end;
end;
NtButton2.Click;
TablaLin.First;
while not TablaLin.Eof do begin
for N:=0 to Treeview1.Items.Count-1 do begin
if (TreeView1.Items[N] as TTreeNode ).Level=0 then
sAux:=TreeView1.Items[N].Text;
if TablaLin.FieldByName('OPCION').AsString=sAux+'#'+TreeView1.Items[N].Text then begin
TreeView1.Items[N].StateIndex := 2;
break;
end;
end;
TablaLin.Next;
end;
Screen.Cursor := CrDefault;
end;
Con este código creo el árbol de opciones del menú y las activo o desactivo en función de si está la opción en la tabla o no. En la misma linea del registro pongo el nombre del caption del MenuItem (el que sale en la parte superior)+ '#' + el caption de la opción del MenuItem que sale en el menú.
Cuando grabas el usuario con las opciones de menú chequeadas hago lo siguiente:
Código Delphi
[-]
procedure TNTFormUsuarios.RegistroGrabado(Sender: TObject);
var
TablaLin: TedbTable;
N: SmallInt;
sAux: String;
begin
DataModule1.EDBQuery1.SQL.Clear;
DataModule1.EDBQuery1.SQL.Add('DELETE FROM USUARIOSLINEAS WHERE USUARIO='+QuotedStr(NtEditCodigo.Damevalor));
DataModule1.EDBQuery1.ExecSQL;
TablaLin:=Bd.DameTabla('USUARIOSLINEAS');
for N:=0 to Treeview1.Items.Count-1 do begin
if (TreeView1.Items[N] as TTreeNode ).Level=0 then
sAux:=TreeView1.Items[N].Text;
if TreeView1.Items[N].StateIndex = 2 then begin
TablaLin.Append;
TablaLin.FieldByName('USUARIO').AsString:=NtEditCodigo.Damevalor;
TablaLin.FieldByName('OPCION').AsString:=sAux+'#'+TreeView1.Items[N].Text ;
TablaLin.Post;
end;
end;
Bd.CierraTabla(TablaLin);
end;
Con esto dejo en la tabla de lineas por usuario solo las opciones de menú permitidas para el usuario, las demás no las grabo.
Después de esto ya solo te queda poner en el menú principal las acciones para habilitar o deshabilitar las opciones de menú según te interese:
Código Delphi
[-]
Tablausuarios:=Bd.DameTabla ('USUARIOS');
TablaUsuarios.IndexName:='CODIGO';
TablaUsuarios.FindKey ([Ntlabel3.caption]);
DataModule1.EDBQuery1.SQL.Clear;
DataModule1.EDBQuery1.SQL.Add('SELECT * FROM USUARIOSLINEAS WHERE UPPER(USUARIO)='+QuotedStr(UpperCase(NtLabel3.Caption)));
DataModule1.EDBQuery1.ExecSQL;
DataModule1.EDBQuery1.First;
while not DataModule1.EDBQuery1.Eof do begin
sAux:=DataModule1.EDBQuery1.FieldByName('OPCION').AsString;
for N:= 0 to MenuPrincipal.Items.Count-1 do begin
if StrTran(MenuPrincipal.Items[N].Caption,'&','') = Copy(sAux,1,Pos('#',sAux)-1) then begin
for M:=0 To MenuPrincipal.Items[N].Count-1 do begin
if Copy(sAux,Pos('#',sAux)+1,100)=MenuPrincipal.Items[N].Items[M].Caption then begin
MenuPrincipal.Items[N].Items[M].Enabled := True;
break;
end;
end;
end;
end;
DataModule1.EDBQuery1.Next;
end;
Espero que todo este rollo te ayude.
Saludos