С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069

Сортировка в gride по последнему столбцу с изменением порядковых номеров в первом столбце

08.11.2014, 21:05. Показов 1202. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня StringGrid отображает текст который перед распечаткой необходимо отсортировать по последней колонке, чтоб я мог в эдите прописать слово которое едет первым а потом все остальные по алфавиту.
Слышал что уважаемый Avazart компетентен в этом вопросе.
Миниатюры
Сортировка в gride по последнему столбцу с изменением порядковых номеров в первом столбце  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.11.2014, 21:05
Ответы с готовыми решениями:

Сортировка матрицы по последнему столбцу
Нужно отсортировать матрицу по последнему столбцу. То есть в зависимости сортировки последнего столбца отсортировать всю матрицу. Я...

Двумерный массив, пред последнему элементу в столбце присвоить 0, а последнему 1 и так в каждом столбце
Двумерный массив, пред последнему элементу в столбце присвоить 0, а последнему 1 итак в каждом столбце.

Найти среднее арифметическое элементов, принадлежащих первой строке, последней строке, первому столбцу и последнему столбцу.
Дан двумерный массив размером n*m, заполненный случайными числами. Найти среднее арифметическое элементов, принадлежащих первой строке,...

18
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
08.11.2014, 21:37
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    std::auto_ptr<TStringList> L(new TStringList);
    for(int i = StringGrid1->FixedRows; i < StringGrid1->RowCount; i++)
        L->AddObject(StringGrid1->Cells[5][i], (TObject*)(new String(StringGrid1->Rows[i]->CommaText)));
 
    L->Sort(); // Если нужна какая-то хитрая сортировка - используй CustomSort...
 
    for(int i = 0; i < L->Count; i++)
    {
        String *p = reinterpret_cast<String*>(L->Objects[i]);
        StringGrid1->Rows[i + StringGrid1->FixedRows]->CommaText = *p;
        StringGrid1->Cells[1][i + StringGrid1->FixedRows] = IntToStr(i + 1);
        delete p;
    }
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
08.11.2014, 21:46  [ТС]
Вот еще один способ который вроде рабочий, а у меня все в кашу сортирует...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void TForm25::SortGridColumn( int iCol )
{
  int irows = StringGrid1->RowCount;
  for( int i = irows; i > 1; i-- )
    {
     for ( int j = 1; j < i; j++ )
       {
       if ( StringGrid1->Cells[iCol][j] < StringGrid1->Cells[iCol][j-1] )
          {
          AnsiString sTemp = StringGrid1->Rows[j]->Text;
          StringGrid1->Rows[j]->Text = StringGrid1->Rows[j-1]->Text;
          StringGrid1->Rows[j-1]->Text = sTemp;
          }
        }
    }
.....
.....
void __fastcall TForm25::Button2Click(TObject *Sender)
{
SortGridColumn(1);
}
мне этот способ очень подходит, если получится наладить его то я смогу в будущем выбирать колонку по которой сортировать.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
08.11.2014, 23:07
Цитата Сообщение от Samrisbe Посмотреть сообщение
я смогу в будущем выбирать колонку по которой сортировать
Мой способ уже сейчас позволяет это. Достаточно заменить индекс столбца в 3-ей строке с 5 на нужный...
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
08.11.2014, 23:15  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Мой способ
я заинклудил memory.h
однако билдеру не понравилась это

C++
1
2
3
4
5
6
7
[C++ Error] Unit25.cpp(85): E2316 'auto_ptr' is not a member of 'std'
[C++ Error] Unit25.cpp(85): E2108 Improper use of typedef 'TStringList'
[C++ Error] Unit25.cpp(85): E2268 Call to undefined function 'L'
[C++ Error] Unit25.cpp(87): E2288 Pointer to structure required on left side of -> or ->*
[C++ Error] Unit25.cpp(89): E2288 Pointer to structure required on left side of -> or ->*
[C++ Error] Unit25.cpp(91): E2288 Pointer to structure required on left side of -> or ->*
[C++ Error] Unit25.cpp(93): E2288 Pointer to structure required on left side of -> or ->*
я внес изменения в первую строку, но после компиляции и сортировки получилась каша.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
08.11.2014, 23:20
Лучший ответ Сообщение было отмечено Samrisbe как решение

Решение

Я не знаю, что за изменения ты внес, приведенный код работает прекрасно (XE2). Если у тебя версия Билдера древнее, чем останки мамонтов - то замени:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    TStringList *L = new TStringList;
    for(int i = StringGrid1->FixedRows; i < StringGrid1->RowCount; i++)
        L->AddObject(StringGrid1->Cells[5][i], (TObject*)(new String(StringGrid1->Rows[i]->CommaText)));
 
    L->Sort(); // Если нужна какая-то хитрая сортировка - используй CustomSort...
 
    for(int i = 0; i < L->Count; i++)
    {
        String *p = reinterpret_cast<String*>(L->Objects[i]);
        StringGrid1->Rows[i + StringGrid1->FixedRows]->CommaText = *p;
        StringGrid1->Cells[1][i + StringGrid1->FixedRows] = IntToStr(i + 1);
        delete p;
    }
    delete L; // Вот для этого и нужен auto_ptr, чтобы самому не парить себе мозг удалением объекта...
, если чуть поновее - просто подключи
C++
1
#include <memory>
, безо всяких .h... А работать на Юникодной версии Билдера с ANSI-строками - это вообще извращение... Чтобы L не срабатывало - я даже и не помню такого. Кто кастрировал-то так твой Билдер? Выкинь его на фиг, если он основ не понимает, давно пора уже переходить на линейку XE...
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
08.11.2014, 23:23  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Если у тебя версия Билдера древнее, чем останки мамонтов
билдер 6
если честно я даже не пробовал перенести проект в Rad2, чет я очкую...
0
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
08.11.2014, 23:32  [ТС]
Вот что получилось:
Миниатюры
Сортировка в gride по последнему столбцу с изменением порядковых номеров в первом столбце   Сортировка в gride по последнему столбцу с изменением порядковых номеров в первом столбце  
0
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
08.11.2014, 23:46  [ТС]
А как сделать чтоб первую колонку не трогало?

Добавлено через 11 минут
Цитата Сообщение от UI Посмотреть сообщение
давно пора уже переходить на линейку XE...
Относительно новые проекты в Rade собираю, этот уже на стадии завершения поэтому я не хочу его переселять в новый домик
0
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
10.11.2014, 22:19  [ТС]
Не сортирует

Добавлено через 19 минут
Эта функция сортирует как надо если нет шапки, вопрос в том чтобы сортировка не касалась первой колонки и верхней первой колонки.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int irows = StringGrid1->RowCount;
   for( int i = irows; i > 1; i-- )
     {
     for ( int j = 1; j < i; j++ )
       {
       if ( StringGrid1->Cells[iCol][j] < StringGrid1->Cells[iCol][j-1] )
         {
         AnsiString sTemp = StringGrid1->Rows[j]->Text;
         StringGrid1->Rows[j]->Text = StringGrid1->Rows[j-1]->Text;
         StringGrid1->Rows[j-1]->Text = sTemp;
         }
       }
     }
на крайний случай я их буду удалять и потом обратно заполнять
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
10.11.2014, 23:25
Цитата Сообщение от Samrisbe Посмотреть сообщение
на крайний случай я их буду удалять и потом обратно заполнять
Почему "крайний"? Вполне резонно и практически не тормозит... . Вот мой наскоро сделанный вариант; сортирует по колонке Заявка, для 5-и строк__
C++
1
2
3
4
5
6
7
8
9
10
11
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   TStringList *sl = new TStringList;
   for(int i=1;i<6;i++) sl->Add(StringGrid1->Cells[4][i]+StringGrid1->Rows[i]->CommaText);
   sl->Sort();
   for (int i=1;i<6;i++) {
     StringGrid1->Rows[i]->CommaText=sl->Strings[i-1];
     StringGrid1->Cells[0][i] = i;
   }
   delete sl; 
}
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
11.11.2014, 02:05  [ТС]
Цитата Сообщение от nick42 Посмотреть сообщение
Вот мой наскоро сделанный вариант
Чувствителен если в колонке заявке текст из двух слов, они кривовато сортируются, в любом случае спасибо буду работать.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
11.11.2014, 15:33
Цитата Сообщение от Samrisbe Посмотреть сообщение
в колонке заявке текст из двух слов, они кривовато сортируются
Конечно; CommaText разделяет "колонки" запятыми, но если текст из нескольких слов, то заключает блок в кавычки. Если это всё предусмотреть (а также и то, что при сортировке по возрастанию номера располагаются "неправильно", - 1,10,11,...19,2,20,21...,29,3, если не использовать формат с предшествующими нулями), то всё будет нормально. Правильным считаю также при работе сохранять в файл промежуточные данные: sl->SaveToFile(), - будет понятнее, что не так при ошибках в сортировке.
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
13.11.2014, 20:12  [ТС]
Цитата Сообщение от nick42 Посмотреть сообщение
сохранять в файл промежуточные данные: sl->SaveToFile()
тут тоже не совсем все норм вот что в стринге
C++
1
2
3
4
5
6
7
8
9
10
Подключить1,"8Марта 23 п.1 кв: 
",547852,458985,Подключить
Запуск2,"29ВГородок 14 п.3 кв: 55
",547852,458985,Запуск
Кнопка3,"АКесаева 27-1 п.1 кв: 55
",547852,458985,Кнопка
Подключить4,"АКесаева  5 п.2 кв: 55
",547852,458985,Подключить
Подключить5,"50ЛОктября 8 п.1 кв: 55
",547852,458985,Подключить
, может вместо stringgrid другой компонент использовать?
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
13.11.2014, 20:35
.. а чего тут не так? (форматирование могло быть по вине вэб-редактора, т.к. стиль выбран С++; я это не учитывал. В остальном все нормально.)
1
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
13.11.2014, 20:48
Лучший ответ Сообщение было отмечено Samrisbe как решение

