Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ordenar un TListBox (https://www.clubdelphi.com/foros/showthread.php?t=8660)

jplj 29-03-2004 18:24:22

Ordenar un TListBox
 
¿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

Cita:

Empezado por cadetill
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

Cita:

Empezado por roman
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í:

Código:

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;


La franja horaria es GMT +2. Ahora son las 05:30:53.

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