Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
1 / 1 / 2
Регистрация: 15.08.2017
Сообщений: 81

Удаление одинаковых строк в StringGrid1

21.11.2017, 16:47. Показов 1900. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как в StringGrid удалить абсолютно одинаковые строчки?
Пробовал переделать найденный код для делфи на билдер, но не вышло..
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.11.2017, 16:47
Ответы с готовыми решениями:

Удаление одинаковых строк
Доброе время суток, подскажите, правильно ли я делаю удаление одинаковых строк? сам код рабочий, но вот незадача... очень долго...

Удаление одинаковых строк Листбокс
Делаю игру алхимия и там добавляются одинаковые строки в лисбокс, а как сделать чтоб они одинаковые недобавлялись? или если добавились то...

Удаление одинаковых строк двумерного массива
Доброе время суток дамы и господа. сижу в С++ Builder'e 6, имеется массив чисел otvetibuff 110000...000 110000...000 ...

13
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33403 / 21513 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
21.11.2017, 17:10
Какой именно Дельфийский код был найден? Он точно решает задачу?
0
1 / 1 / 2
Регистрация: 15.08.2017
Сообщений: 81
21.11.2017, 17:11  [ТС]
Такой:
Delphi
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
for r := 1 to stringgrid1.rowCount - 1 do
      begin
      for k := r+1 to stringgrid1.rowCount - 1 do
        begin
           if ((stringgrid1.Cells[4,r]=stringgrid1.Cells[4,k])
             and
           (stringgrid1.Cells[5,r]=stringgrid1.Cells[5,k]))then
              begin                      
                 GridDeleteRow(k, stringGrid1);                  
              end;
        end;
 
procedure GridDeleteRow
 
var
   i: Integer;
 begin
   Grid.Row := RowNumber;
   if (Grid.Row = Grid.RowCount - 1) then
     { On the last row}
     Grid.RowCount := Grid.RowCount - 1
   else
   begin
     { Not the last row}
     for i := RowNumber to Grid.RowCount - 1 do
       Grid.Rows[i] := Grid.Rows[i + 1];
     Grid.RowCount := Grid.RowCount - 1;
   end;
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33403 / 21513 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
21.11.2017, 17:26
Лучший ответ Сообщение было отмечено дно21 как решение

Решение

Процедура GridDeleteRow не нужна, вот тут: Классы-перехватчики (interceptor classes) я показывал, как открыть методы для удаления строки/столбца в гриде. Так что достаточно просто пробежаться по всем строкам грида, и сравнить с предыдущими:
C++
1
2
3
4
5
6
7
8
    for(int i = StringGrid1->RowCount - 1; i > StringGrid1->FixedRows; i--)
        for(int j = i - 1; j >= StringGrid1->FixedRows; j--)
        {
            if(StringGrid1->Rows[i]->CommaText == StringGrid1->Rows[j]->CommaText)
            {
                StringGrid1->DeleteRow(i); break;
            }
        }
Будут оставлены только самые первые вхождения повторявшихся строк.
2
1 / 1 / 2
Регистрация: 15.08.2017
Сообщений: 81
21.11.2017, 17:31  [ТС]
ошибка: E2247 '_fastcall TCustomGrid:eleteRow(int)' is not accessible
тут:
C++
1
StringGrid1->DeleteRow(i); break;
что я делаю не так?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33403 / 21513 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
21.11.2017, 17:34
Ну я же дал ссылку, ты кусок кода с namespace StringGrid_Delete нашел? Перед классом формы в h-файл его добавил?
0
1 / 1 / 2
Регистрация: 15.08.2017
Сообщений: 81
21.11.2017, 18:51  [ТС]
сейчас все сделаю
спасибо хороший человек

Добавлено через 36 минут
как из одного StringGrid скопировать все в другой StringGrid ??

