Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Ordenar un TVirtualStringTree (https://www.clubdelphi.com/foros/showthread.php?t=96357)

Angel.Matilla 16-09-2023 11:00:19

Ordenar un TVirtualStringTree
 
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:
Código:

Lista->Sort(Nodo1, 0, sdAscendig, true);
Lista->SortTree(0, sdAscending, true);

pero en ambos casos obtengo este resultado:

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:

Código Delphi [-]
VirtualStringTree.SortTree(0, sdAscending, ColumnToSort, CompareNodes, nil);

Angel.Matilla 18-09-2023 11:00:14

Cita:

Empezado por Casimiro Notevi (Mensaje 552520)
Código Delphi [-]
VirtualStringTree.SortTree(0, sdAscending, ColumnToSort, CompareNodes, nil);

En la ayuda del elemento la sintaxis la pone así:
Cita:

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?



Angel.Matilla 18-09-2023 18:44:02

Cita:

Empezado por Casimiro Notevi (Mensaje 552532)
¿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:
Código:

#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.


La franja horaria es GMT +2. Ahora son las 10:08:39.

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