Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 22

/ вопрос открыт /

Здравствуйте, подскажите, пожалуйста, как сделать сортировку строк (например, в алфавитном порядке)в StringGrid по какой либо колонке

Александр (Alv) Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Александр (Alv) (статус: Посетитель)
Вопрос отправлен: 28 мая 2006, 12:37
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: bruder

Здравствуйте, Alv!
Код в приложении. Использовать так: GridSort(StringGrid1, 1);
Удачи!

Приложение:
  1. procedure GridSort(StrGrid: TStringGrid; NoColumn: Integer);
  2. var
  3. Line, PosActual: Integer;
  4. Row: TStrings;
  5. begin
  6. Renglon := TStringList.Create;
  7. for Line := 1 to StrGrid.RowCount - 1 do
  8. begin
  9. PosActual := Line;
  10. Row.Assign(TStringlist(StrGrid.Rows[PosActual]));
  11. while True do
  12. begin
  13. if (PosActual = 0) or (StrToInt(Row.Strings[NoColumn - 1]) >=
  14. StrToInt(StrGrid.Cells[NoColumn - 1, PosActual - 1])) then
  15. Break;
  16. StrGrid.Rows[PosActual] := StrGrid.Rows[PosActual - 1];
  17. Dec(PosActual);
  18. end;
  19. if StrToInt(Row.Strings[NoColumn - 1]) < StrToInt(StrGrid.Cells[NoColumn -
  20. 1, PosActual]) then
  21. StrGrid.Rows[PosActual] := Row;
  22. end;
  23. Renglon.Free;
  24. end;
  25.  


Ответ отправил: bruder (статус: 4-ый класс)
Время отправки: 28 мая 2006, 16:08

Ответ #2. Отвечает эксперт: mvp

Моя версия сортировки отличается тем, что можно сортировать в двух направлениях по очереди.

Приложение:
  1. procedure SortGrid(Grid : TStringGrid; Col : integer; ascend : boolean = false);
  2. var
  3. _, __, i : integer;
  4. s : String;
  5. begin
  6. if Col <= Grid.ColCount - 1 then
  7. begin
  8. for _:= 1 to Grid.RowCount - 1 do for __:= _+ 1 to Grid1.RowCount - 1 do if ascend and (StrTOfloat(Grid.Cells[col, _]) > StrTOFloat(Grid.Cells[col, __])) or not ascend and (StrTOFloat(grid.Cells[col, _]) < StrTOFloat(GRid.Cells[col, __])) then for I := 0 to Grid.ColCount - 1 do
  9. begin
  10. s := GRid.Cells[i, _];
  11. GRid.Cells[i, _] := GRid.Cells[i, __];
  12. GRid.Cells[i, __] := s
  13. end;
  14. for _:= 0 to Grid.ColCount - 1 do if Grid.Cells[_, 0][length(Grid.Cells[_, 0])] in ['^', 'v'] then Grid.Cells[_, 0] := copy(Grid.Cells[_, 0], 1, length(GRid.Cells[_, 0]) - 2);
  15. if ascend then GRid.Cells[col, 0] := GRid.cells[col, 0] + ' v' else GRid.Cells[col, 0] := GRid.Cells[col, 0] + ' ^'
  16. end
  17. end;
  18. //------------------------------------------------------------------------------
  19. procedure TForm1.StringGrid1DblClick(Sender: TObject);
  20. var
  21. f : TPoint;
  22. p, i : integer;
  23. begin
  24. f:= StringGrid1.ScreenToClient(Mouse.CursorPos);
  25. if StringGrid1.MouseCoord(f.X, f.Y).Y <= 0 then
  26. begin
  27. SortGrid(StringGrid1, StringGrid1.MouseCoord(f.X, f.Y).x, boolean(StringGrid1.Cols[Stringgrid1.MouseCoord(f.X, f.Y).X].Objects[0]));
  28. StringGrid1.Cols[Stringgrid1.MouseCoord(f.X, f.Y).X].Objects[0] := tobject(pointer(not boolean(StringGrid1.Cols[Stringgrid1.MouseCoord(f.X, f.Y).X].Objects[0])))
  29. end
  30. end;


Ответ отправил: mvp (статус: 4-ый класс)
Время отправки: 29 мая 2006, 10:28


Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:35
Выполнено за 0.02 сек.