StringGrid - ordenar uma string grid por uma coluna

Top  Previous  Next

// ordenar uma string grid por uma coluna

procedure SortStringGrid(var GenStrGrid: TStringGrid; ThatCol: Integer); 

const 

  // Define the Separator 

  TheSeparator = '@'

var 

  CountItem, I, J, K, ThePosition: integer; 

  MyList: TStringList; 

  MyString, TempString: string; 

begin 

  // Give the number of rows in the StringGrid 

  CountItem := GenStrGrid.RowCount; 

  //Create the List 

  MyList        := TStringList.Create

  MyList.Sorted := False; 

  try 

    begin 

      for I := 1 to (CountItem - 1) do 

        MyList.Add(GenStrGrid.Rows[I].Strings[ThatCol] + TheSeparator + 

          GenStrGrid.Rows[I].Text); 

      //Sort the List 

      Mylist.Sort; 

 

      for K := 1 to Mylist.Count do 

      begin 

        //Take the String of the line (K – 1) 

        MyString := MyList.Strings[(K - 1)]; 

        //Find the position of the Separator in the String 

        ThePosition := Pos(TheSeparator, MyString); 

        TempString  := ''

        {Eliminate the Text of the column on which we have sorted the StringGrid} 

        TempString := Copy(MyString, (ThePosition + 1), Length(MyString)); 

        MyList.Strings[(K - 1)] := ''

        MyList.Strings[(K - 1)] := TempString; 

      end

 

      // Refill the StringGrid 

      for J := 1 to (CountItem - 1) do 

        GenStrGrid.Rows[J].Text := MyList.Strings[(J - 1)]; 

    end

  finally 

    //Free the List 

    MyList.Free; 

  end

end

 

procedure TForm1.Button1Click(Sender: TObject); 

begin 

  // Sort the StringGrid1 on the second Column 

  // StringGrid1 nach der 1. Spalte sortieren 

  SortStringGrid(StringGrid1, 1); 

end

 

----------------------------- EXEMPLO 2--------------------------

 

type 

  TMoveSG = class(TCustomGrid); // reveals protected MoveRow procedure 

 

{...} 

 

procedure SortGridByCols(Grid: TStringGrid; ColOrder: array of Integer); 

var 

  i, j:   Integer; 

  Sorted: Boolean; 

 

function Sort(Row1, Row2: Integer): Integer; 

var 

  C: Integer; 

begin 

  C      := 0

  Result := AnsiCompareStr(Grid.Cols[ColOrder[C]][Row1], Grid.Cols[ColOrder[C]][Row2]); 

  if Result = 0 then 

  begin 

    Inc(C); 

    while (C <= High(ColOrder)) and (Result = 0) do 

    begin 

      Result := AnsiCompareStr(Grid.Cols[ColOrder[C]][Row1], 

        Grid.Cols[ColOrder[C]][Row2]); 

      Inc(C); 

    end

  end

end

 

begin 

  if SizeOf(ColOrder) div SizeOf(i) <> Grid.ColCount then Exit

 

  for i := 0 to High(ColOrder) do 

    if (ColOrder[i] < 0or (ColOrder[i] >= Grid.ColCount) then Exit

 

  j := 0

  Sorted := False; 

  repeat 

    Inc(j); 

    with Grid do 

      for i := 0 to RowCount - 2 do 

        if Sort(i, i + 1) > 0 then 

        begin 

          TMoveSG(Grid).MoveRow(i + 1, i); 

          Sorted := False; 

        end

  until Sorted or (j = 1000); 

  Grid.Repaint; 

end

 

procedure TForm1.Button1Click(Sender: TObject); 

begin 

  { Sort rows based on the contents of two or more columns. 

    Sorts first by column 1. If there are duplicate values 

    in column 1, the next sort column is column 2 and so on...} 

  SortGridByCols(StringGrid1, [12034]); 

end