Lo primero que haremos es declarar dos variables globales:
var Form1: TForm1; UltimoSorteo: Integer; //guardará el dato de la última ordenación; Ascendente: Boolean; //verificaremos si la ordenación es Ascendente o no;
Luego debemos inicializar las variables que hemos creado:
procedure TForm1.FormCreate(Sender: TObject); begin UltimoSorteo := -1; //no hay ninguno (también devuelve 1 y 0); Ascendente := True; //lo iniciamos de manera ascendente; end;
Ahora, en el evento OnColumnClick del ListView colocaremos el siguiente code:
procedure TForm1.ListView1ColumnClick(Sender: TObject; Column: TListColumn); begin if Column.Index = UltimoSorteo then Ascendente := Not Ascendente else UltimoSorteo := Column.Index; TListView(Sender).CustomSort(@SortByColumn, Column.Index); end;
Por último debemos crear una función que hará la ordenación de los datos de acuerdo a la columna:
function SortByColumn(Item1, Item2: TListItem; Data: integer): integer; stdcall; begin if Data = 0 then Result := AnsiCompareText(Item1.Caption, Item2.Caption) else Result := AnsiCompareText(Item1.SubItems[Data-1], Item2.SubItems[Data-1]); if not Ascendente then Result := -Result; end;
Pues ya con eso pueden ordenar los datos de una columna de un listview sin importar el tipo de contenido que tenga, Nota: Probado con Delphi 7.
Que lo disfruten, Saludos.