Решение

Samrisbe, глянь вот тут, вдруг, на мысли какие натолкнет...
Перемешать строки в StringGrid
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
13.11.2014, 20:57  [ТС]
Цитата Сообщение от BRcr Посмотреть сообщение
Перемешать строки в StringGrid
Вот оно то что мне нужно:
C++
1
2
3
4
5
6
7
8
TStringList *L = new TStringList;
    for(int i = StringGrid1->FixedRows; i < StringGrid1->RowCount; i++)
        L->Add(StringGrid1->Rows[i]->CommaText);
    for(int i = 0; i < L->Count; i++)
        L->Exchange(Random(L->Count), Random(L->Count));
    for(int i = StringGrid1->FixedRows; i < StringGrid1->RowCount; i++)
        StringGrid1->Rows[i]->CommaText = L->Strings[i - StringGrid1->FixedRows];
    delete L;
только random заменить на нужный мне столбец/
Спасибо UI, и BRcr, всем спасибо!
0
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
15.11.2014, 00:18  [ТС]
Вот что получилось:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
int iRows = 1;
int iCoun = 1;
int iDigi = 1;
 
TStringList *Sara=new TStringList;
TStringList *inord=new TStringList;
TStringList *iwest=new TStringList;
TStringList *list = new TStringList;
//---------------------------------------------------------------------------
__fastcall TForm25::TForm25(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm25::FormShow(TObject *Sender)
{
Color=Form1->Color;
Font=Form1->Font;
 
Caption = "Àäðåñàò çàÿâîê " + Form1->Edit5->Text;
StringGrid1->Cells[0][0]="¹";
StringGrid1->Cells[1][0]="Àäðåñ";
StringGrid1->Cells[2][0]="Òåëåôîí äîì";
StringGrid1->Cells[3][0]="Òåëåôîí ìîá";
StringGrid1->Cells[4][0]="Çàÿâêà";
 
// ñ÷èòûâàåì èç Memo
 list->Text = Form21->Memo1->Text;
 for(int i = 0; i < list->Count; i++)
   {
   if (list->Strings[i].Pos("êâ: "))
     {
      StringGrid1->RowCount+=1;
      Sara->Text=iCoun;
      iwest->Text = list->Strings[i];
      iwest->Text = StringReplace(iwest->Text, " ", "_",TReplaceFlags() << rfReplaceAll);
      StringGrid1->Rows[iRows]->DelimitedText = Sara->Text + iwest->Text +" "+ list->Strings[i+1];
      iRows++;
      iCoun++;
      }
    }
 StringGrid1->RowCount-=1;
 
 // ìåíÿåì ïðîáåëû íà _
for(int i=1; i < StringGrid1->ColCount;i++)
   for(int j=1; j < StringGrid1->RowCount;j++)
     if (StringGrid1->Cells[i][j].Pos("_"))
        {
        inord->Text=StringGrid1->Cells[i][j]; //ñ÷èòàëè â ïåðåìåííóþ òåêñò äëÿ îáðàáîòêè
        inord->Text = StringReplace(inord->Text, "_", " ",TReplaceFlags() << rfReplaceAll);
        StringGrid1->Cells[i][j]=inord->Text;
        }  
 
 // ñîðòðóåì è ìåíÿåì â ïåðâîé êîëîíêå ïîðÿäîê öèôð
 TStringList *sl = new TStringList;
   for(int i=1;i<6;i++) sl->Add(StringGrid1->Cells[4][i]+StringGrid1->Rows[i]->CommaText);
     sl->Sort();
   for(int i = StringGrid1->FixedRows; i < StringGrid1->RowCount; i++)
     {
     StringGrid1->Rows[i]->CommaText = sl->Strings[i - StringGrid1->FixedRows];
     StringGrid1->Cells[0][iDigi] = iDigi;
     iDigi++;
     }
   delete sl;
   iDigi = 1;
}
//--------------------------------------------------------------------------
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
15.11.2014, 03:48
Лучший ответ Сообщение было отмечено Samrisbe как решение

Решение

Samrisbe, это__
C++
1
2
3
4
5
StringGrid1->Cells[0][0]="№";
StringGrid1->Cells[1][0]="Адрес";
StringGrid1->Cells[2][0]="Телефон дом";
StringGrid1->Cells[3][0]="Телефон моб";
StringGrid1->Cells[4][0]="Заявка";
можно сократить в записи (я обычно так делаю):
C++
1
    StringGrid1->Rows[0]->CommaText="¹,Àäðåñ,\"Òåëåôîí äîì\",\"Òåëåôîí ìîá\",Çàÿâêà";
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.11.2014, 03:48
Помогаю со студенческими работами здесь

В прямоугольной матрице найти сумму элементов, принадлежащих первой строке, последней строке, первому столбцу и последнему столбцу.
7.6.2. Помогите, пожалуйста, решить задачу в С++. В прямоугольной матрице найти сумму элементов, принадлежащих первой строке,...

В прямоугольной матрице найти сумму элементов, принадлежащих первой строке, последней строке, первому столбцу и последнему столбцу
в прямоугольной матрице найти сумму элементов, принадлежащих первой строке, последней строке, первому столбцу и последнему столбцу.

Сортировка по правому столбцу. Поиск в правом столбце значения из левой
Здравствуйте!!!! Кому не сложно и есть время на такую кашу ((( Искал в инете макрос не нашел. Сортировку макросрекордером делал, но как...

Сортировка данных в столбцах по значениям строк в первом столбце
Приветствую всех пользователей данного ресурса! Гуру Excel и просто опытные пользователи, нужна ваша помощь! Целый день ломаю голову,...

Нумерация порядковых номеров
Здравствуйте, у меня такой вопрос. Вот у меня есть два массива m1 и m2 В m1 содержаться различные числа В m2 порядковые номера. То...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru