PDA

Ver la Versión Completa : Ordenar un TListBox


jplj
29-03-2004, 18:24:22
¿Cómo puedo ordenar (de menor a mayor numéricamenete hablando y de una forma sencilla) un TListBox que se llena con cadenas que representan números positivos y negativos?

Gracias de antemano.

__cadetill
29-03-2004, 18:27:40
la propiedad sorted a true no te sirve?

roman
29-03-2004, 18:31:43
la propiedad sorted a true no te sirve?

No le servirá ya que, por ejemplo, las cadenas "10", "11", "12" las colocará antes de las cadenas "2", "3", "4", etc.

// Saludos

__cadetill
29-03-2004, 18:34:30
No le servirá ya que, por ejemplo, las cadenas "10", "11", "12" las colocará antes de las cadenas "2", "3", "4", etc.

// Saludos
Cierto, no leí de que eran números :p

marto
29-03-2004, 18:38:20
Wop!

Pues a mi la manera más sencilla que se me ocurre es cargar la lista en un vector de enteros, ordenar el vector y depues recargar la lista.

roman
29-03-2004, 19:54:17
Es increíble pero realmente no parece haber manera de hacerlo con el mismo ListBox no quedando más remedio que utilizar algo externo como indica marto. Para facilitar un poco las cosas y no tener que implementar uno mismo el algoritmo de ordenación puede usarse esta técnica que me encontré en una búsqueda por la red:

1. Asignar los elementos de ListBox1.Items a un StringList
2. Usar el método CustomSort del StringList
3. Devolver los elementos al ListBox

Quedaría algo así:


function CompareNumbers(List: TStringList; Index1, Index2: Integer): Integer;
var
Number1, Number2: Integer;

begin
Number1 := StrToInt(List[Index1]);
Number2 := StrToInt(List[Index2]);

if Number1 < Number2 then
Result := -1
else if Number1 = Number2 then
Result := 0
else
Result := 1;
end;

procedure SortList(ListBox: TListBox);
var
List: TStringList;

begin
List := TStringList.Create;

try
List.AddStrings(ListBox.Items);
List.CustomSort(CompareNumbers);

ListBox.Clear;
ListBox.Items.AddStrings(List);
finally
List.Free;
end;
end;


// Saludos

jplj
29-03-2004, 20:56:58
Muchas Gracias por vuestras respuesta.

jplj
29-03-2004, 21:25:17
Funciona perfectamente, pero hay que cambiar:

List.CustomSort(CompareNumbers);
por
List.CustomSort(@CompareNumbers);

Muestra (Delphi 7) el aviso de código inseguro al compilar: pero no vamos a pasarlo a .NET.

Saludos.

P.D.: Para los despitados como yo una nota: TListBox.Sorted:= False;