Ver Mensaje Individual
  #8  
Antiguo 22-05-2020
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: nov 2003
Posts: 599
Reputación: 21
mRoman Va por buen camino
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
Creo que es más sencillo...

[/delphi]
Que tal Neftali

Anexo el código completo donde se carga las opciones del menu principal, agregando un checkbox a cada opción, para habilitar o deshabilitar la misma, para mas adelante, cuando se conecta el usuario al sistema, solo vea las opciones habilitadas, bueno ya se graba la información a la tabla -que por cierto le agregue campos-, pero como que el arbol no lo esta cargando bien desde la tabla, es decir, las subopciones no las inserta en los niveles que son.

Aparte estoy buscando la forma de como saber que opciones tiene CHECKED en el treeview para almacenar el dato y me sirva para habilitar o deshabilitar.

Envio el código completo: (Tengo un pagecontrol en el mismo formulario y hay código que nada que ver con el TreeView)

Código Delphi [-]
unit SegMenuNiv;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, Buttons, ToolWin, ExtCtrls, CommCtrl, StdCtrls, Mask,  DB,
  IBCustomDataSet, DBCtrls, sSkinProvider, IBQuery, Menus, IBTable, StrUtils;

type
  TfrmSegMenuNiv = class(TForm)
    Panel2: TPanel;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    Panel1: TPanel;
    Panel4: TPanel;
    Label1: TLabel;
    mskIDMenu: TMaskEdit;
    GroupBox1: TGroupBox;
    dsTipoMenu: TIBDataSet;
    dSoTipoMenu: TDataSource;
    dsTipoMenuMENU_TIPO_ID: TSmallintField;
    dsTipoMenuMENU_TIPO_DESCRIP: TIBStringField;
    dsTipoMenuMENU_HABILITAR: TIBStringField;
    DBEdit1: TDBEdit;
    Panel3: TPanel;
    btnGrabar: TBitBtn;
    btnCancelar: TBitBtn;
    sSkinProvider1: TsSkinProvider;
    Panel5: TPanel;
    Panel7: TPanel;
    Panel8: TPanel;
    Label2: TLabel;
    cbxTipoMenu: TDBLookupComboBox;
    GroupBox2: TGroupBox;
    TreeView1: TTreeView;
    Panel6: TPanel;
    btnGrabarCFG: TBitBtn;
    btnCancelarCFG: TBitBtn;
    GroupBox3: TGroupBox;
    DBCheckBox1: TDBCheckBox;
    btnEliminar: TBitBtn;
    qryTipoMenu: TIBQuery;
    dSoTipoMenuCFG: TDataSource;
    qryTipoMenuMENU_TIPO_ID: TSmallintField;
    qryTipoMenuMENU_TIPO_DESCRIP: TIBStringField;
    qryTipoMenuMENU_HABILITAR: TIBStringField;
    dsMenuOpCFG: TIBDataSet;
    dSoMenuOpCFG: TDataSource;
    qryMenu: TIBQuery;
    btnEliminarCFG: TBitBtn;
    qryMenuNODO_PADRE: TIntegerField;
    qryMenuNODO: TIntegerField;
    qryMenuOPC_DESCRIPCION: TIBStringField;
    qryMenuOPC_TAG: TIntegerField;
    tblOpcMenu: TIBTable;
    dsMenuOpCFGMENU_TIPO_ID: TSmallintField;
    dsMenuOpCFGNODO: TIntegerField;
    dsMenuOpCFGNODO_PADRE: TIntegerField;
    dsMenuOpCFGOPC_VISIBLE: TIBStringField;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Panel1Enter(Sender: TObject);
    procedure Panel1Exit(Sender: TObject);
    procedure btnGrabarClick(Sender: TObject);
    procedure btnEliminarClick(Sender: TObject);
    procedure btnCancelarClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Panel7Enter(Sender: TObject);
    procedure cbxTipoMenuCloseUp(Sender: TObject);
    procedure TreeView1Click(Sender: TObject);
    procedure btnGrabarCFGClick(Sender: TObject);
  private
    { Private declarations }
    procedure ToggleTreeViewCheckBoxes(Node:TTreeNode; cUnChecked, cChecked: Integer);
  public
    { Public declarations }
      i, iParent:integer;
      tv, tvParent:TTreeNode;
  end;

var
  frmSegMenuNiv: TfrmSegMenuNiv;
const cStateUnCheck = 1;
      cStateChecked = 2;

implementation
uses ModuloBD,MenuPrincipal;
{$R *.dfm}

procedure TfrmSegMenuNiv.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
   Action:=caFree;
end;

