Ver Mensaje Individual
  #3  
Antiguo 25-09-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Me parece que no va a ser tan fácil como usar Sorted porque el ordenamiento se hace como texto y no como números. Eso implica, por ejemplo, que '10' va antes que '2' a pesar de que 2 es menor que 10.

Se me ocurre usar un TStringList auxiliar y su método CustomSort:

Código Delphi [-]
{
  Compara dos valores de una lista

  La función devuelve:
    -1 si List[Index1] es menor que List[Index2]
    0 si List[Index1] es igual a List[Index2]
    1 si List[Index1] es mayor que List[Index2]

  Si alguno de los elementos no es un número entero, la función lanza
  una excepción.
}
function CompareNumbers(List: TStringList; Index1, Index2: Integer): Integer;
var
  N1, N2: Integer;

begin
  if TryStrToInt(List[Index1], N1) and TryStrToInt(List[Index2], N2) then
    if N1 < N2 then
      Result := -1
    else if N1 = N2 then
      Result := 0
    else
      Result := 1
  else
    raise Exception.Create('La lista contiene valores incorrectos');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  SL: TStringList;

begin
  SL := TStringList.Create;
  try
    // Pasamos los elementos del ListBox a SL
    SL.AddStrings(ListBox1.Items);

    // Ordenamos usando la función de arriba para comparar elementos
    SL.CustomSort(CompareNumbers);

    // Regresamos los elementos al ListBox
    ListBox1.Items := SL;
  finally
    SL.Free
  end;
end;

// Saludos
Responder Con Cita