Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/35: Рейтинг темы: голосов - 35, средняя оценка - 4.94
 Аватар для Bastis
1 / 1 / 0
Регистрация: 22.09.2009
Сообщений: 39

Сделать сортировку StringGrid

22.09.2009, 19:38. Показов 6747. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задали сделать сортировку StringGrid. Код,который написала я преподу не понравился, сказал написать короче. Подскажите пожалуйста как...
Код:
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
if (RG->ItemIndex==0)
 {
    String buff;
 String buff2;
 String buff3;
 
 for (int i = 0; i < SG->RowCount-1; i++)
   for (int j = i; j < SG->RowCount; j++)
    {
     if (SG->Cells[1][i]<SG->Cells[1][j])
     {
          buff=SG->Cells[0][i];
          SG->Cells[0][i]= SG->Cells[0][j];
          SG->Cells[0][j]=buff;
 
          buff2=SG->Cells[1][i];
          SG->Cells[1][i]= SG->Cells[1][j];
          SG->Cells[1][j]=buff2;
 
          buff3=SG->Cells[2][i];
          SG->Cells[2][i]= SG->Cells[2][j];
          SG->Cells[2][j]=buff3;
     }
    }
 }
 if (RG->ItemIndex==1)
 {
    String buff;
 String buff2;
 String buff3;
 for (int i = 1; i < SG->RowCount+1; i++)
   for (int j = i; j < SG->RowCount; j++)
   {
     if ((StrToInt(SG->Cells[2][i]))>StrToInt((SG->Cells[2][j])))
      {
       buff=SG->Cells[0][i];
       SG->Cells[0][i]= SG->Cells[0][j];
       SG->Cells[0][j]=buff;
 
       buff2=SG->Cells[1][i];
       SG->Cells[1][i]= SG->Cells[1][j];
       SG->Cells[1][j]=buff2;
 
       buff3=SG->Cells[2][i];
       SG->Cells[2][i]= SG->Cells[2][j];
       SG->Cells[2][j]=buff3;
      }
   }
 }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.09.2009, 19:38
Ответы с готовыми решениями:

Как ускорить сортировку StringGrid?
Привет! Провожу сортировку строк пузырьковым методом прямо StringGrid более 500 записей. При этом на момент работы алгоритма интерфейс...

Delphi 7 Stringgrid Нужно сделать цикл для заполнения Stringgrid данными из другого Stringgrid
Нужно чтобы из Stringgrid1 данные переносились в Stringgrid2 Но ТОЛЬКО ПО УСЛОВИЮ Таблицы Stringgrid2 На рис всё показано. За работающий...

Выполнить сортировку данных в объекте stringgrid
Необходимо выполнить сортировку заполненных вручную данных в новом stringgrid. Данные для заполнения: склады, участки, материалы,...

26
 Аватар для Bastis
1 / 1 / 0
Регистрация: 22.09.2009
Сообщений: 39
24.09.2009, 18:42  [ТС]
Мне сказали использовать TStringList и его свойства, но не могу найти как можно сортировать по данным середины строчки.
Подскажите пожаааалуйста....
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
24.09.2009, 18:58
Цитата Сообщение от Bastis Посмотреть сообщение
сортировать по данным середины строчки.
как это понять?
0
 Аватар для Bastis
1 / 1 / 0
Регистрация: 22.09.2009
Сообщений: 39
24.09.2009, 19:02  [ТС]
допустим строки StringList:

1 Иванов 5
4 Петров 23
2 Сидоров 45

если вызывать Sort, то сортируются по первым числам(1,4,2) а мне надо сортировать по фамилиям или вторым числам. А это же уже середина строки получается
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
24.09.2009, 19:43
можно еще конечно извратиться: обработать строки, чтобы фамилии сначала стояли, отсортировать и вернуть все обратно...
0
 Аватар для Bastis
1 / 1 / 0
Регистрация: 22.09.2009
Сообщений: 39
24.09.2009, 19:48  [ТС]
это настоящее извращение
я тут в инете нашла код свойства CustomSort, только разобраться в нем не могу((
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int __fastcall MySortCompare(TStringList* List, int Index1, int Index2)
{
  String str1=List->Strings[Index1];
  String str2=List->Strings[Index2];
  return String(str1.c_str()+str1.LastDelimiter("_"))<//если в порядке возрастания, то поменять на  >
                      String(str2.c_str()+str2.LastDelimiter("_"));
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TStringList *sl=new TStringList;
  sl->LoadFromFile("aa");
  sl->CustomSort(MySortCompare);
  ShowMessage(sl->Text);
  delete sl;
}
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
24.09.2009, 20:21
Bastis, ну в общем это и есть мое настоящее извращение в исполнении:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//---------------------------------------------------------------------------
int __fastcall MySortCompare(TStringList* List, int Index1, int Index2)
{
  AnsiString str1=List->Strings[Index1];
  str1 = str1.SubString(str1.Pos(" ") + 1, str1.LastDelimiter(" ") - 1 - str1.Pos(" "));
  AnsiString str2=List->Strings[Index2];
  str2 = str2.SubString(str2.Pos(" ") + 1, str2.LastDelimiter(" ") - 1 - str2.Pos(" "));
  return str1 > str2;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::Button1Click(TObject *Sender)
{
  TStringList *sl=new TStringList;
  sl->Add("1 Иванов 5");
  sl->Add("4 Петров 23");
  sl->Add("2 Сидоров 45");
  sl->CustomSort(MySortCompare);
  ShowMessage(sl->Text);
  delete sl;
}
0
 Аватар для Bastis
1 / 1 / 0
Регистрация: 22.09.2009
Сообщений: 39
24.09.2009, 21:06  [ТС]
опять загвоздка...
C++
1
int __fastcall MySortCompare(TStringList* List, int Index1, int Index2)
функция описывается с 3 параметрами, значит по идее надо еще индексы сравниваемых передавать. если пишу
C++
1
2
3
4
5
6
TStringList *sl=new TStringList;
     for (int i = 0; i < SG->RowCount-1; i++) 
      sl->Add(SG->Rows[i]->DelimitedText);   
    for (int i = 0; i < SG->RowCount-1; i++) {
      for (int j = i; i < SG->RowCount; i++)     
    sl->CustomSort(MySortCompare,i,j);
то выдает ошибку
[BCC32 Error] Unit1.cpp(45): E2227 Extra parameter in call to _fastcall TStringList::CustomSort(int (_fastcall *)(TStringList *,int,int))
если без индексов
C++
1
sl->CustomSort(MySortCompare);
то не происходит ровным счетом ничего
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
24.09.2009, 21:37
Bastis, покажи, что ты в самой функции сравенния написал, и ты вообще пробовал мой код, он нормально сортирует
0
 Аватар для Bastis
1 / 1 / 0
Регистрация: 22.09.2009
Сообщений: 39
24.09.2009, 21:43  [ТС]
Цитата Сообщение от VoodooMan Посмотреть сообщение
Bastis, покажи, что ты в самой функции сравенния написал, и ты вообще пробовал мой код, он нормально сортирует
*написала
вот сама функция,вроде чисто твой код скопировала:
C++
1
2
3
4
5
6
7
8
int __fastcall MySortCompare(TStringList* List, int Index1, int Index2)
{
  AnsiString str1=List->Strings[Index1];
  str1 = str1.SubString(str1.Pos(" ") + 1, str1.LastDelimiter(" ") - 1 - str1.Pos(" "));
  AnsiString str2=List->Strings[Index2];
  str2 = str2.SubString(str2.Pos(" ") + 1, str2.LastDelimiter(" ") - 1 - str2.Pos(" "));
  return str1 > str2;
}
вот обращение к ней
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  void __fastcall TForm1::RGClick(TObject *Sender)
{
 
if (RG->ItemIndex==0)
 {
     TStringList *sl=new TStringList;
     for (int i = 0; i < SG->RowCount-1; i++)  
      sl->Add(SG->Rows[i]->DelimitedText);
     
 
    for (int i = 0; i < SG->RowCount-1; i++) {
      for (int j = i; i < SG->RowCount; i++)     
    sl->CustomSort(MySortCompare);
    }
 }
}
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
24.09.2009, 22:08
Bastis, а можно один ненавящевый вопрос: покажи пальцем, откуда взят такой вызов сортировки, как у тебя? ни у меня, ни в твоем примере такого нет...
0
 Аватар для Bastis
1 / 1 / 0
Регистрация: 22.09.2009
Сообщений: 39
24.09.2009, 22:34  [ТС]
VoodooMan , ступила согласна. в тот код еще обратное отображение в грид добавила. Но сортирует все таки странно. Для трех записей все нормально. Но добавив еще одну
1 Иванов 5
4 Петров 23
3 Сидоров 4
2 Михайлов 45

после сортировки получаю

3 Сидоров 4
2 Михайлов 45
1 Иванов 5
2 Михайлов 45

получается он поменял 1 с 3,2 с 4 строкой
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
25.09.2009, 00:17
вот так работает гораздо лучше:
C++
1
2
3
4
5
6
7
8
int __fastcall MySortCompare(TStringList* List, int Index1, int Index2)
{
  AnsiString str1=List->Strings[Index1];
  str1 = str1.SubString(str1.Pos(" ") + 1, str1.LastDelimiter(" ") - 1 - str1.Pos(" "));
  AnsiString str2=List->Strings[Index2];
  str2 = str2.SubString(str2.Pos(" ") + 1, str2.LastDelimiter(" ") - 1 - str2.Pos(" "));
  return strcmp(str1.c_str(), str2.c_str());
}
1
 Аватар для Bastis
1 / 1 / 0
Регистрация: 22.09.2009
Сообщений: 39
28.09.2009, 17:32  [ТС]
VoodooMan, спасибо большое
0
0 / 0 / 0
Регистрация: 19.01.2010
Сообщений: 25
19.01.2010, 19:19
Как сделать так чтобы в этот код автоматически вставлялись имена.
C++
1
2
3
4
 
  sl->Add("1 Иванов 5");
  sl->Add("4 Петров 23");
  sl->Add("2 Сидоров 45");
У меня пример таков , сделать библиотченый фонд и отсортировать книги по названию или по автору ( я так понял что значит по алфавиту ) .Вот уже 5 часов и так и так мучаюсь но сделать этот код не получается .
А в коде что выше меня не устраивает то , что когда я добавлю книгу , она автоматически не добавится в программу , а значит не отсортируется , хелп.Если надо будет я могу скинуть программу , но мне надо очень срочно решить эту проблему , из-за этого застопорился на месте....
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
19.01.2010, 20:04
gradiusalisik,
Цитата Сообщение от gradiusalisik Посмотреть сообщение
А в коде что выше меня не устраивает то , что когда я добавлю книгу , она автоматически не добавится в программу , а значит не отсортируется , хелп.
а как ты добавляешь?
0
0 / 0 / 0
Регистрация: 19.01.2010
Сообщений: 25
19.01.2010, 20:07
http://img704.imageshack.us/im... 248741.jpg
Ввожу в полях и нажимаю добавить
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
19.01.2010, 20:09
ну так повесь вызов сортировки на какое-нить событие и будет тебе счастье
0
0 / 0 / 0
Регистрация: 19.01.2010
Сообщений: 25
19.01.2010, 20:15
Знал бы как сортировать и тыкать давно бы сделал (((, у меня курсовая а препод гад , дал ее и сказал сами изучайте данную программу (С++Builder) .Вот и мучаюсь уже фиг знает сколько а что и как и куда вообще не дохожу.

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
         String p;
    {          if(ComboBox2->Text=="Автор")
               {     StringGrid2->Cells[2][i]=temp->Avtor;
 
               if (StringGrid2->Cells[2][i]<StringGrid2->Cells[2][i+1])
               p=StringGrid2->Cells[2][i];
               StringGrid2->Cells[2][i]=StringGrid2->Cells[2][i+1] ;
               StringGrid2->Cells[2][i+1]=p;
                                         StringGrid1->Visible=false;
                 StringGrid2->Visible=true;
                 }
        if(ComboBox2->Text=="Название")
               { Button1->Visible=false;
                 Button2->Visible=true;
                 StringGrid1->Visible=true;
                 StringGrid2->Visible=false;}
        if(ComboBox1->Text=="Количество копий")
               { Button1->Visible=false;
                 Button2->Visible=false;
                 Button3->Visible=true;
                 }
      }
И так пытался

C++
1
2
3
4
5
6
7
8
  String p,m;
for(p= StringGrid1->Cells[2][i];p< StringGrid1->Cells[2][i+1];p++)
              if(ComboBox2->Text=="Автор")
 
               { if (strcmp(StringGrid1->Cells[2][i],StringGrid1->Cells[2][i+1])>0)
               m=StringGrid1->Cells[2][i];
               StringGrid1->Cells[2][i]=StringGrid1->Cells[2][i+1];
               StringGrid1->Cells[2][i+1]=m;
Но то ругается на стринг грид то еще что . Я хотел сделать так , чтобы при нажатии в колнке распределение по допустим на Автор и оно распределяло , так я теперь вообще запутался и даже не знаю как сортировать
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
19.01.2010, 20:26
Цитата Сообщение от gradiusalisik Посмотреть сообщение
у меня курсовая а препод гад , дал ее и сказал сами изучайте данную программу (С++Builder)
gradiusalisik, вообще, привыкайте, что совсем будете разбираться сами, никто вам все подряд разжевывать не будет...
Цитата Сообщение от gradiusalisik Посмотреть сообщение
Я хотел сделать так , чтобы при нажатии в колнке распределение по допустим на Автор и оно распределяло
что-то я начал путаться - тебе надо сортировка после добавления или ты еще выбираешь по какому столбцу сортировать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.01.2010, 20:26
Помогаю со студенческими работами здесь

Нужно доделать сортировку StringGrid методом простых обменов
Сортирует по первому столбцу StringGrid. Не передвигает только остальные столбцы Вот скрин SG procedure...

Сортировку вставками меняем на Пирамидальную сортировку и на Сортировку подсчётом
Здравствуйте. Я не как не могу разобраться.Помогите. У меня есть листинг сортировки вставками: #include &quot;stdafx.h&quot; ...

Как сделать сортировку по id
Здравствуйте. Ребят помогите , как сделать вывод пользователей согласно id то-есть id=1 первый в списке, id=2 второй в списке и так далее....

Как сделать сортировку
Как сделать сортировку переделав этот код, чтобы получилось как в примере double massive = new double; int countm = 0; ...

Как сделать сортировку?
Есть таблица transfer: -------------- id | who -------------- 1 | Petr 2 | Vasa 3 | Vasa 4 | Eugen


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных выбран регистр накопления, в. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru