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