procedure TfrmSegMenuNiv.Panel1Enter(Sender: TObject);
begin
   dMod.trscMMS.Active:=False;
   dMod.trscMMS.StartTransaction;
   mskIDMenu.Text:='';
   
   btnGrabar.Enabled:=False;
   btnEliminar.Enabled:=False;
   btnCancelar.Enabled:=False;
end;

procedure TfrmSegMenuNiv.Panel1Exit(Sender: TObject);
begin
    dsTipoMenu.Close;
    dsTipoMenu.ParamByName('menu_id').AsString:=mskIDMenu.Text;
    dsTipoMenu.Open;
    if dsTipoMenu.IsEmpty then
    begin
         btnGrabar.Enabled:=True;
         btnEliminar.Enabled:=False;
         btnCancelar.Enabled:=True;
         dsTipoMenu.Append;
         dsTipoMenu.FieldByName('menu_tipo_id').AsString:=mskIDMenu.Text;
    end Else
    begin
         btnGrabar.Enabled:=True;
         btnEliminar.Enabled:=True;
         btnCancelar.Enabled:=True;
         dsTipoMenu.Edit;
    end;
end;

procedure TfrmSegMenuNiv.btnGrabarClick(Sender: TObject);
begin
    try
       dsTipoMenu.Post;
       dsTipoMenu.ApplyUpdates;
       dMod.trscMMS.Commit;
       Application.MessageBox('Datos grabados correctamente','Aviso',mb_ok+mb_IconInformation);
    except
       on E: Exception do
       begin
          Application.MessageBox('Los registros no pueden ser grabados, consulte al administrador del sistema','Error', mb_ok+mb_IconError);
          ShowMessage(E.Message);
          dMod.trscMMS.Rollback;
       end;
    end;
    mskIDMenu.SetFocus;
end;

procedure TfrmSegMenuNiv.btnEliminarClick(Sender: TObject);
begin
    try
       dsTipoMenu.Delete;
       dsTipoMenu.ApplyUpdates;
       dMod.trscMMS.Commit;
       Application.MessageBox('El Registro ha sido eliminado de forma correcta','Aviso',mb_ok+mb_IconInformation);
    except
       on E: Exception do
       begin
          Application.MessageBox('El Registro no se puede eliminar, consulte al administrador del sistema','Error', mb_ok+mb_IconError);
          ShowMessage(E.Message);
          dMod.trscMMS.Rollback;
       end;
    end;
    mskIDMenu.SetFocus;
end;

procedure TfrmSegMenuNiv.btnCancelarClick(Sender: TObject);
begin
     mskIDMenu.SetFocus;
end;

procedure TfrmSegMenuNiv.FormShow(Sender: TObject);
begin
    PageControl1.ActivePageIndex:=0;
    mskIDMenu.SetFocus;
end;

procedure TfrmSegMenuNiv.Panel7Enter(Sender: TObject);
begin
    dMod.trscMMS.Active:=False;
    dMod.trscMMS.StartTransaction;
    btnGrabarCFG.Enabled:=False;
    btnEliminarCFG.Enabled:=False;
    btnCancelarCFG.Enabled:=False;
    dsMenuOpCFG.Close;
    qryMenu.Close;
    qryTipoMenu.Close;
    qryTipoMenu.Open;
    qryTipoMenu.FetchAll;

end;

procedure TfrmSegMenuNiv.cbxTipoMenuCloseUp(Sender: TObject);
  //--------------------------------------------------------------------------
  procedure VerificaMenu(Menu: TMenuItem; Nod: TTreeNode);
  Var
    i: Integer;
    Nodo: TTreeNode;
  Begin
    // Para cada elemento del menu
    for i:= 0 To (Menu.Count - 1) Do Begin
      // Es un elemento correcto
      If Not(Menu.Parent Is TMenuItem) then begin
          // Crear el elemento  asignarle el índice de la imagen
          Nodo:= TreeView1.Items.Add(Nil, Menu.Items[i].Caption);
          Nodo.ImageIndex := Menu.Items[i].ImageIndex;
      End
      Else begin
        // Crear un hijo
        Nodo:= TreeView1.Items.AddChild(Nod, Menu.Items[i].Caption);
        Nodo.ImageIndex := Menu.Items[i].ImageIndex;
      end;

      // Llamada recursiva para los submenus
      If Menu.Items[i].Count > 0 Then begin
        VerificaMenu(Menu.Items[i], Nodo);
      end;
    End;
  End;
  //--------------------------------------------------------------------------

