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 TListView (https://www.clubdelphi.com/foros/showthread.php?t=93574)

Angel.Matilla 19-11-2018 11:38:12

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.

Angel.Matilla 19-11-2018 12:26:00

¡Ya está aclarado! Estaba asignando mal als variables después de haber hecho la ordenación. ¡Seré burro!

ecfisa 19-11-2018 21:33:03

Hola.
Cita:

Empezado por Angel.Matilla (Mensaje 529595)
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 :)


La franja horaria es GMT +2. Ahora son las 20:44: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