PDA

Ver la Versión Completa : Ordenar TListView


Angel.Matilla
19-11-2018, 11:38:12
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:
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.
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:

...
int inxSort = 0;

// OnCompare
void __fastcall TForm1::ListView1Compare(TObject *Sender, TListItem *Item1,
TListItem *Item2, int Data, int &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 = a < b ? -1 : (a > b ? 1 : 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 :)