Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2022, 23:08   #1
mr.stranger
Пользователь
 
Регистрация: 02.05.2022
Сообщений: 52
По умолчанию Сортировка в StringGrid

Подскажите пожалуйста, как написать двойную сортировку:
по алфавиту в первом столбце, а если слова совпали, то по числам в третьем столбце (во втором есть значения, но они не важны)
Логически понимаю, а с написанием проблемы
Надо написать сортировку первого по алфавиту
Потом в рамках группы с одинаковыми значениями первого, написать сортировку по третьему
Есть код ввода, сортировки только по алфавиту и только по числам
mr.stranger вне форума Ответить с цитированием
Старый 18.05.2022, 23:11   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
if (ms1[j] > ms1[j + 1]) or ((ms1[j] = ms1[j + 1]) and (ms3[j] > ms3[j + 1])) then
macomics вне форума Ответить с цитированием
Старый 18.05.2022, 23:31   #3
mr.stranger
Пользователь
 
Регистрация: 02.05.2022
Сообщений: 52
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
if (ms1[j] > ms1[j + 1]) or ((ms1[j] = ms1[j + 1]) and (ms3[j] > ms3[j + 1])) then
Вроде работает, но опять смотрит только на первую цифру, а не на число в целом
mr.stranger вне форума Ответить с цитированием
Старый 18.05.2022, 23:32   #4
mr.stranger
Пользователь
 
Регистрация: 02.05.2022
Сообщений: 52
По умолчанию

Код:
if RadioButton3.Checked = True then
begin
for i := 1 to StringGrid1.RowCount-1 do
begin
ms1[i] := StringGrid1.Cells[1,i];
ms2[i] := StringGrid1.Cells[2,i];
ms3[i] := StringGrid1.Cells[3,i];
end;
for i := 1 to StringGrid1.RowCount-1 do
for j := 1 to StringGrid1.RowCount-i-1 do
begin
if (ms1[j] > ms1[j + 1]) or ((ms1[j] = ms1[j + 1]) and (ms3[j] > ms3[j + 1])) then
begin
s1 := ms1[j];
ms1[j] := ms1[j+1];
ms1[j+1] := s1;

s2 := ms2[j];
ms2[j] := ms2[j+1];
ms2[j+1] := s2;

s3 := ms3[j];
ms3[j] := ms3[j+1];
ms3[j+1] := s3;

end;
end;
for i := 1 to StringGrid1.RowCount-1 do
begin
StringGrid1.Cells[1,i] := ms1[i];
StringGrid1.Cells[2,i] := ms2[i];
StringGrid1.Cells[3,i] := ms3[i];
end;
end;
mr.stranger вне форума Ответить с цитированием
Старый 19.05.2022, 00:30   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

А я писал, что надо ms3 сделать целочисленным, а не строковым и преобразовывать строки при заполнении массива.
Код:
var
  ...
  ms3: array of Smallint; // +/- 127 лет вам хватит?
begin with StringGrid1 do begin
...
  for i:=1 to RowCount - 1 do
    ms3[i] := strtoint(Cells[3, i]) - 2000;
...
  for i:=1 to RowCount - 1 do
    Cells[3, i] := inttostr(2000 + ms3[i]);
...
end; end;

Последний раз редактировалось macomics; 19.05.2022 в 00:45.
macomics вне форума Ответить с цитированием
Старый 19.05.2022, 09:39   #6
mr.stranger
Пользователь
 
Регистрация: 02.05.2022
Сообщений: 52
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Smallint
Мы такого не проходили
Код:
var ms3:array of integer;
...
ms3[i] := StrToInt(StringGrid1.Cells[3,i]);
...
s3 := IntToStr(ms3[j]);
ms3[j] := ms3[j+1];
ms3[j+1] := StrToInt(s3);
...
StringGrid1.Cells[3,i] := IntToStr(ms3[i]); 
...
mr.stranger вне форума Ответить с цитированием
Старый 19.05.2022, 13:00   #7
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

А мимо остального проходили? Целочисленные типы проходят обычно до сложных типов типа строк, массивов и записей.
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Stringgrid сортировка krabich Общие вопросы Delphi 2 30.11.2013 16:46
Сортировка StringGrid GaleI Помощь студентам 3 29.03.2012 13:08
Сортировка в StringGrid Ch00kan0ff Общие вопросы C/C++ 2 24.03.2009 18:09