Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-12-2007
LENOCB LENOCB is offline
Miembro
 
Registrado: dic 2008
Ubicación: Argentina
Posts: 54
Poder: 17
LENOCB Va por buen camino
TreeView

Hola, necesito ayuda para lo siguiente, mi idea es llanar un treewiev con los datos correspondientes a una tabla, la cosa es que no se como hacerlo, jeje.... mi idea es que quedara alg así :

+General
+General1
SubGeneral1
SubGeneral2
+General2
SubGeneral21
SubGeneral22

y así sucesivamente ......

o si hay otra forma no tan complicada de presentar informacion, aclarando que cuando uno hace click sobre alguno de los links del treewiev, al lado se muestra otra informacion que se corresponde con lo clickeado anteriormente, se entiende ? o la complique mucho ??

saludos y gracias .-
Responder Con Cita
  #2  
Antiguo 31-12-2007
egbaquela egbaquela is offline
Miembro
 
Registrado: jul 2007
Posts: 21
Poder: 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
  #3  
Antiguo 02-01-2008
JXJ JXJ is offline
Miembro
 
Registrado: abr 2005
Posts: 2.475
Poder: 22
JXJ Va por buen camino
no es que sea encajoso, pero no podrias poner el codigo fuente
de la base de datos y el programa..
si no tienes problema con ellos
gracias
Responder Con Cita
  #4  
Antiguo 16-01-2012
Avatar de jejo1984
jejo1984 jejo1984 is offline
Miembro
NULL
 
Registrado: jun 2011
Posts: 39
Poder: 0
jejo1984 Va por buen camino
Y para lazarus me arroja errores las lineas que estan de rojo

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 [-]
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.



Mi indica error en la variable Mipuntero...
__________________
No lleves tus conocimiento a la tumba, Enseña a otros lo que sabes...

Última edición por jejo1984 fecha: 16-01-2012 a las 19:21:07.
Responder Con Cita
  #5  
Antiguo 16-01-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is online now
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.098
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Por favor, jejo1984, ya te he comentado otras veces que dejes de contestar hilos de hace años, cuando no ofreces ninguna solución.
Si tienes cualquier duda, problema o consulta que hacer, por favor, crea un hilo nuevo en el foro adecuado.
Te recuerdo nuestra guía de estilo.
Responder Con Cita
  #6  
Antiguo 19-02-2008
eljuanan eljuanan is offline
Miembro
 
Registrado: feb 2008
Posts: 10
Poder: 0
eljuanan Va por buen camino
Hola, puedes indicarnos la delcaracion de PunteroInteger?
Por favor?
Responder Con Cita
  #7  
Antiguo 19-02-2008
egbaquela egbaquela is offline
Miembro
 
Registrado: jul 2007
Posts: 21
Poder: 0
egbaquela Va por buen camino
Varios

Hola eljuan: PunteroInteger es un puntero del tipo integer, nada mas:
type PunteroInteger = ^Integer;
Lo tendría que haber puesto. Igual se puede obviar esta declaración ya que es un paso intermedio redundante.

*******
JXJ: hace rato que no me conectaba, no tengo problema en poner el código, dame unos días para que lo prepare y lo arregle un poco. Si necesitas algo mas pedimelo, no tengo drama.

Saludos, Enrique Gabriel Baquela.
Http://enrique-gabriel-baquela.neurona.com
Responder Con Cita
  #8  
Antiguo 19-02-2008
eljuanan eljuanan is offline
Miembro
 
Registrado: feb 2008
Posts: 10
Poder: 0
eljuanan Va por buen camino
Gracias por la respuesta
Responder Con Cita
  #9  
Antiguo 19-02-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
En realidad no hace falta adquirir memoria con la función "New", ya que la propiedad Data es de tipo puntero ocupando 2 bytes en memoria, lo mismo que ocupa un Integer.

Podría quedar así:
Código Delphi [-]
Nod:=TreeView1.Items.Add (nil,Query1.FieldByName('Descripcion').asstring);
Nod.Data := Pointer(Query1.Fieldbyname('Codigo').asinteger);
Y cuando queramos acceder:
Código Delphi [-]
MiNumero := Integer(Node.Selected.Data)
En este caso no tenemos que liberar nada de memoria cuando se libere el nodo, porque no hemos reservado memoria.

Lo realmente interesante es que podemos crear nuestro propio objeto y asociarlo a cada nodo, guardando mucha más información:
Código Delphi [-]
type Cliente = Class(TObject)
public
   nombre: string;
   apellido:string;
   direccion:string;
   TotalFacturado:currency;
end;

...
 cliente := TCliente.Create(nil);
 Nod:=TreeView1.Items.Add (nil,Query1.FieldByName('Descripcion').asstring);
          cliente);
  cliente.nombre := query1.fieldbyname(....);
  cliente.direccion:= ....

          nod.Selected :=true;
Por supuesto, al eliminar un TTreeNode si necesitamos liberar nuestro objeto Cliente (evento OnFreeNode).

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #10  
Antiguo 19-02-2008
egbaquela egbaquela is offline
Miembro
 
Registrado: jul 2007
Posts: 21
Poder: 0
egbaquela Va por buen camino
Mucho mejor así, la verdad es que no se me había ocurrido.
Saludos, Enrique Gabriel Baquela.
Http://enrique-gabriel-baquela.neurona.com
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Copiar un treeview a otro treeview mierda OOP 0 26-07-2006 12:29:17
treeview kiringui OOP 4 18-07-2006 11:52:38
Ver Mi Pc en un TreeView gilberto_1126 API de Windows 2 22-06-2004 01:07:36
Como utilizar el Treeview, desplegar la info del arbol binario al treeview leo21 Varios 2 08-04-2004 22:47:30
Como utilizar el Treeview, desplegar la info del arbol binario al treeview leo21 OOP 1 08-04-2004 22:42:44


La franja horaria es GMT +2. Ahora son las 12:19:38.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi