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

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

21.11.2017, 16:47. Показов 1854. Ответов 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
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 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
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 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
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
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 считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru