Показать сообщение отдельно
  #5  
Старый 19.03.2007, 16:59
Holy Holy вне форума
Новичок
 
Регистрация: 31.07.2006
Сообщения: 55
Репутация: 10
По умолчанию

Вот набросал.
Принимает:
StringGrid - грид типа TStringGrid с данными;
RowIndx - номер строки, по которой выполнять сортировку;
StartCol - номер столбца, с которого начинается сортировка;
StopCol - номер столбца, на котором окончить сортировку;

Необходимо добавить проверки принимаемых значений и подумать о перестановке столбцов разом возможно через TStrings.

Код:
procedure Sort(var StringGrid: TStringGrid; RowIndx: Integer;
  StartCol, StopCol: Integer);
var
  Interval: Integer;
  i, j: Integer;
  Moved: Boolean; // пpизнак пеpестановки
  Str: AnsiString;
begin
  if StartCol > StopCol then
    Exit;

  // начальное значение интеpвала
  Interval := (StopCol - StartCol) div 2;

  // цикл с yменьшением интеpвала до 1
  while Interval > 0 do
  begin
    // пyзыpьковая соpтиpовка с интеpвалом
    // цикл, пока есть пеpестановки
    Moved := True;
    while Moved do
    begin
      Moved := False;

      for i := StartCol to StopCol - (1 + Interval) do
      begin
        if AnsiCompareText(StringGrid.Cells[i, RowIndx],
          StringGrid.Cells[i+Interval, RowIndx]) > 0 then
        begin
          // пеpестановка
          for j := 0 to StringGrid.RowCount - 1 do
          begin
            Str := StringGrid.Cells[i, j];
            StringGrid.Cells[i, j] := StringGrid.Cells[i+Interval, j];
            StringGrid.Cells[i+Interval, j] := Str;
          end;

          // пpизнак пеpестановки
          Moved := True;
        end;
      end;
    end;

    // yменьшение интеpвала
    Interval := Interval div 2;
  end;
end;
Ответить с цитированием