Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

CustomSort en un TreeView

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: CustomSort en un TreeView Responder citando

Hola a todos.

Tengo un treeview en el que el texto esta compuesto de un nombre y entre paréntesis un número, y necesito poder ordenar el árbol de acuerdo a ese número

Puede decirme alguien como hacerlo

Grache

Volver arriba
Mensaje    Asunto: CustomSort en un TreeView Responder citando

Hola Iñigo:

A ver si te vale así, lo he probado por encima mientras lo haciay parece que va bien:

- Ponemos la propidad SortType a stText directamente en tiempo de diseño. A continuación metemos el siguiente código dentro del evento OnCompare :

  int Numero1, Numero2;
  int PosIni, PosFin;

  // Extraemos el número que esta entre parentesis del Nodo1
  PosIni = Node1->Text.Pos("(") + 1;
  PosFin = Node1->Text.Pos(")");
  Numero1 = Node1->Text.SubString(PosIni, PosFin-PosIni).ToIntDef(0);

  // Extraemos el número que esta entre parentesis del Nodo2
  PosIni = Node2->Text.Pos("(") + 1;
  PosFin = Node2->Text.Pos(")");
  Numero2 = Node2->Text.SubString(PosIni, PosFin-PosIni).ToIntDef(0);

  // Los comparamos y devolvemos el resultado en Compare
  // Compare: -1 si Nodo1<Nodo2, 0 si Nodo1==Nodo2 y 1 si Nodo1>Nodo2
  if (Numero1 < Numero2)
      Compare = -1;
  else if (Numero1 > Numero2)
      Compare = 1;
  else
      Compare = 0;

---
Saludos.
_Leo

Volver arriba
Mensaje    Asunto: CustomSort en un TreeView Responder citando

Gracias, Leo, pero eso ya lo había probado, y, aunque funciona perfectamente, me ralentiza mucho el programa, tanto a la hora de cargar el TreeView (desde una BD) como a la hora de insertar un nuevo nodo. Por eso quería utilizar el método CustomSort, y que solo se aplicase esa ordenación cuando el usuario le de a un botón
Volver arriba
Mensaje    Asunto: CustomSort en un TreeView Responder citando

Hola de nuevo Iñigo:

Usando CustomSort quedaria más o menos parecido:

Creamos la función que se encargará de hacer las comparaciones:

 //--------------------------------------------------------------------
 int CALLBACK FuncComparar(TTreeNode *Node1,TTreeNode *Node2, int Reverse)
 {
     int Numero1, Numero2, PosIni, PosFin, iRet;

     // Extraemos el número que esta entre parentesis del Nodo1
     PosIni = Node1->Text.Pos("(") + 1;
     PosFin = Node1->Text.Pos(")");
     Numero1 = Node1->Text.SubString(PosIni, PosFin-PosIni).ToIntDef(0);

     // Extraemos el número que esta entre parentesis del Nodo2
     PosIni = Node2->Text.Pos("(") + 1;
     PosFin = Node2->Text.Pos(")");
     Numero2 = Node2->Text.SubString(PosIni, PosFin-PosIni).ToIntDef(0);

     // iRet: -1 si Nodo1<Nodo2, 0 si Nodo1==Nodo2 y 1 si Nodo1>Nodo2
     if (Numero1 < Numero2) iRet = -1;
     else if (Numero1 > Numero2) iRet = 1;
     else iRet = 0;

     return (Reverse ? -iRet : iRet);
 }
 //--------------------------------------------------------------------

y luego desde un botón podemos usar lo siguiente para ordenar:

   // Ordena de menor a mayor
   TreeView1->CustomSort((PFNTVCOMPARE)FuncComparar, 0);

   // Ordena de mayor a menor
   TreeView1->CustomSort((PFNTVCOMPARE)FuncComparar, 1);

luego para acelerar la cosa, se podria usar SubString por ejemplo si el numero entre parentesis tiene una posición y extensión fijas o bien usar la propiedad Data y nos evitamos hacer busquedas y conversiones en la cadena que es lo que mas ralentiza en este caso. Supongo que como sabes Data es para asociar un puntero a una estructura por ejemplo a cada nodo, pero como el treeview no lo libera ni hace nada con el podrias usarla para almacenar un número cualquiera.

Saludos.
_Leo

Volver arriba
Mensaje    Asunto: CustomSort en un TreeView Responder citando

Muchas gracias.
Volver arriba
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.