PDA

Ver la Versión Completa : Ordenar un TVirtualStringTree


Angel.Matilla
16-09-2023, 11:00:19
Buenos días. Estoy tratando de cargar un TVT a partir de una hoja de cálculo Excel que viene desordenada. En la ayuda de este componente he visto que hay dos métodos (Sort y SortTree) que, en teoría, ordenan el árbol una vez cargado. He probado ambos de la siguiente forma:
Lista->Sort(Nodo1, 0, sdAscendig, true);
Lista->SortTree(0, sdAscending, true);
pero en ambos casos obtengo este resultado:
https://i.ibb.co/BskkFj2/Arbol.jpg
Es evidente que esos últimos cuatro registros, si el árbol está ordenado, no se encuentran en el lugar que les corresponde; ¿hay algo más en esos métodos que se me está escapando?

Casimiro Notevi
16-09-2023, 15:25:26
En teoría es:

VirtualStringTree.SortTree(0, sdAscending, ColumnToSort, CompareNodes, nil);

Angel.Matilla
18-09-2023, 11:00:14
VirtualStringTree.SortTree(0, sdAscending, ColumnToSort, CompareNodes, nil);
En la ayuda del elemento la sintaxis la pone así:
SortTree(Column: TColumnIndex; Direction: TSortDirection; DoInit: Boolean = True);
Lo que no sé si con el TColumnIndex se refiere a la columna a ordenar o aquella de la que depende. No obstante voy a probar la sintaxis que me sugieres. Ya os diré.

Casimiro Notevi
18-09-2023, 11:51:41
¿Con ninguno de los 2 métodos?


https://i.imgur.com/oYqoI7S.png

Angel.Matilla
18-09-2023, 18:44:02
¿Con ninguno de los 2 métodos?
Con ambos me da el mismo resultado de la imagen. Claro que como la Ayuda del TVT viene tan bien explicada no sé si el método hay que ponerlo antes o después del EndUpdate(), si como decía antes hace referencia a la columna que quiero ordenar o a la que sustenta a la misma...

Casimiro Notevi
18-09-2023, 19:13:19
Ni idea, la verdad, sólo he pedido un ejemplo a la "IA Bard" y me ha dicho esto:
#include <vcl.h>

class TForm1 : public TForm
{
public:
TVirtualStringTree *Tree1;

__fastcall TForm1(TComponent* Owner);
void __fastcall FormCreate(TObject* Sender);
void __fastcall SortTree(int Column);
void __fastcall Tree1Sorted(TObject* Sender, TTreeNode* Node, bool& Continue);
};

__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
Tree1 = new TVirtualStringTree(this);
Tree1->ColumnCount = 2;
Tree1->Columns[0]->Caption = "Nombre";
Tree1->Columns[1]->Caption = "Edad";

Tree1->AddChild(NULL, "Juan", 20);
Tree1->AddChild(NULL, "María", 25);
Tree1->AddChild(NULL, "Pedro", 30);
}

void TForm1::FormCreate(TObject* Sender)
{
SortTree(0);
}

void TForm1::SortTree(int Column)
{
Tree1->Sort(Column, true);
}

void TForm1::Tree1Sorted(TObject* Sender, TTreeNode* Node, bool& Continue)
{
if (Node->DataValue[0] < Node->Parent->DataValue[0])
Continue = false;
}

int main()
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
return 0;
}

Angel.Matilla
19-09-2023, 09:47:52
Gracias por la ayuda. Por la respuesta que me das intuyo que si quiero ordenar la 1ª columna (índice 0) se ordenarían los nodos padre; como en este caso hay un padre y varios hijos, estos aparentemente no se ordenan. Probaré con lo que te han sugerido.