Tema: TreeView
Ver Mensaje Individual
  #2  
Antiguo 31-12-2007
egbaquela egbaquela is offline
Miembro
 
Registrado: jul 2007
Posts: 21
Reputación: 0
egbaquela Va por buen camino
Smile TreeView

Hola Lenocb: yo tuve que hacer un sistema que hacia algo parecido, mostraba los datos de una tabla en un treeview y, modificando la estructura del treeview, modificaba las relaciones padre-hijo en la tabla. Esta hecho para un sistema que gestiona auditorías y permite realizar análisis de arbol de causas.

Te paso a continuación el código para mostrar la tabla en el treeview con comentarios:

Código Delphi [-]
procedure TFrmAuditoriaArbolCausa.CargarTree(Sender: TObject; SQL: String);
//Esta rutina permite mostrar los resultados de una consulta
//en un TreeView. Para ello la consulta debe estar estructurada
//de la siguiente forma:
//      Campo 'Codigo', Integer (ID del registro)
//      Campo 'Descripcion', String (valor a mostrar en el nodo)
//      Campo 'Padre', Integer (ID del padre del registro)
//La consulta debe mostrar relaciones padre e hijo, siendo
//ambos registros de la consulta en cuestión.
//Los registros sin padre deben tener el valor '0' en su
//campo 'padre'. De esto se desprende que ningún registro puede
//tener un 'Codigo'=0.

var
  I, X, N: Integer;
  Nod: TTreeNode;
  NodSuplementario: TTreeNode;
  MiPunteroInteger: PunteroInteger;
begin

  // Cargo la consulta a mostrar en el TreeView
  Query1.SQL.Clear;
  Query1.SQL.ADD(SQL);
  Query1.Active := True;

  //Recorro la consulta registro por registro
  Query1.First;
  for X:=0 to (Query1.RecordCount-1) do
    begin
      I:=Query1.fieldByName('Padre').asinteger;
      // Si el campo padre vale 0 (no tiene padre)
      if I=0 then
        begin //Agrego un nuevo nodo, que nazca directamente del raíz
          Nod:=TreeView1.Items.Add (nil,Query1.FieldByName('Descripcion').asstring);
          New(MiPunteroInteger);
          MiPunteroInteger^:=Query1.Fieldbyname('Codigo').asinteger;
          nod.Data:=MiPunteroInteger;
          nod.Selected :=true;
        end
      else
        begin //Agrego un nuevo nodo hijo al padre que le corresponda
          //Recorro desde el último nodo al primero, hasta que la propiedad data (donde guardo
          //el código de cada nodo, sea igual al campo padre del nodo a agregar
          N:=TreeView1.Items.Count -1;
          while PunteroInteger(TreeView1.Items[N].Data)^ <>I do
            Dec(N);
          //Agrego el nodo hijo
          nodSuplementario:=TreeView1.Items.AddChild(TreeView1.Items[N],Query1.FieldByName('Descripcion').asstring);
          New(MiPunteroInteger);
          MiPunteroInteger^:= Query1.Fieldbyname('Codigo').asinteger;
          nodSuplementario.Data:=MiPunteroInteger;
          Nod.selected:=True;
          Nod.Expanded:=False;
        end;
      query1.Next;
    end;
end;

Cuando modifico la estructura de los nodos en el treeview, y quiero modificar la estructura padre-hijo de la tabla, ejecuto el siguiente código:

Código Delphi [-]
procedure TFrmAuditoriaArbolCausa.BtnActualizarBDClick(Sender: TObject);
var
  X: Integer;
  Nod: TTreeNode;
begin
  // Borro todos los registros de la base de datos que tengan padre y que cumplan las condiciones de filtrado
  Query1.SQL.Clear;
  Query1.SQL.Add('DELETE FROM Auditorias_Problemas WHERE Codigo_Auditoria =' + IntToStr(CodigoAuditoria) + 'AND Codigo_Probefecto <> 0');
  Query1.ExecSQL;

  //Cargo el tree en la base de datos
  for X:=0 to (treeview1.Items.Count-1) do
    begin
      Nod:= Treeview1.Items[X];
      Nod.Selected:=true;
      if Nod.Parent=nil then
        begin
          //No cargo nada, porque al no tener padre ya se carga al declararlo como problema de la auditoría
        end
      else
        begin
          Query1.SQL.Clear;
          Query1.SQL.Add('INSERT INTO Auditorias_Problemas (Codigo_Problema, Codigo_ProbEfecto, Codigo_Auditoria) VALUES (:a, :b, :c)');
          Query1.ParamByName('a').asinteger:= PunteroInteger(nod.data)^;
          if (nod.Parent=nil) then
            begin
              Query1.ParamByName('b').asinteger:=0;
            end
          else
            begin
              Query1.ParamByName('b').asinteger:=PunteroInteger(Nod.Parent.data)^;
            end;
          Query1.ParamByName('c').asinteger:=CodigoAuditoria;
          Query1.ExecSQL;
      end;
    end;

Basicamente lo que hace este ultimo código es borrar todo el arbol mostrado y volverlo a cargar como figura en el treeview.

Como veras, lo mas importante es armar los datos de la tabla indicando de que nodo se van a desprender al mostrarlos en un treeview.

Saludos, Enrique Gabriel Baquela.

Http://enrique-gabirel-baquela.neurona.com

Última edición por egbaquela fecha: 20-02-2008 a las 13:24:20.
Responder Con Cita