Добавлено через 39 минут
Нашел:
C++
1
2
3
StringGrid1->Cols[0]->Assign(StringGrid2->Cols[0]);
StringGrid1->Cols[1]->Assign(StringGrid2->Cols[1]);
 StringGrid1->Cols[2]->Assign(StringGrid2->Cols[2]);
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
21.11.2017, 23:47
Цитата Сообщение от дно21 Посмотреть сообщение
как из одного StringGrid скопировать все в другой StringGrid ??
а не проще обычным циклом копировать?
C++
1
2
3
4
5
6
    StringGrid2->RowCount = StringGrid1->RowCount;
    StringGrid2->ColCount = StringGrid1->ColCount;
    for (int i = 0; i < StringGrid1->RowCount; i++)
    {
      StringGrid2->Rows[i]=StringGrid1->Rows[i];
    }
1
1 / 1 / 2
Регистрация: 15.08.2017
Сообщений: 81
23.11.2017, 02:01  [ТС]
А как по вашей функции удалить повторі строки сравнивая только по первому столбцу?
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
23.11.2017, 15:09
Цитата Сообщение от дно21 Посмотреть сообщение
А как по вашей функции удалить повторі строки сравнивая только по первому столбцу
все очень просто
в два цикла .
первый проход по столбцу.
второй сравнение текста столбца от первого цикла со вторым и если не таже строка и совпадает текст - то удаление.
0
1 / 1 / 2
Регистрация: 15.08.2017
Сообщений: 81
23.11.2017, 15:11  [ТС]
не пойму, как приспособить данный код под такое:
C++
1
2
3
4
5
6
7
8
for(int i = StringGrid1->RowCount - 1; i > StringGrid1->FixedRows; i--)
        for(int j = i - 1; j >= StringGrid1->FixedRows; j--)
        {
            if(StringGrid1->Rows[i]->CommaText == StringGrid1->Rows[j]->CommaText)
            {
                StringGrid1->DeleteRow(i); break;
            }
        }
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
23.11.2017, 15:33
Лучший ответ Сообщение было отмечено дно21 как решение

Решение

C++
1
if(StringGrid1->Cells[номер колонки в которой надо удалять][i] == StringGrid1->Cells[номер колонки в которой надо удалять])[j]

да еще надо добавить одно условие
C++
1
if (j!=i)
0
1 / 1 / 2
Регистрация: 15.08.2017
Сообщений: 81
23.11.2017, 15:41  [ТС]
вуаля
C++
1
2
3
4
5
6
7
8
9
10
11
12
      for(int i = StringGrid1->RowCount - 1; i > StringGrid1->FixedRows; i--)
        for(int j = i - 1; j >= StringGrid1->FixedRows; j--)
        {
            if(StringGrid1->Cells[0][i] == StringGrid1->Cells[0][j] )
 
            {
            if (j!=i)
{
                StringGrid1->DeleteRow(i); break;
}
            }
        }
0
 Аватар для lifeforce
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
23.11.2017, 20:41
C++
1
2
3
4
5
6
7
8
      for(int i = StringGrid1->RowCount - 1; i > StringGrid1->FixedRows; i--)
        for(int j = i - 1; j >= StringGrid1->FixedRows; j--)
        {
            if (StringGrid1->Cells[0][i] == StringGrid1->Cells[0][j] 
          && (j!=i)
              )
          StringGrid1->DeleteRow(i); break;
        }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.11.2017, 20:41
Помогаю со студенческими работами здесь

Удаление одинаковых строк из ТЗ
Есть следующая ТЗ (для примера): 90 20 20 51 20 90 Подскажите, Как удалить строки 90-20 и 20-90?

Удаление одинаковых строк
Имеется мемо1 и мемо2, например мемо1 содержит строки: вася вася катя лена лена лена дима

Удаление одинаковых строк
Здравствуйте, имеется массив string в него записываются данные, нужно проверять этот массив на наличие одинаковых строк, если те имеются то...

Удаление одинаковых строк
Здравствуйте. У меня есть List&lt;&gt; содержащий IP адреса, полученные из xlsx документа. Мне нужно удалить одинаковые и при этом удалять сразу...

Сравнение и удаление одинаковых строк
Сравнить и удалить похожие строки. for I := 0 to Base3.Count-1 do begin if form2.sMemo5.Lines = form2.sMemo6.Lines then begin ///а...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru