Ir al contenido


Foto

Ordenar StringGrid


  • Por favor identifícate para responder
8 respuestas en este tema

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 09 agosto 2009 - 06:04

El componente TStringGrid no tiene ningún método para ordenar las celdas. En este truco muestro como crear nuestra propia función de ordenación.

La función de ordenación será capaz de ordenar por orden alfabético o numérico las filas del StringGrid. Podremos elegir la columna sobre cuyos valores ordenaremos y la fila de inicio y fin que entraran el juego. También seremos capaces de ordenar en orden creciente de arriba a bajo o decreciente.

La definición de la función, para colocar en un archivo.h


cpp
  1. void SortRow(TStringGrid *StringGrid, bool Increase, int Col, int RowIni = 0, int RowEnd = -1);



La implementación:


cpp
  1. void SortRow(TStringGrid *StringGrid, bool Increase, int Col, int RowIni, int RowEnd)
  2. {
  3.     TStrings *Strings = StringGrid->Cols[Col];
  4.     TStrings *Temp = new TStringList;
  5.     int  n, m = 1;
  6.     if(RowEnd == -1) RowEnd = Strings->Count-1;
  7.  
  8.     // Ordena por orden alfabético
  9.     for(m=1; m;) for(n=RowIni,m=0; n<RowEnd; n++){
  10.       if(Increase){
  11.         if(Strings->Strings[n]<=Strings->Strings[n+1]) continue;
  12.       }
  13.       else{
  14.         if(Strings->Strings[n]>=Strings->Strings[n+1]) continue;
  15.       }
  16.       Temp->Assign(StringGrid->Rows[n]);
  17.       StringGrid->Rows[n]->Assign(StringGrid->Rows[n+1]);
  18.       StringGrid->Rows[n+1]->Assign(Temp);
  19.       m=1;
  20.     }
  21.     delete Temp;
  22. }



Saludos.
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 09 agosto 2009 - 06:11

Hola amigo,

Gracias por el aporte, (y)

Salud OS
  • 0

#3 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 09 agosto 2009 - 06:44

Lo mismo pero usando el algoritmo Quicksort de forma recursiva ... y en delphi  :D :


delphi
  1. procedure QuickSort(StringGrid: TStringGrid; Column, L, R: Integer);
  2. var
  3.   I, J, P: Integer;
  4.   Aux: TStringList;
  5. begin
  6.   Aux:= TStringList.Create;
  7.   try
  8.     repeat
  9.       I := L;
  10.       J := R;
  11.       P := (L + R) shr 1;
  12.       repeat
  13.         while AnsiCompareText(StringGrid.Rows[I].Strings[Column],
  14.           StringGrid.Rows[P].Strings[Column]) < 0 do Inc(I);
  15.         while AnsiCompareText(StringGrid.Rows[J].Strings[Column],
  16.           StringGrid.Rows[P].Strings[Column]) > 0 do Dec(J);
  17.         if I <= J then
  18.         begin
  19.           Aux.Assign(StringGrid.Rows[I]);
  20.           StringGrid.Rows[I].Assign(StringGrid.Rows[J]);
  21.           StringGrid.Rows[J].Assign(Aux);
  22.           if P = I then
  23.             P := J
  24.           else if P = J then
  25.             P := I;
  26.           Inc(I);
  27.           Dec(J);
  28.         end;
  29.       until I > J;
  30.       if L < J then QuickSort(StringGrid,Column,L, J);
  31.       L := I;
  32.     until I >= R;
  33.   finally
  34.     Aux.Free;
  35.   end;
  36. end;
  37.  
  38.  
  39. // Por ejemplo
  40. QuickSort(StringGrid1,0,0, StringGrid1.RowCount - 1);


  • 0

#4 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 09 agosto 2009 - 04:50

Hola
Como me gusta ver código de los grandes, aunque no entienda nada. (y) :p
Saludos
PD: que bueno que seoane nos lo traduce a delphi, aunque ni asi lo entiendo. :s

  • 0

#5 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 09 agosto 2009 - 07:30

Hola,
muy bueno... ¿y en que evento del StringGrid es propio usarlo?


Saludos!
  • 0

#6 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 09 agosto 2009 - 08:16

Hola,
muy bueno... ¿y en que evento del StringGrid es propio usarlo?


Saludos!


Yo usaria esta "chapuza" :p



delphi
  1. var
  2.   Form1: TForm1;
  3.   Columna: integer;
  4.  
  5. implementation
  6.  
  7. {$R *.DFM}
  8.  
  9. procedure TForm1.StringGrid1MouseDown(Sender: TObject;
  10.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  11. begin
  12.   if y <= StringGrid1.DefaultRowHeight then begin
  13.     Columna := (X div StringGrid1.DefaultColWidth) + 1;
  14.   end
  15.   else Columna := -1;
  16. end;
  17.  
  18. procedure TForm1.StringGrid1DblClick(Sender: TObject);
  19. begin
  20.   if (Columna > 0) and (Columna <= StringGrid1.ColCount) then begin
  21.     ShowMessage('Se seleccionó la Columna '+inttostr(Columna));
  22.     //Ejecutamos el QuickSort dependiendo de la columna que se obtiene.....
  23.   end;
  24. end;
  25.  
  26. end.



Salud OS
  • 0

#7 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 09 agosto 2009 - 08:21

Lástima que no tenga un evento como OnTitleClick así­ como un DBGrid; así­ serí­a propio.


Saludos!
  • 0

#8 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 09 agosto 2009 - 08:23

Lástima que no tenga un evento como OnTitleClick así­ como un DBGrid; así­ serí­a propio.


Saludos!


:embarrassed: que paso mi cuate, y el code ese que puse, no servirá para lo mismo que el TitleClick  :cheesy:

Salud OS
  • 0

#9 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 09 agosto 2009 - 08:43


Lástima que no tenga un evento como OnTitleClick así­ como un DBGrid; así­ serí­a propio.


Saludos!


:embarrassed: que paso mi cuate, y el code ese que puse, no servirá para lo mismo que el TitleClick  :cheesy:

Salud OS


Es verdad  :D... no vi aquella linea, gracias


Saludos!
  • 0




IP.Board spam blocked by CleanTalk.