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
  #21  
Antiguo 07-03-2008
egbaquela egbaquela is offline
Miembro
 
Registrado: jul 2007
Posts: 21
Poder: 0
egbaquela Va por buen camino
Cortar y pegar nodos

Para lo que queres hacer no es necesario agregar un campo a la BD, los TreeNode tienen métodos para moverse.
Podes hacerlo de la siguiente manera:

Código Delphi [-]
procedure TForm1.CortarNodo();
begin
  nodocortado:=Treeview1.Selected;
end;
 
procedure TForm1.PegarNodo();
begin
  nodocortado.MoveTo(treeview1.Selected,naInsert);
end;

Antes de eso tenes que declarar una variable en la unidad del tipo TTreeNode llamada NodoCortado (o podes heredar el TTreeNode y agregarle un campo para este uso y poner las funciones anteriores como métodos).
El segundo parámetro del MoveTo indica donde mover el nodo respecto del nodo pasado como primer parámetro, puede valer:

* naInsert: hermano inmediatamente superior
* naAdd: último hermano
* naAddFirst: primer hermano
* naChild: ultimo hijo
* naChildFirst: primer hijo

Fijate si te sirve.
Saludos, Enrique Gabriel Baquela.
http://enrique-gabriel-baquela.neurona.com
Responder Con Cita
  #22  
Antiguo 08-03-2008
eljuanan eljuanan is offline
Miembro
 
Registrado: feb 2008
Posts: 10
Poder: 0
eljuanan Va por buen camino
Mi probema no es con el metodo de cortar o pegar, eso ya lo tengo implementado sin problemas.
El campo en la BD me hace falta porque necesito guardar el orden en el cual aparecen los nodos, (a todos los niveles).
El problema reside el el procedure CargarTree, cuando ordeno la consulta
por el campo "orden", en lugar de por codigo, me da un error de indice no valido.
Elemplo de arbol

Nodo 1 orden 10
SubNodo 1 orden 20
SubNodo 2 orden 10
Nodo 2 orden 20

El orden es por nivel, es decir, el nivel 1 tiene que ordenarse
primero,luego el nivel 2 y asi sucesivamente

Resultado de la carga del arbol

Nodo 1
SubNodo 2
SubNodo 1
Nodo 2

Alguna idea de como modificar el metodo CargarTree, para hacer esto?
Responder Con Cita
  #23  
Antiguo 08-03-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Pues tendrás que explicar más a fondo la tabla que has creado, su clave primaria y los índices si es que los hay.

Yo no me he topado con ese error de invalid index, no sé a que se refiere.

Por cierto, cuando añadas código delphi, hazlo entre etiquetas delphi, de lo contrario ni lo leeremos.


[delphi]
tu codigo delphi aqui
[/delphi]

Al enviar el mensaje verás el códiigo formateado.

El tema de ordenamiento, podrías usar rangos, me explico:

Si das un valor numérico, el sql te ordenará así:
Código:
Nodo 1 orden 10
SubNodo 2 orden 10
SubNodo 1 orden 20
Nodo 2 orden 20
y ya se están mezclando los padres con los hijos. No hay forma de diferenciarlo.

Supongamos que un nivel puede tener 1000 subnodos, pues al tiempo de dar pesos lo hacemos así:
Código:
Nodo 1 orden 1000
SubNodo 2 orden 1001
SubNodo 3 orden 1002
Nodo 2 orden 2000
SubNodo 1 orden 2001
Así siempre saldrán ordenados como quieres.

Al tiempo de insertar un Nodo, haces la consulta para saber qué peso le corresponde:
Código SQL [-]
select Max(orden)+1000 from tabla where padre = 0

Y al insertar un subnodo lo mismo:
Código SQL [-]
select Max(orden)+1 from tabla where padre = 23 <<<<<<<<<< Nodo padre al que pertenecerá

Puesto que no se repetira el campo orden, podrías crear un índice único y ascendente por dicho campo.

(es lo primero que se me ha venido a la cabeza, igual alguien aporta una mejor solución.)

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 08-03-2008 a las 10:31:57.
Responder Con Cita
  #24  
Antiguo 08-03-2008
eljuanan eljuanan is offline
Miembro
 
Registrado: feb 2008
Posts: 10
Poder: 0
eljuanan Va por buen camino
Ya lo he resuelto.
Como en la tabla tengo el nivel, ordeno por nivel y orden,
y el procedimiento que carga el arbol no falla
Gracias
Responder Con Cita
  #25  
Antiguo 06-10-2008
ecch ecch is offline
Miembro
 
Registrado: dic 2007
Posts: 11
Poder: 0
ecch Va por buen camino
Las Tablas de Plan de Cuentas Tienen datos que ayudan

Aunqu eun poco tarde, debo precisar que esa era la Solucion, usar el campo Nivel, todas lasa Cuentas de un plan contable o tienen ya que necesitan saber la jerarquia dentro del plan, el unico problema seria con la de nivel de movimiento que generalmente en lugar de un numero le ponen D o M que Significan, Detalle o Movimiento, eso significa que estas cuenta ya no tienen sucesoras, tan solo antecesoras, o como contablemente se les conoce, cuentas principales o cuentas de acumulacion, esto lo coocemos muy bien los contables.
En sintesis, utilizar el campo Nivel para saber la jerarquia de las cuentas, utilizar la recursividad para moverse en todo el arbol y finalmente cuando encuentras un nivel D o M, o com le hayan puesto a las cuentas de ulltimo nivel, ya sabes que alli termina la Ramal.
Responder Con Cita
  #26  
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
  #27  
Antiguo 16-01-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
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
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 18:47:53.


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