Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Ordenar STringGrid por más de una columna (https://www.clubdelphi.com/foros/showthread.php?t=74583)

dandia28 28-06-2011 01:16:25

Ordenar STringGrid por más de una columna
 
Hola, tengo un stringgrid, alguien tiene algún ejemplo de ordenamiento por más de una columna? Es decir si tengo dos filas con igual fecha por ejemplo y quiero establecer una segunda columna para ordenar en ese caso como haría? Saludos, Daniel

dandia28 04-07-2011 20:48:44

Ordenar StringGrid
 
Hola, tengo un stringgrid, alguien tiene algún ejemplo de ordenamiento por más de una columna? Es decir si tengo dos filas con igual fecha por ejemplo y quiero establecer una segunda columna para ordenar en ese caso como haría? Saludos, Daniel

ecfisa 04-07-2011 21:02:16

Hola dandia28.

Por favor no dupliques los temas, si no obtenes respuesta agregá otro mensaje en el tema original, así pasa a estar en la cabecera del foro como no leída nuevamente ( Guía de estilo punto 6 ). De ese modo evitamos encontrar respuestas duplicadas e inconclusas en las búsquedas.
En este caso combiné los mensajes respetando el primer título que creo es el más representativo.

Saludos y gracias por tu colaboración. :)

ecfisa 05-07-2011 05:37:37

Hola dandia28.

Una forma de ordenar un StringGrid por cualquier columna:
Código Delphi [-]
implementation
...
type
  TStrGrdExt = class(Grids.TStringGrid); // para acceder al método MoveRow

procedure TForm1.OrdenarGrid(StrGrd: TStringGrid; ACol: Integer);
var
  i,j: Integer;
  Fin: Boolean;
begin
  with TStrGrdExt(StrGrd) do
  begin
    i:= FixedRows;
    Fin:= False;
    while not Fin and (i < RowCount -1 ) do
    begin
      Inc(i);
      Fin:= True;
      for j:= FixedRows to RowCount -2 do
      if Cells[ACol,j] > Cells[ACol,j+1] then
      begin
        Fin:= False;
        MoveRow(j, j+1);
      end;
    end;
  end;
end;
Ejemplo de llamada:
Código Delphi [-]
   OrdenarGrid(StringGrid,1);
A fin de simplificar el ejemplo utilicé el método de ordenamiento bubble sort, que para unos cientos de datos funcionará bién.
Pero para muchos cientos o varios miles te conviene implementar el método shell sort o el quick sort, siendo este último el más rápido.


Con el método quick sort sería más o menos así:
Código Delphi [-]
...
type
  TStrGrdExt = class(Grids.TStringGrid); // para acceder al método MoveRow

procedure TForm1.OrdenarGrid(SG: TStringGrid; ACol,pri,ult: Integer);
var
  i,j: Integer;
  aux: string;
begin
  with TStrGrdExt(SG) do
  begin
    i:= pri;
    j:= ult;
    aux:= Cells[ACol, (i + j) div 2];
    repeat
      while Cells[ACol, i] < aux do Inc(i);
      while Cells[ACol, j] > aux do Dec(j);
      if i <= j then
      begin
        if Cells[ACol,i] <> Cells[ACol,j] then
         MoveRow(i, j)
        else
         Exit;
      end;
    until i > j;
    if j > pri then OrdenarGrid(SG, ACol, pri, j);
    if i < ult then OrdenarGrid(SG, ACol, i, ult);
  end;
end;

Llamada:
Código Delphi [-]
begin
  OrdenarGrid(StringGrid, 1, 0, StringGrid.RowCount-1);
end;


Saludos.


La franja horaria es GMT +2. Ahora son las 10:25:29.

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