Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/34: Рейтинг темы: голосов - 34, средняя оценка - 4.79
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663

Поиск по StringGrid

26.02.2015, 19:09. Показов 6861. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Друзья, добрый вечер! Подскажите - имеется StringGrid, в нем строк 200. Нужно организовать поиск по содержимому ячеек (содержание может быть одинаковым в некоторых ячейках, то есть результатом поиска будет несколько вариантов). При нахождении значения(слова) нужно, чтобы вся строка выделялась цветом и позиционировалась вверху или внизу грида. Очередность строк не нарушается, просто , чтобы её видно было, как будто скроллинг. При нажатии кнопки "далее" аналогично следующий вариант результата поиска и т.д.
Поиск одного варианта и покраска этой строки вроде получается. Но как прибить к верху или низу и как обработать много результатов - пока в думах.
Спасибо!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.02.2015, 19:09
Ответы с готовыми решениями:

Поиск перебором или бинарный поиск в StringGrid
как реализовать поиск в stringgrid (поиск перебором или бинарный поиск)? напр.задаешь в edit.text что искать и stringgrid выводит только...

Поиск в Stringgrid и вывод строк в новый Stringgrid
Привет. Наверное этот вопрос задавался уже много раз, но я не могу никак понять: 1. У меня есть Stringgrid в нем содержатся записи: фио,...

Что лучше реализовать - поиск по stringgrid или поиск по источнику его данных (txt)
здравствуйте, нужно в программу добавить функцию поиска, данные из stringgrid хранятся в txt файле и подгружаются в таблицу, посоветуйте...

16
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
26.02.2015, 22:56
У грида есть свойство TopRow. Если каждый раз после нахождения очередного совпадения выставлять номер строки, в которой оно было найдено, в этот самый TopRow - будет то, что тебе нужно. А потом продолжать искать от TopRow и ниже...
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
27.02.2015, 11:11  [ТС]
Спасибо за наводку, получилось первый результат показать в топе. Перебор результатов не получается (
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
AnsiString res;
    res = Edit1->Text;
    for ( int i = 0; i < StringGrid1 -> RowCount; i++ )
        {
            for ( int j = 0; j < StringGrid1 -> ColCount; j++ )
                {
                    if (StringGrid1 -> Cells[j][i].Pos(res))
                    {
                        StringGrid1 -> Objects[0][i] = (TObject*)0x7AA0FF;
                        StringGrid1 -> Objects[1][i] = (TObject*)0x0000FF;
                        StringGrid1 -> Invalidate();
                        StringGrid1 -> TopRow=i;
                        return;
                    }
                }
        }
подсобите пожалуйста что поменять нужно!
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
27.02.2015, 14:07
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    TStringGrid *grid = StringGrid1;
 
    bool found = false;
    for (int i = grid->TopRow + 1; i < grid->RowCount && !found; i++)
    {
        found = grid->Rows[i]->Text.Pos(Edit1->Text) > 0;
        if (found)
        {
            grid->Objects[0][i] = (TObject*)0x7AA0FF;
            grid->Objects[1][i] = (TObject*)0x0000FF;
            grid->Invalidate();
            grid->TopRow = i;
        }
    }
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
27.02.2015, 14:48  [ТС]
Огромное спасибо, работает, но проблема в том, что у меня изначально уходит вверх заполнение грида
C++
1
StringGrid1->Row = StringGrid1->RowCount - 1;
чтобы были визуально видны последние строки.
При таком варианте возможно сделать поиск?
И что нужно написать в обработчике эдита, чтобы при клике на него формировался новый поиск?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
27.02.2015, 16:12
Ну ты для себя-то реши, что тебе нужно, чтобы что-то там уходило вверх, или поиск, при котором верхняя строка должна содержать найденные данные? Чего ты все время выделываешься? Научись, наконец, задачу нормально ставить, потом уже ее решай.

Тебе помогать - только потеря времени. Все равно окажется, что все не так, и тебе надо совсем другое.
0
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
27.02.2015, 17:01  [ТС]
Да почему другое то?..Все нормально работает, просто у меня данные в грид падают, их много. Я так сделал, чтобы последние данные видно было. Чтоб грид не вниз заполнялся данными, которых не видно после заполнения видимой части грида. Я очень благодарен за помощь, но боюсь уже что то спрашивать. Смысл пинать то все время?
0
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
28.02.2015, 19:30  [ТС]
Поставил на OnClick эдита
C++
1
2
3
4
5
void __fastcall TForm1::Edit2Change(TObject *Sender)
{
    TStringGrid *grid = StringGrid1;
    grid->TopRow=0;
}
Все заработало. Спасибо большое.
0
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
09.03.2015, 19:55  [ТС]
Добрый вечер. Еще вопрос - возможно организовать поиск по определенным столбцам по 2 условиям? Например, если в третьем столбце есть слово "slovo", а в седьмом столбце есть число "43" (в одной строке естественно), тогда находило. Спасибо!

Добавлено через 1 час 23 минуты
Так переделал, чтобы только по нулевому столбцу искать
C++
1
2
3
4
5
6
7
8
9
10
11
12
TStringGrid *grid = StringGrid11;
        bool found = false;
        for (int i = grid->TopRow + 1; i < grid->RowCount && !found; i++)
    {
        found = grid->Cells[0][i].Pos(Edit2->Text) > 0;
        if (found)
        {
            grid->Objects[0][i] = (TObject*)0x008CFF;
            grid->Objects[1][i] = (TObject*)0x0000FF;
            grid->Invalidate();
            grid->TopRow = i;
        }
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
09.03.2015, 20:54
Цитата Сообщение от Sergey_03 Посмотреть сообщение
возможно организовать поиск по определенным столбцам по 2 условиям?
Смотришь на ячейку одного столбца, проверяешь по первому устовию. Смотришь на ячейку другого столбца, проверяешь по второму условию. Обе проверки успешные - следовательно, нашлось.
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
10.03.2015, 12:23  [ТС]
Да, спасибо! Уже догнал.

Добавлено через 15 часов 25 минут
Друзья, а вот такой вопрос. Поиск не строгий так можно сделать, а как сделать строгий поиск, но только по числам? То есть забиваю в первый эдит число 5 на наличие во втором столбце, во второй эдит число 12 на наличие в четвертом столбце и он это ищет. Но если например во втором столбце число 56 и(или) в четвертом столбце число 2 - чтобы это не находил. Просто там в этих ячейках кроме чисел есть еще тексты небольшие. Спасибо!
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
10.03.2015, 14:47
Цитата Сообщение от Sergey_03 Посмотреть сообщение
забиваю в первый эдит число 5 на наличие во втором столбце
Цитата Сообщение от Sergey_03 Посмотреть сообщение
Но если например во втором столбце число 56
5 - это цифра, являющаяся частью числа 56. Нельзя найти 56 и не найти 5. Разве только брать содержимое 2-ой колонки, вычленять из него все числа, и проверять, есть ли среди этих чисел точное совпадение с образцом в Edit1, и аналогично с четвертой колонкой и Edit2:

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
#include <System.RegularExpressions.hpp> // Тестировалось на XE2
 
bool Present(String s, String value)
{
    TMatchCollection matches = TRegEx::Matches(s, "\\d+");
    for (int i = 0; i < matches.Count; i++)
    {
        if (value == matches[i].Value)
            return true;
    }
    return false;
}
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TStringGrid *grid = StringGrid1;
    bool found = false;
    for (int i = grid->TopRow + 1; i < grid->RowCount && !found; i++)
    {
        found = Present(grid->Rows[i]->Strings[2], Edit1->Text) &&
                Present(grid->Rows[i]->Strings[4], Edit2->Text);
        if (found)
        {
            // делаешь то, что нужно, в строке i оба критерия выполняются
        }
    }
}
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
10.03.2015, 16:08  [ТС]
В силу некоторых особенностей заполнения грида, я взял комбобоксы, активировал в FormCreate по примеру
C++
1
2
3
4
5
6
7
8
for (int i = 1; i <= 99; i++)
        {   String b3 ="";
            if(i>0&&i<10)
            {b3 += "  ";b3 += i;}
            if(i>9&&i<100)
            {b3 += " ";b3 += i;}
            ComboBox3->Items->Add(b3);
        }
потом по клику
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
    TStringGrid *grid = StringGrid11;
    AnsiString pattern;
    bool found3 = false;
    bool found4 = false;
    bool found5 = false;
    for (int i = grid->TopRow + 1; i < grid->RowCount && !found5; i++)
    {
        found3 = grid->Cells[2][i].Pos(ComboBox3->Text) > 0;
        if (found3)
        {
            found4 = grid->Cells[4][i].Pos(ComboBox4->Text) > 0;
            if (found4)
            {
                 if(ComboBox5->Enabled==true && ComboBox6->Enabled==false)
                    {
                        found5 = grid->Cells[6][i].Pos(ComboBox5->Text) > 0;
                        if (found5)
                        {
                            grid->Objects[0][i] = (TObject*)0x008CFF;
                            grid->Objects[1][i] = (TObject*)0x0000FF;
                            grid->Invalidate();
                            grid->TopRow = i;
                        }
                    }
                  if(ComboBox5->Enabled==false && ComboBox6->Enabled==true)
                    {
                        found5 = grid->Cells[3][i].Pos(ComboBox6->Text) > 0;
                        if (found5)
                        {
                            grid->Objects[0][i] = (TObject*)0x008CFF;
                            grid->Objects[1][i] = (TObject*)0x0000FF;
                            grid->Invalidate();
                            grid->TopRow = i;
                        }
                    }
            }
        }
Все работает, но Ваш метот был бы более оптималеный и правильный, если бы у меня работал
System.RegularExpressions.hpp(не находит при компеляции)
По крайней мере понял, как сделать, что бы found не плодить теперь.
Огромное спасибо!
0
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
18.03.2015, 20:00  [ТС]
Друзья, а как сделать так, чтобы и в нулевой строке искало?
0
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
06.04.2015, 20:37  [ТС]
Возвращаясь к последнему посту, не подскажите такой вопрос - при варианте
C++
1
for (int i = grid->TopRow + 1; i < grid->RowCount && !found; i++)
везде ищет кроме первой строки, при варианте
C++
1
for (int i = grid->TopRow; i < grid->RowCount && !found; i++)
находит только первую строку, дальше не ищет. В чем может быть ошибка, подскажите?
0
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
08.04.2015, 19:59  [ТС]
вообще не понятно, почему не работает..помогите!! Всю голову сломал
Tак ищет везде, но нулевая строка не участвует в поиске. Но мне необходимо, чтобы и она тоже участвовала:
C++
1
2
3
4
5
6
7
8
9
10
11
12
TStringGrid *grid = Form26->StringGrid1;
    bool found = false;
    for ( int i  = grid->TopRow + 1; i < grid->RowCount && !found; i++)
    {
        found = grid->Rows[i]->Text.Pos(Form26->Edit4->Text) > 0;
        if (found)
        {
            grid->Objects[0][i] = (TObject*)clBlue;
            grid->Invalidate();
            grid->TopRow  = i;
        }
    }
Так находит только нулевую строку, дальше не ищет:
C++
1
2
3
4
5
6
7
8
9
10
11
12
TStringGrid *grid = Form26->StringGrid1;
    bool found = false;
    for ( int i  = grid->TopRow ; i < grid->RowCount && !found; i++)
    {
        found = grid->Rows[i]->Text.Pos(Form26->Edit4->Text) > 0;
        if (found)
        {
            grid->Objects[0][i] = (TObject*)clBlue;
            grid->Invalidate();
            grid->TopRow  = i;
        }
    }
Вопрос от нуба, но чего то не разобраться..

Добавлено через 3 часа 31 минуту
В общем ничего более умного не придумал, чем написать так:
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
TStringGrid *grid = Form26->StringGrid1;
    bool found = false;
    if ((grid->Objects[0][0] == (TObject*)clBlue)||
        (grid->Rows[0]->Text.Pos(Form26->Edit4->Text) == 0))
        {
            for ( int i = grid->TopRow + 1; i < grid->RowCount && !found; i++)
                {
                    found = grid->Rows[i]->Text.Pos(Form26->Edit4->Text) > 0;
                    if (found)
                        {
                            grid->Objects[0][i] = (TObject*)clBlue;
                            grid->Invalidate();
                            grid->TopRow  = i ;
                        }
                }
        }
        else
        {
            found = grid->Rows[0]->Text.Pos(Form26->Edit4->Text) > 0;
            if (found)
                {
                    grid->Objects[0][0] = (TObject*)clBlue;
                    grid->Invalidate();
                    grid->TopRow  = 0 ;
                }
        }
Вроде пашет.
0
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
14.04.2015, 22:21  [ТС]
Вечер добрый. А реально сделать обратный поиск? То есть возвращать в топ предпоследнюю найденную строку. Например по признаку (TObject*)clBlue

Добавлено через 1 час 39 минут
вот так работает
C++
1
2
3
4
5
6
7
8
9
10
11
bool found = false;
    for (int i = grid->TopRow - 1; i >= 0 && !found; i--)
        {
            found =((grid->Objects[0][i] == (TObject*)clBlue) > 0);
            if (found)
                {
                    //grid->Objects[0][i] = (TObject*)clBlue;
                    //grid->Invalidate();
                    grid->TopRow = i;
                }
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.04.2015, 22:21
Помогаю со студенческими работами здесь

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

Поиск в StringGrid
Добрый день! Подскажите, пожалуйста, как сделать поиск данных в StringGrid через Edit

Поиск в StringGrid-де
Здравствуйте, тут такая проблемка, мне нужно найти в гриде определенные записи и подсчитать их, так вот. Все это работает, только...

поиск по stringgrid
всем привет! подскажите, как сделать поиск по таблице stringgrid. надо чтобы при нажатии на кнопку поиск открылась новая форма со всеми...

Поиск в stringgrid
Есть заполненный стрингрид с событием StringGrid1SelectCell, нужно сделать поиск по данным стрингрида. Поиск реализую так: var ...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
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 и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru