Показать сообщение отдельно
  #14  
Старый 08.05.2009, 09:34
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Вот только попробуйте после этого сказать, что не сортируется! =)
Код:
var
  Form1: TForm1;
  function CustomNumSort(List: TStringList; Index1, Index2: Integer): Integer;

....................

procedure TForm1.Button1Click(Sender: TObject);
var
  SList: TStringList;
  i: Integer;
begin
  SList := TStringList.Create;
  SList.Delimiter := ' ';
  try
    for i := 0 to Memo1.Lines.Count - 1 do
    begin
      SList.DelimitedText := Memo1.Lines.Strings[i];
      StringGrid1.Rows[i].Delimiter := SList.Delimiter;
      StringGrid1.Rows[i].DelimitedText := SList.DelimitedText;
    end;
    SortCols(); // отсортирует по возрастанию столбцы...
    { SortRows(); // ...или строки (раскомментируйте, если надо) }
  finally
    SList.Free;
  end;
end;

procedure TForm1.SortCols;
var
  SList: TStringList;
  i: Integer;
begin
  SList := TStringList.Create;
  SList.Delimiter := '|';
  try
    for i := 0 to StringGrid1.ColCount - 1 do
    begin
      StringGrid1.Cols[i].Delimiter := '|';
      SList.DelimitedText := StringGrid1.Cols[i].DelimitedText;
      SList.CustomSort(CustomNumSort);
      StringGrid1.Cols[i].DelimitedText := SList.DelimitedText;
    end;
  finally
    SList.Free;
  end;
end;

procedure TForm1.SortRows;
var
  SList: TStringList;
  i: Integer;
begin
  SList := TStringList.Create;
  SList.Delimiter := '|';
  try
    for i := 0 to StringGrid1.RowCount - 1 do
    begin
      StringGrid1.Rows[i].Delimiter := '|';
      SList.DelimitedText := StringGrid1.Rows[i].DelimitedText;
      SList.CustomSort(CustomNumSort);
      StringGrid1.Rows[i].DelimitedText := SList.DelimitedText;
    end;
  finally
    SList.Free;
  end;
end;

function CustomNumSort(List: TStringList; Index1, Index2: Integer): Integer;
var
  Value1, Value2: Integer;
begin
  Value1 := StrToInt(List.Strings[Index1]);
  Value2 := StrToInt(List.Strings[Index2]);
  if Value1 < Value2 then Result := -1
  else
    if StrToInt(List.Strings[Index1]) > StrToInt(List.Strings[Index2]) then
         Result := 1
    else Result := 0;
end;
Ответить с цитированием