Показать сообщение отдельно
  #10  
Старый 05.05.2013, 17:25
Аватар для orion_asm
orion_asm orion_asm вне форума
Прохожий
 
Регистрация: 23.06.2012
Адрес: Украина, Днепропетровск
Сообщения: 19
Версия Delphi: XE3
Репутация: 10
По умолчанию

В секции implementation добавляешь такое: (SgSort взят и частично изменен с cyberforum.ru)
Код:
implementation
// Процедура сортировки StringGrid
procedure SgSort(aSg : TStringGrid; const aCol : Integer; aCompare : TStringListSortCompare = nil);
var
  SlSort, SlRow : TStringList;
  i, j : Integer;
begin
  SlSort := TStringList.Create;
  for i := aSg.FixedRows to aSg.RowCount - 1 do begin
    SlRow := TStringList.Create;
    SlRow.Assign(aSg.Rows[i]);
    SlSort.AddObject(aSg.Cells[aCol, i], SlRow);
  end;
  if Assigned(aCompare) then SlSort.CustomSort(aCompare)
  else SlSort.Sort;
  j := 0;
  for i := aSg.FixedRows to aSg.RowCount - 1 do begin
    SlRow := Pointer(SlSort.Objects[j]);
    aSg.Rows[i].Assign(SlRow);
    SlRow.Free;
    Inc(j);
  end;
  FreeAndNil(SlSort);
end;

// Сортировка по возрастанию
function CompNumAsc(aSl: TStringList; aIndex1, aIndex2: Integer) : Integer;
var
  N1, N2 : Extended;
begin
  N1 := StrToFloatDef(aSl[aIndex1], 0);
  N2 := StrToFloatDef(aSl[aIndex2], 0);
  if N1 < N2 then Result := -1
  else if N1 > N2 then Result := 1
  else Result := 0;
end;

// По убыванию
function CompNumDesc(aSl: TStringList; aIndex1, aIndex2: Integer) : Integer;
var
  N1, N2 : Extended;
begin
  N1 := StrToFloatDef(aSl[aIndex1], 0);
  N2 := StrToFloatDef(aSl[aIndex2], 0);
  if N1 > N2 then Result := -1
  else if N1 < N2 then Result := 1
  else Result := 0;
end;
В обработчике:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
F : TextFile;
mass : array [0..2] of array [0..2] of integer;
i,j : integer;
begin
if OpenDialog1.Execute then
begin
  AssignFile(F, OpenDialog1.FileName);
  Reset(F);
  while not EOF(F) do
  begin
    for i := 0 to 2 do
      for j := 0 to 2 do
      Read(F, mass[i][j]);
  end;
end;
for i := 0 to 2 do
  for j := 0 to 2 do
  begin
  StringGrid1.Cells[i,j] := IntToStr(mass[i][j]);
end;
// Сортируем все столбцы по возрастанию
SgSort(StringGrid1, 0, CompNumAsc);
SgSort(StringGrid1, 1, CompNumAsc);
SgSort(StringGrid1, 2, CompNumAsc);
end;
end.
Функция принимает 3 параметра - имя StringGrid которое нуждается в сортировке, потом индекс столбца в котором должна выполнятся сортировка, и функция сортировки либо по убыванию, либо по возрастанию
Ответить с цитированием