begin
  // Pasar el menú
  tblOpcMenu.Filter:='MENU_TIPO_ID='+IntToStr(cbxTipoMenu.KeyValue);
  tblOpcMenu.Filtered:=True;
  tblOpcMenu.Open;
  if tblOpcMenu.IsEmpty then
  begin
      btnGrabarCFG.Caption:='Grabar';
      btnGrabarCFG.Enabled:=True;
      btnEliminarCFG.Enabled:=False;
      btnCancelarCFG.Enabled:=False;
      VerificaMenu(frmMenu.MainMenu1.Items, Nil);
      SetWindowLong(TreeView1.Handle, GWL_STYLE, GetWindowLong(TreeView1.Handle, GWL_STYLE) or TVS_CHECKBOXES);
      TreeView1.FullExpand;
      TreeView1.Items.Item[0].Selected:=True;
  end Else
  begin
      btnGrabarCFG.Caption:='Actualizar';
      btnGrabarCFG.Enabled:=True;
      btnEliminarCFG.Enabled:=True;
      btnCancelarCFG.Enabled:=True;
      tblOpcMenu.First;
      while not tblOpcMenu.Eof do
      begin        // Recorrer los registros hasta el final
          iParent := tblOpcMenu.FieldByName('NODO_PADRE').AsInteger;     // buscar el nodo padre (los de primer nivel = -1)
          if (iParent = -1) then begin           // Los de primer nivel...
             tv := TreeView1.Items.Add(nil, tblOpcMenu.FieldByName('OPC_DESCRIPCION').AsString);   // Se añaden
             tvParent := tv;                      // es un nodo padre
          end
          else                                   // Los que no son de primer nivel, loos añado al padre
             tv := TreeView1.Items.AddChild(tvParent, tblOpcMenu.FieldByName('OPC_DESCRIPCION').AsString);
          tblOpcMenu.Next;
      end;
      tblOpcMenu.Close;
  end;
end;

procedure TfrmSegMenuNiv.TreeView1Click(Sender: TObject);
var
   P: TPoint;
begin
   GetCursorPos(P);
   P := TreeView1.ScreenToClient(P);
   if (htOnStateIcon in TreeView1.GetHitTestInfoAt(P.X, P.Y)) then
      ToggleTreeViewCheckBoxes(TreeView1.Selected, cStateUnCheck, cStateChecked);
end;

procedure TfrmSegMenuNiv.ToggleTreeViewCheckBoxes(Node: TTreeNode; cUnChecked,
  cChecked: Integer);
begin
   if Assigned(Node) then
   begin
      if Node.StateIndex = cUnChecked then
         Node.StateIndex := cChecked
      else if Node.StateIndex = cChecked then
         Node.StateIndex := cUnChecked;
   end;
end;


procedure TfrmSegMenuNiv.btnGrabarCFGClick(Sender: TObject);
var
  i, nNodoPadre : integer;
//  tv : TTreeNode;
begin

  tblOpcMenu.Open;                                      // Abrir la tabla
  for i := 0 to (TreeView1.Items.Count -1) do begin     // recorro el treeview
    tv := TreeView1.Items[i];                           // accedo al nodo
    tblOpcMenu.Append;
    // Si es un nodo de primer nivel (-1), si no, me apunto el padre
    if ( Assigned(tv.Parent) ) then
       nNodoPadre:=tv.Parent.Index
    else
       nNodoPadre:=-1;

    tblOpcMenu.FieldByName('MENU_TIPO_ID').AsInteger:=cbxTipoMenu.KeyValue;
    tblOpcMenu.FieldByName('NODO_PADRE').AsInteger := nNodoPadre;
    tblOpcMenu.FieldByName('NODO').AsInteger := tv.Index;
    tblOpcMenu.FieldByName('OPC_DESCRIPCION').AsString := tv.Text;
    tblOpcMenu.FieldByName('OPC_TAG').AsInteger := tv.AbsoluteIndex;
    tblOpcMenu.FieldByName('OPC_VISIBLE').AsInteger:=tv.StateIndex;

    tblOpcMenu.Post;

  end;
  tblOpcMenu.Close;
end;

end.

Espero me puedan ayudar a almacenar el CHECKED y el UNCHECKED de cada nodo en la tabla, que por cierto tuvo cambios:
Código SQL [-]
CREATE TABLE SEG_MENU_OPC_CONFIG (
    MENU_TIPO_ID     NUMERIC(2,0) NOT NULL,
    NODO_PADRE       INTEGER NOT NULL,
    NODO             INTEGER NOT NULL,
    OPC_VISIBLE      VARCHAR(5),
    OPC_DESCRIPCION  VARCHAR(60),
    OPC_TAG          INTEGER
);

Saludos y muchas gracias por su tiempo a todos.
__________________
Miguel Román

Afectuoso saludo desde tierras mexicanas....un aguachile?, con unas "cetaseas" bien "muertas"?, VENTE PUES !!
Responder Con Cita