Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-09-2023
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.354
Poder: 19
Angel.Matilla Va por buen camino
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?
Responder Con Cita
  #2  
Antiguo 16-09-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.257
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
En teoría es:

Código Delphi [-]
VirtualStringTree.SortTree(0, sdAscending, ColumnToSort, CompareNodes, nil);
Responder Con Cita
  #3  
Antiguo 18-09-2023
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.354
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
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é.
Responder Con Cita
  #4  
Antiguo 18-09-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.257
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Con ninguno de los 2 métodos?


Responder Con Cita
  #5  
Antiguo 18-09-2023
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.354
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
¿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...
Responder Con Cita
  #6  
Antiguo 18-09-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.257
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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;
}
Responder Con Cita
  #7  
Antiguo 19-09-2023
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.354
Poder: 19
Angel.Matilla Va por buen camino
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.
Responder Con Cita
Respuesta



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
NodeParent en TVirtualStringTree Angel.Matilla C++ Builder 5 10-05-2022 20:27:52
Primer nodo de un TVirtualStringTree Angel.Matilla C++ Builder 3 03-02-2022 14:36:42
Recorrer TVirtualStringTree Angel.Matilla C++ Builder 6 25-11-2020 11:51:51
Efectos en un TVirtualStringTree Angel.Matilla C++ Builder 7 10-11-2020 13:16:29
Personalizar TVirtualStringTree Angel.Matilla C++ Builder 10 23-11-2019 11:10:49


La franja horaria es GMT +2. Ahora son las 00:52:36.


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
Copyright 1996-2007 Club Delphi