Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-02-2008
egbaquela egbaquela is offline
Miembro
 
Registrado: jul 2007
Posts: 21
Poder: 0
egbaquela Va por buen camino
Resaltar o colorear nodos

Elijuan: la verdad es que no tenía ni idea, pero buscando en el google encontre esta web:

http://delphiallimite.blogspot.com/2...view-y-ii.html

Fijate que explica como cambiar los atributos de las fuentes y como asociarle imágenes a cada ícono.
Saludos, Enrique Gabriel Baquela.
Http://enrique-gabriel-baquela.neurona.com
Responder Con Cita
  #2  
Antiguo 06-03-2008
eljuanan eljuanan is offline
Miembro
 
Registrado: feb 2008
Posts: 10
Poder: 0
eljuanan Va por buen camino
Dado el procedimiento
para cargar el arbol de la BD
procedure TFrmAuditoriaArbolCausa.CargarTree(Sender: TObject; SQL: String);
os consulto lo siguiente:
he añadido un campo orden a cada registro de la base de datos para
mostrar los nodos de una forma ordenada, y en la consulta
del procedimiento, hago "order by orden".
Pues da un fallo, invalid index
¿Alguna sugerencia?
Responder Con Cita
  #3  
Antiguo 06-03-2008
egbaquela egbaquela is offline
Miembro
 
Registrado: jul 2007
Posts: 21
Poder: 0
egbaquela Va por buen camino
Falla en el SQL

¿Podrías poner la sentencia SQL de la consulta que generás?
¿Con que base de datos trabajás?.
Saludos, Enrique Gabriel Baquela.
Responder Con Cita
  #4  
Antiguo 07-03-2008
eljuanan eljuanan is offline
Miembro
 
Registrado: feb 2008
Posts: 10
Poder: 0
eljuanan Va por buen camino
Este es el procedimiento, el que tu indicaste pero
modificado para mi consulta:
procedure TFHSFabaMain.CargarTree(Sender: TObject; SQL: String;raiz:integer);
var
I, X, N,C: Integer;
Nod: TTreeNode;
NodSuplementario: TTreeNode;
MiPunteroInteger:^Integer;
q:TDataSet;
color:string;
begin
//Proceso que carga el arbol desde la BD
//Obtenemos los parametros para los colores
e.g('_col1',e.ValorParametro('FAB/NOD/NIV1/COLOR',False));
e.g('_col2',e.ValorParametro('FAB/NOD/NIV2/COLOR',False));
e.g('_col3',e.ValorParametro('FAB/NOD/NIV3/COLOR',False));
e.g('_col4',e.ValorParametro('FAB/NOD/NIV4/COLOR',False));
e.g('_col5',e.ValorParametro('FAB/NOD/NIV5/COLOR',False));
e.g('_col6',e.ValorParametro('FAB/NOD/NIV6/COLOR',False));
e.g('_col7',e.ValorParametro('FAB/NOD/NIV7/COLOR',False));
e.g('_col8',e.ValorParametro('FAB/NOD/NIV8/COLOR',False));
e.g('_col9',e.ValorParametro('FAB/NOD/NIV9/COLOR',False));
e.g('_col10',e.ValorParametro('FAB/NOD/NIV10/COLOR',False));
//Bloqueamos el onChange para que no se ejecute
e.g('_bloqchange',1);
tv.Items.Clear;
// Cargo la consulta a mostrar en el TreeView
q :=e.DataSetFromSQL(self,'select codigo,padre,nombre,nivel from fab_nodos where emp=:e_empresa and dep=:e_departamento order by orden');
q.Close;
q.Open;
if (q.eof) then exit;
//Recorro la consulta registro por registro
C:=0;
q.First;
while not q.eof do
begin
C:=C+1;
q.Next;
end;
q.First;
for X:=0 to (C-1) do
begin
I:=q.fieldByName('Padre').asinteger;
// Si el campo padre vale 0 (no tiene padre)
if I=raiz then
begin //Agrego un nuevo nodo, que nazca directamente del raíz
Nod:=tv.Items.Add (nil,q.FieldByName('nivel').asstring+'.'+q.FieldByName('codigo').asstring+' '+q.FieldByName('nombre').asstring);
Nod.ImageIndex:=-1;
New(MiPunteroInteger);
MiPunteroInteger^:=q.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:=tv.Items.Count -1;
while PunteroInteger(tv.Items[N].Data)^ <>I do
Dec(N);
//Agrego el nodo hijo
nodSuplementario:=tv.Items.AddChild(tv.Items[N],q.FieldByName('nivel').asstring+'.'+q.FieldByName('codigo').asstring+' '+q.FieldByName('nombre').asstring);
nodSuplementario.ImageIndex:=-1;
New(MiPunteroInteger);
MiPunteroInteger^:= q.Fieldbyname('Codigo').asinteger;
nodSuplementario.Data:=MiPunteroInteger;
Nod.selected:=True;
Nod.Expanded:=False;
end;
q.Next;
end;
if (e.ValorParametro('FAB/TV','')=1) then tv.FullExpand;
if (e.ValorParametro('FAB/TV','')=2) then tv.FullCollapse;
e.g('_bloqchange',0);
if (tv.Items.Count>0) then
tvChange(tv,tv.Selected);
end;

Cuando se crea un nuevo nodo en el arbol
el campo orden se inicializa a 100;
como tengo implementada una opcion de copiar y pegar en el arbol
lo que pretendes que cuando copio y pego , el nodo copiado se inserte
inmediatamente antes que el destino en el que lo estoy pegando (orden 99),
pues hasta ahi lo hace bien, incluso si copio y pego alguno mas,
el problema viene al ejecutar el procedure para cargar el arbol, da un error de index, supongo que porque al no estar ordenado de padres a hijoss...
¿se os ocurre algo? Me seria de gran ayuda.
La base de datos es Firebird 2.0
Responder Con Cita
  #5  
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
  #6  
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
  #7  
Antiguo 08-03-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
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
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 22:00:49.


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