Cita:
Empezado por Neftali [Germán.Estévez]
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
procedure ToggleTreeViewCheckBoxes(Node:TTreeNode; cUnChecked, cChecked: Integer);
public
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
for i:= 0 To (Menu.Count - 1) Do Begin
If Not(Menu.Parent Is TMenuItem) then begin
Nodo:= TreeView1.Items.Add(Nil, Menu.Items[i].Caption);
Nodo.ImageIndex := Menu.Items[i].ImageIndex;
End
Else begin
Nodo:= TreeView1.Items.AddChild(Nod, Menu.Items[i].Caption);
Nodo.ImageIndex := Menu.Items[i].ImageIndex;
end;
If Menu.Items[i].Count > 0 Then begin
VerificaMenu(Menu.Items[i], Nodo);
end;
End;
End;
begin
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 iParent := tblOpcMenu.FieldByName('NODO_PADRE').AsInteger; if (iParent = -1) then begin tv := TreeView1.Items.Add(nil, tblOpcMenu.FieldByName('OPC_DESCRIPCION').AsString); tvParent := tv; end
else 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;
begin
tblOpcMenu.Open; for i := 0 to (TreeView1.Items.Count -1) do begin tv := TreeView1.Items[i]; tblOpcMenu.Append;
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.