Ver Mensaje Individual
  #2  
Antiguo 14-08-2011
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 4.214
Reputación: 24
newtron Va camino a la fama
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 ;
  // Primero creo el arbol con las opciones del menú
  LinMenu:=FormMenu.MenuPrincipal.Items.Count;
  TreeView1.Items.Clear;
  for N:=0 To LinMenu-1 do begin
    // Inserto Nodo padre
    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;
  // Desmarco todas las opciones
  NtButton2.Click;
  // Una vez creado compruebo si tiene lineas para chequear o quitar
  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
  // Borro y vuelvo a regenerar lineas de permisos
  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;
    // Solo incluyo los permitidos
    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 [-]
    // COMPONGO MENU SEGUN USUARIO
    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
__________________
Be water my friend.

Última edición por newtron fecha: 14-08-2011 a las 09:44:41.
Responder Con Cita