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 Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-11-2018
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Ordenar TListView

Tengo un TListView similar a este:
Titular Dato1 % Dato2
Titular1 1250 45,45% 10
Titular2 1500 54,55% 11


que quiero ordenar por la última columna para lo que estoy usando un método de burbuja con este código:
Código:
AnsiString **cDatos;
int nItem, **nDatos;


cDatos = new AnsiString *[Simula->Items->Count];
nDatos = new int *[ListView->Items->Count];
for (nItem = 0; nItem < ListView->Items->Count; nItem ++)
{
     cDatos[nItem] = new AnsiString[2];
     nDatos[nItem] = new int[2];
}

for (nItem = 0; nItem < ListView->Items->Count - 1; nItem ++)
{
     cDatos[nItem][0] = ListView->Items->Item[nItem]->Caption;
     nDatos[nItem][0] = StrToIntDef(ListView->Items->Item[nItem]->SubItems->Strings[0], 0);
     cDatos[nItem][1] = ListView->Items->Item[nItem]->SubItems->Strings[1];
     nDatos[nItem][1] = StrToIntDef(ListView->Items->Item[nItem]->SubItems->Strings[2], 0);
}

for (int nUno = 1; nUno < ListView->Items->Count; nUno ++)
     for (int nDos = 0; nDos < ListView->Items->Count - nUno; nDos ++)
          if (nDatos[nDos][1] > nDatos[nDos + 1][1])
          {
               std::swap(nDatos[nDos][0], nDatos[nDos + 1][0]);
               std::swap(nDatos[nDos][1], nDatos[nDos + 1][1]);
               std::swap(cDatos[nDos][0], cDatos[nDos + 1][0]);
               std::swap(cDatos[nDos][1], cDatos[nDos + 1][1]);
          }

for (nItem = 0; nItem < ListView->Items->Count - 1; nItem ++)
{
     ListView->Items->Item[nItem]->Caption              = cDatos[nItem][0];
     ListView->Items->Item[nItem]->SubItems->Strings[0] = nDatos[nItem][0];
     ListView->Items->Item[nItem]->SubItems->Strings[1] = cDatos[nItem][1];
     ListView->Items->Item[nItem]->SubItems->Strings[0] = nDatos[nItem][1];
}
Sin embargo tras pasar este código con esos datos me devuelve este TListView:
Titular Dato1 % Dato2
12
Titular1 1500 98,62% 21


Y ya no sé como hacerlo. He probado con dos matrices como está arriba, con cuatro, metiendo el contenido de cada línea en un elemento de TStringList y el valro que me interesa en una matriz... ¡Da lo mismo! Me lo hace siempre mal.

Última edición por Angel.Matilla fecha: 19-11-2018 a las 12:41:55.
Responder Con Cita
  #2  
Antiguo 19-11-2018
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Unhappy

¡Ya está aclarado! Estaba asignando mal als variables después de haber hecho la ordenación. ¡Seré burro!
Responder Con Cita
  #3  
Antiguo 19-11-2018
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.
Cita:
Empezado por Angel.Matilla Ver Mensaje
Tengo un TListView similar a este:
Titular Dato1 % Dato2
Titular1 1250 45,45% 10
Titular2 1500 54,55% 11


que quiero ordenar por la última columna para lo que estoy usando un método de burbuja con este código:
Como una mejor alternativa al método de ordenamiento que mencionas, te pongo un ejemplo que ordena por la columna sobre la que se hizo click:
Código PHP:
...
int inxSort 0;

// OnCompare
void __fastcall TForm1::ListView1Compare(TObject *SenderTListItem *Item1,
  
TListItem *Item2int Dataint &Compare)
{
  if (
inxSort == 0// Titular
    
Compare strcmp(Item1->Caption.c_str(), Item2->Caption.c_str());
  else { 
// Dato1 - % - Dato2  
    
Double a atof(Item1->SubItems->Strings[inxSort-1].c_str());
    
Double b atof(Item2->SubItems->Strings[inxSort-1].c_str());
    
Compare ? -: (0);
  }
}

// OnColumnClick
void __fastcall TForm1::ListView1ColumnClick(TObject *Sender,
  
TListColumn *Column)
{
  
inxSort Column->Index;
  
ListView1->AlphaSort();

Dada la descripción que diste arriba, supuse los items: "Dato1", "%" y "Dato2" de tipo numéricos. El ordenamiento se realiza de forma ascendente.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Ordenar objetos de mas grandes a mas pequeños en TListView Reasen Varios 3 17-11-2016 18:51:52
Ordenar TListView Angel.Matilla C++ Builder 12 09-06-2014 19:42:44
TListView calogero Varios 0 18-01-2007 18:16:45
Tlistview Yenifer Varios 1 18-08-2004 17:33:44
TlistView perceptron OOP 2 05-12-2003 00:56:15


La franja horaria es GMT +2. Ahora son las 23:22:43.


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