Delphi - база знаний

       

Сортировка столбцов в StringGrid


Сортировка столбцов в StringGrid



Procedure GridSort(StrGrid: TStringGrid; NoColumn: Integer); 
Var Line, PosActual: Integer; 
    Row: TStrings; 
begin 
  Renglon := TStringList.Create; 
  For Line := 1 to StrGrid.RowCount-1 do 
  Begin 
    PosActual := Line; 


    Row.Assign(TStringlist(StrGrid.Rows[PosActual])); 
    While True do 
    Begin 
      If (PosActual = 0) Or (StrToInt(Row.Strings[NoColumn-1]) >= 
          StrToInt(StrGrid.Cells[NoColumn-1,PosActual-1])) then 
        Break; 
      StrGrid.Rows[PosActual] := StrGrid.Rows[PosActual-1]; 
      Dec(PosActual); 
    End
    If StrToInt(Row.Strings[NoColumn-1]) < StrToInt(StrGrid.Cells[NoColumn-1,PosActual]) then 
      StrGrid.Rows[PosActual] := Row; 
  End
  Renglon.Free; 
end;



type TStringGridExSortType = (srtAlpha,srtInteger,srtDouble); 

procedure GridSort(SG : TStringGrid; ByColNumber,FromRow,ToRow : integer; 
                   SortType : TStringGridExSortType = srtAlpha); 
var Temp : TStringList; 

    function SortStr(Line : string) : string
    var RetVar : string
    begin 
      case SortType of 
           srtAlpha   : Retvar := Line; 
           srtInteger : Retvar := FormatFloat('000000000',StrToIntDef(trim(Line),0)); 
           srtDouble  : try 
                          Retvar := FormatFloat('000000000.000000',StrToFloat(trim(Line))); 
                        except 
                          RetVar  := '0.00'; 
                        end
      end

      Result := RetVar; 
    end

    // Рекурсивный QuickSort 
    procedure QuickSort(Lo,Hi : integer; CC : TStrings); 

        procedure Sort(l,r: integer); 
        var  i,j : integer; 
             x   : string
        begin 
          i := l; j := r; 
          x := SortStr(CC[(l+r) DIV 2]); 
          repeat 
            while SortStr(CC[i]) < x do inc(i); 
            while x < SortStr(CC[j]) do dec(j); 
            if i <= j then begin 
              Temp.Assign(SG.Rows[j]);      // Меняем местами 2 строки
              SG.Rows[j].Assign(SG.Rows[i]); 
              SG.Rows[i].Assign(Temp); 
              inc(i); dec(j); 
            end
          until i > j; 
          if l < j then sort(l,j); 
          if i < r then sort(i,r); 
        end

     begin {quicksort}; 
       Sort(Lo,Hi); 
     end

begin 
  Temp := TStringList.Create; 
  QuickSort(FromRow,ToRow,SG.Cols[ByColNumber]); 
  Temp.Free; 
end;

Взято с Исходников.ru



Содержание раздела