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

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

08.11.2014, 21:05. Показов 1218. Ответов 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
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 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
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 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
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru