![]() |
|
![]() ![]() ![]() |
|
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Есть большая таблица (несколько тысяч строк на 6 столбцов). Нужно осуществлять поиск по значению в выбранном столбце. Хотелось бы ещё, чтобы поиск был индексный (или как он там называется), т.е. как в стандартном Help'e - по мере ввода строки поиска отсеиваются все неподходщие значения.
Так вот у меня вопрос. Всё это можно сделать и вручную, проверяя значение из каждой строки. Но лень. Нет ли стандартного класса или компонента типа списка, в котором бы была функция поиска? И/или сортировки, что тоже пригодится. Хотел, конечно, использовать StringGrid чтоб таблицу легче было отображать, но там поиск точно вручную придётся делать. ![]() -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
Ctrl_Alt_Del |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 11.3.2006 Где: Ставрополь Репутация: 2 Всего: 2 |
ksili, создай базу данных. В ней таблицу проиндексируешь, загонишь данные, а дальше поиск и все остальное делается элементарно.
Тем более существуют TDBGrid, TDBEdit... ИМХО оптимальный вариант |
|||
|
||||
docwar |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
А как быть, если до бд мне еще далеко, а поиск данных в StringGrid сделать надо?
Пробовал по-простому: организовывал цикл проверки for, где проверяется текст из эдита с данными первой колонки. Если же совпадений по таблице много, то занесенные действия при успешном поиске программа просто не выполняла. Есть-ли стандартные алгоритмы поиска? |
|||
|
||||
SenkraD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 3.2.2006 Где: Украина::Киев Репутация: 9 Всего: 23 |
Ну в библиотеке STL есть, только я ими ещё не пользовался так, что более подробно помочь не могу
А так не пробовал:
|
|||
|
||||
docwar |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
Спасибо за ответ!
Минус такого алгоритма - не выполняет никаких действий, если нашел несколько совпадений!!! Причем, i=0 при успешном поиске... странно... |
|||
|
||||
docwar |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
Код для поиска написал! =) Осталось только выделить строку StringGrid или ячейку (все равно у меня выделяется целая строка при нажатии на ячейку этой строки)!
Искал на форуме, но ничего не нашел... Заранее спасибо! Добавлено @ 17:06 Нужно выделить строку, зная номер строки и столбца таблицы. |
|||
|
||||
Reptile |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 30.9.2006 Где: Украина, Первомай ск Репутация: 2 Всего: 3 |
Ну Ты ведь знаеш номер строки
![]()
Или я что-то не так понял? |
|||
|
||||
docwar |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
Именно это мне и нужно было! Спасибо! =) =)
|
|||
|
||||
docwar |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
Написал вот такой код для поиска в StringGrid:
Но как сделать, чтобы выделялись все строки (результат поиска в которых положителен), а не только последняя??? |
|||
|
||||
Reptile |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 30.9.2006 Где: Украина, Первомай ск Репутация: 2 Всего: 3 |
||||
|
||||
docwar |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
Можно тогда, правда, делать фон у строк как у выделенных.
только как же вызвать OnDrawCell по нажатию кнопки, если учесть, что у меня в прорисовке есть еще и другой код? |
|||
|
||||
Reptile |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 30.9.2006 Где: Украина, Первомай ск Репутация: 2 Всего: 3 |
Так и вызываеш, но лучше(наверное) всетаки сделать жирным
![]() |
|||
|
||||
docwar |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
Что придумать - не вопрос! =)
Но как быть с нажатием на кнопку? Не хватает ведь параметров... |
|||
|
||||
Reptile |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 30.9.2006 Где: Украина, Первомай ск Репутация: 2 Всего: 3 |
||||
|
||||
docwar |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
А как цвет текста одной строки поменять?
Так только всей таблицы: Form1->StringGrid1->Font->Color=StringToColor(0x00D0B2AD); ![]() |
|||
|
||||
Reptile |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 30.9.2006 Где: Украина, Первомай ск Репутация: 2 Всего: 3 |
Оказывается - напрямую никак ![]() Можно хитро ![]() Когда находиш нужную ячейку становишся на нее сохраняеш какую нибудь глобальную переменную и перерисовываеш StringGrid
В OnDrawCell пишеш
P.S. Переписывал из Delphi так что могут быть ошибки, но ход мысли, я думаю, ясен. |
||||
|
|||||
docwar |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
Опять же как передать данные строки? Такой код красит всю таблицу кроме первого столбца первой строки! =)
|
|||
|
||||
Reptile |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 30.9.2006 Где: Украина, Первомай ск Репутация: 2 Всего: 3 |
Не правильно поставил условие в Delphi
|
||||
|
|||||
docwar |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
А что значит "in State" в строке "gdFocused in State"?
|
|||
|
||||
Reptile |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 30.9.2006 Где: Украина, Первомай ск Репутация: 2 Всего: 3 |
||||
|
||||
docwar |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
||||
|
||||
docwar |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
Я пишу вот так:
Но выделяется таблица неправильно... =( :'( |
|||
|
||||
Vyacheslav |
|
||||||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
![]() Переводим на русский язык
А Вам нужно, по всей видимости, убедится находится ли в фокусе конкретная ячейка. Что же делать? Ответ простой смотреть хелп Научить, как правильно это делать? открываем TCustomDrawGrid::OnDrawCell
Нас интересует TGridDrawState. Щелкаем по нему(он выделен зеленым цветом) Получаем
Если мы обладаем достаточным любопытством, нас конечно за интересует, что такое тип Set(тоже выделен зеленым цветом). Щелкаем по нему, смотрим список методов и , о чудо, видим метод
После этого нам сразу становится понятно ![]()
по билеровски будет выглядет так
Вот так примерно обычно пользуются хелпом -------------------- С уважением, Вячеслав Ермолаев |
||||||||||||||
|
|||||||||||||||
docwar |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
Большое спасибо, но тем не менее вопрос не решен... выделяется только последняя строка...
|
|||
|
||||
pandrew |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 213 Регистрация: 27.3.2006 Репутация: 3 Всего: 3 |
Попробуй при отрисовке выделять не прямоугольником, а меняя цвет кисти:
У меня, по крайней мере, все отлично выделяется. |
|||
|
||||
docwar |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
Вообщем, написал вот такой код:
[CODE]void __fastcall TForm6::FillRow(int RowNum) { TRect Rec; for(i=0; i<=Form1->StringGrid1->ColCount; i++) { Rec=Form1->StringGrid1->CellRect(i,RowNum); Form1->StringGrid1->Canvas->Brush->Color=StringToColor(0x00C56A31); Form1->StringGrid1->Canvas->FillRect(Rec); } }[CODE] Вот только как показать текст?! =) |
|||
|
||||
Reptile |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 30.9.2006 Где: Украина, Первомай ск Репутация: 2 Всего: 3 |
Пробовал? |
|||
|
||||
docwar |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
Пробовал, но проблема в том, что написал свою собственную функцию, а при записи
возникают ошибки при обращении к функции : FillRow(p); , где p - номер строки... |
|||
|
||||
Reptile |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 30.9.2006 Где: Украина, Первомай ск Репутация: 2 Всего: 3 |
Какие ошибки?
|
|||
|
||||
docwar |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
[C++ Error] Unit6.cpp(30): E2193 Too few parameters in call to '_fastcall TForm6::FillRow(int,int,int,TRect &)'
Это на строчке FillRow(p); |
|||
|
||||
Reptile |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 30.9.2006 Где: Украина, Первомай ск Репутация: 2 Всего: 3 |
Покажи как вызываеш.
|
|||
|
||||
docwar |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
|
|||
|
||||
Reptile |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 30.9.2006 Где: Украина, Первомай ск Репутация: 2 Всего: 3 |
Что-то я не понял Ты используеш
или
Если вызывать:
То первый вариант выдаст ошибку (Кстати как у Тебя) т.к. не хватает параметров. |
||||||
|
|||||||
docwar |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
Спасибо, но вопрос уже не актуален. =) Выбрал другой метод осуществления поиска.
|
|||
|
||||
Vyacheslav |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
![]() ![]() ![]() docwar, Вы уж извините, но еще пара таких финтов и здесь перестанут серьезно относится к Вашим вопросам. Модератор: тему я закрываю. Тем более, что это не по теме. Первончально речь шла о поиске в таблице, а не в гриде. Если есть желание все таки выяснить вопрос о поиске в гриде, заведите другой топик -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++ Builder" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |