Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Поиск в таблице, стандартные средства 
:(
    Опции темы
ksili
Дата 11.4.2006, 08:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Есть большая таблица (несколько тысяч строк на 6 столбцов). Нужно осуществлять поиск по значению в выбранном столбце. Хотелось бы ещё, чтобы поиск был индексный (или как он там называется), т.е. как в стандартном Help'e - по мере ввода строки поиска отсеиваются все неподходщие значения.

Так вот у меня вопрос. Всё это можно сделать и вручную, проверяя значение из каждой строки. Но лень. Нет ли стандартного класса или компонента типа списка, в котором бы была функция поиска? И/или сортировки, что тоже пригодится.

Хотел, конечно, использовать StringGrid чтоб таблицу легче было отображать, но там поиск точно вручную придётся делать. smile


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Ctrl_Alt_Del
Дата 11.4.2006, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 11.3.2006
Где: Ставрополь

Репутация: 2
Всего: 2



ksili, создай базу данных. В ней таблицу проиндексируешь, загонишь данные, а дальше поиск и все остальное делается элементарно.
Тем более существуют TDBGrid, TDBEdit...
ИМХО оптимальный вариант
PM MAIL ICQ   Вверх
docwar
Дата 19.11.2006, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



А как быть, если до бд мне еще далеко, а поиск данных в StringGrid сделать надо?
Пробовал по-простому: организовывал цикл проверки for, где проверяется текст из эдита с данными первой колонки. Если же совпадений по таблице много, то занесенные действия при успешном поиске программа просто не выполняла.
Есть-ли стандартные алгоритмы поиска?
PM MAIL   Вверх
SenkraD
Дата 19.11.2006, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 9
Всего: 23



Ну в библиотеке STL есть, только я ими ещё не пользовался так, что более подробно помочь не могу

А так не пробовал:  
Код

TStringList *RowsID = new TStringList();
String FindText = Edit1->Text;
int IndexCol = 0;//Или какой тебе надо - определи как-то
for(int i = 1; i < StringGrid1->RowCount - 1; i ++)//Первая строка я полагаю зафиксина
   if(FindText == StringGrid1->Cells[IndexCol][i])
      RowsID->Add(IntToStr(i));//явная конвертация для пущей уверености

if(RowsID->Count > 0)
   for(int i = 0; i < RowID->Count; i ++)
   {
      //Тут делаеш нужный действия на строкой  из StringGrid'a номер,
      //которой записан в списке по номером i
   }



--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
docwar
Дата 19.11.2006, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Спасибо за ответ!
Минус такого алгоритма - не выполняет никаких действий, если нашел несколько совпадений!!!
Причем, i=0 при успешном поиске... странно...
PM MAIL   Вверх
docwar
Дата 19.11.2006, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Код для поиска написал! =) Осталось только выделить строку StringGrid или ячейку (все равно у меня выделяется целая строка при нажатии на ячейку этой строки)!
Искал на форуме, но ничего не нашел...
Заранее спасибо!

Добавлено @ 17:06 
Нужно выделить строку, зная номер строки и столбца таблицы.
PM MAIL   Вверх
Reptile
Дата 20.11.2006, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 30.9.2006
Где: Украина, Первомай ск

Репутация: 2
Всего: 3



Ну Ты ведь знаеш номер строки smile  Пиши
Код

StringGrid1->Row = n;//n - номер строки

Или я что-то не так понял?
PM MAIL   Вверх
docwar
Дата 20.11.2006, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Именно это мне и нужно было! Спасибо! =)  =)
PM MAIL   Вверх
docwar
Дата 20.11.2006, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Написал вот такой код для поиска в StringGrid:
Код

AnsiString poisk;

Poisk = Edit1 -> Text;
for ( int i = 0; i < Form1->StringGrid1 -> RowCount; i++ )
{
for ( int j = 0; j < Form1->StringGrid1 -> ColCount; j++ )
{
if ( Form1->StringGrid1 -> Cells[j][i] == poisk )
Form1->StringGrid1->Row = i;
}
}

Но как сделать, чтобы выделялись все строки (результат поиска в которых положителен), а не только последняя???
PM MAIL   Вверх
Reptile
Дата 20.11.2006, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 30.9.2006
Где: Украина, Первомай ск

Репутация: 2
Всего: 3



Цитата(docwar @  20.11.2006,  14:28 Найти цитируемый пост)
Но как сделать, чтобы выделялись все строки (результат поиска в которых положителен), а не только последняя???

Никак  smile
Как вариант можно делать найденые слова жирным, можно попробовать отсеять не нужные строки(т.е. удалить их). 


PM MAIL   Вверх
docwar
Дата 20.11.2006, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Можно тогда, правда, делать фон у строк как у выделенных.
только как же вызвать OnDrawCell по нажатию кнопки, если учесть, что у меня в прорисовке есть еще и другой код?
PM MAIL   Вверх
Reptile
Дата 20.11.2006, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 30.9.2006
Где: Украина, Первомай ск

Репутация: 2
Всего: 3



Так и вызываеш, но лучше(наверное) всетаки сделать жирным smile 
PM MAIL   Вверх
docwar
Дата 20.11.2006, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Что придумать - не вопрос! =)
Но как быть с нажатием на кнопку? Не хватает ведь параметров...
PM MAIL   Вверх
Reptile
Дата 20.11.2006, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 30.9.2006
Где: Украина, Первомай ск

Репутация: 2
Всего: 3



Цитата(docwar @  20.11.2006,  17:10 Найти цитируемый пост)
Не хватает ведь параметров... 

Потому и говорю - не парься изменяй шрифт и/или цвет текста во время поиска.

PM MAIL   Вверх
docwar
Дата 20.11.2006, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



А как цвет текста одной строки поменять?
Так только всей таблицы: Form1->StringGrid1->Font->Color=StringToColor(0x00D0B2AD);
 smile 
PM MAIL   Вверх
Reptile
Дата 20.11.2006, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 30.9.2006
Где: Украина, Первомай ск

Репутация: 2
Всего: 3



Цитата(docwar @  20.11.2006,  17:39 Найти цитируемый пост)
А как цвет текста одной строки поменять?

Оказывается - напрямую никак smile 
Можно хитро smile
Когда находиш нужную ячейку становишся на нее сохраняеш какую нибудь глобальную переменную и перерисовываеш StringGrid
Цитата(docwar @  20.11.2006,  17:10 Найти цитируемый пост)
Но как быть с нажатием на кнопку? Не хватает ведь параметров... 

Код

StringGrid1->Repaint();

В OnDrawCell пишеш 
Код

//если ячейка выделена (Builder-а нет поэтому сам разберешся) и глобал-я переменная в true
{
   StringGrid1->Canvas->Brush=>Color = clBlack; 
   StringGrid1->Canvas->Font->Color = clWhite; 
}

//Теперь закрасим ячейки, но только, если ячейка не Title- Row/Column 
//Естевственно это завит от того, есть у Вас title-Row/Columns или нет. 

If (ACol > 0) and (ARow>0)  
  { 
      //Закрашиваем бэкграунд 
    StringGrid1->canvas->fillRect(Rect); 

      //Закрашиваем текст (Text). Также здесь можно добавить выравнивание и т.д.. 
    StringGrid1->canvas->TextOut(Rect->Left,Rect->Top,StringGrid1->Cells[ACol][ARow]); 
  }  

P.S. Переписывал из Delphi так что могут быть ошибки, но ход мысли, я думаю, ясен.

PM MAIL   Вверх
docwar
Дата 20.11.2006, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Опять же как передать данные строки? Такой код красит всю таблицу кроме первого столбца первой строки! =)
PM MAIL   Вверх
Reptile
Дата 20.11.2006, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 30.9.2006
Где: Украина, Первомай ск

Репутация: 2
Всего: 3



Цитата(docwar @  20.11.2006,  19:05 Найти цитируемый пост)
Опять же как передать данные строки? Такой код красит всю таблицу кроме первого столбца первой строки! =) 

Не правильно поставил условие в Delphi
Код

if (gdFocused in State) then begin//если ячейка в фокусе      
   StringGrid1.Canvas.Brush.Color := clBlack;  
   StringGrid1.Canvas.Font.Color := clWhite;  
end  


PM MAIL   Вверх
docwar
Дата 20.11.2006, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



А что значит "in State" в строке "gdFocused in State"?
PM MAIL   Вверх
Reptile
Дата 21.11.2006, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 30.9.2006
Где: Украина, Первомай ск

Репутация: 2
Всего: 3



Цитата(docwar @  20.11.2006,  20:44 Найти цитируемый пост)
А что значит "in State" в строке "gdFocused in State"?

Еще раз повторю это в Delphi в Builder-е наверное(не проверял)
Код

if (gdFocused)
{
}

Или что-то похожее.
PM MAIL   Вверх
docwar
Дата 21.11.2006, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Цитата(Reptile @  21.11.2006,  10:07 Найти цитируемый пост)
Еще раз повторю это в Delphi в Builder-е наверное(не проверял)

Знаю, что Дельфи! Просто хотел разобраться.
PM MAIL   Вверх
docwar
Дата 22.11.2006, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Я пишу вот так:
Код

if(StringGrid1->Focused())
{
StringGrid1->Canvas->Brush->Color = clBlack;
StringGrid1->Canvas->Font->Color = clWhite;

if((ACol == j) || (ARow == i))
{
StringGrid1->Canvas->FillRect(Rect);
StringGrid1->Canvas->TextOut(Rect.Left,Rect.Top,StringGrid1->Cells[ACol][ARow]);
}
}
}

Но выделяется таблица неправильно... =(  :'(
PM MAIL   Вверх
Vyacheslav
Дата 22.11.2006, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Код

if(StringGrid1->Focused())


smile  
Переводим на русский язык
Цитата

Если StringGrid1 в фокусе, то

А Вам нужно, по всей видимости, убедится находится ли в фокусе конкретная ячейка.
Что же делать? 
Ответ простой смотреть хелп
Научить, как правильно это делать?
открываем TCustomDrawGrid::OnDrawCell
Цитата

typedef void __fastcall (__closure *TDrawCellEvent)(System::TObject* Sender, long ACol, long ARow, TRect Rect, TGridDrawState
 State);
__property TDrawCellEvent OnDrawCell = {read=FOnDrawCell, write=FOnDrawCell};



Нас интересует TGridDrawState. Щелкаем по нему(он выделен зеленым цветом)
Получаем 
Цитата

enum Grids__3 { gdSelected, gdFocused, gdFixed };

typedef Set<Grids_3, gdSelected, gdFixed> TGridDrawState;


Если мы обладаем достаточным любопытством, нас конечно за интересует, что такое тип Set(тоже выделен зеленым цветом). Щелкаем по нему, смотрим список методов и , о чудо, видим метод
Цитата

bool __fastcall Contains(const T el) const;

После этого нам сразу становится понятно smile , что дельфийский код 
Код

if (gdFocused in State)

по билеровски будет выглядет так
Код

if (State.Contains(gdFocused) )


Вот так примерно обычно пользуются хелпом


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
docwar
Дата 23.11.2006, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Большое спасибо, но тем не менее вопрос не решен... выделяется только последняя строка...
PM MAIL   Вверх
pandrew
Дата 24.11.2006, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 27.3.2006

Репутация: 3
Всего: 3



Попробуй при отрисовке выделять не прямоугольником, а меняя цвет кисти:
Код

canvas->Brush->Color=...
 
У меня, по крайней мере, все отлично выделяется.
PM MAIL   Вверх
docwar
Дата 24.11.2006, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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]
Вот только как показать текст?! =)
PM MAIL   Вверх
Reptile
Дата 25.11.2006, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 30.9.2006
Где: Украина, Первомай ск

Репутация: 2
Всего: 3



Код

StringGrid1->Сanvas->TextOut(Rect->Left,Rect->Top,StringGrid1->Cells[ACol][ARow]); 

Пробовал?
PM MAIL   Вверх
docwar
Дата 25.11.2006, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Пробовал, но проблема в том, что написал свою собственную функцию, а при записи 
Код
void __fastcall TForm6::FillRow(int RowNum, TRect &Rect, int ACol,
      int ARow)

возникают ошибки при обращении к функции : FillRow(p); , где p - номер строки...
PM MAIL   Вверх
Reptile
Дата 25.11.2006, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 30.9.2006
Где: Украина, Первомай ск

Репутация: 2
Всего: 3



Какие ошибки?
PM MAIL   Вверх
docwar
Дата 25.11.2006, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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);
PM MAIL   Вверх
Reptile
Дата 25.11.2006, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 30.9.2006
Где: Украина, Первомай ск

Репутация: 2
Всего: 3



Покажи как вызываеш.
PM MAIL   Вверх
docwar
Дата 25.11.2006, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Цитата
FillRow(p); , где p - номер строки

PM MAIL   Вверх
Reptile
Дата 27.11.2006, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 30.9.2006
Где: Украина, Первомай ск

Репутация: 2
Всего: 3



Что-то я не понял Ты используеш

Код

void __fastcall TForm6::FillRow(int RowNum, TRect &Rect, int ACol,
      int ARow)

 или

Код

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);
   }
}

Если вызывать:
Код

FillRow(p);

То первый вариант выдаст ошибку (Кстати как у Тебя) т.к. не хватает параметров.
PM MAIL   Вверх
docwar
Дата 27.11.2006, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Спасибо, но вопрос уже не актуален. =) Выбрал другой метод осуществления поиска.
PM MAIL   Вверх
Vyacheslav
Дата 28.11.2006, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Цитата(docwar @  27.11.2006,  20:44 Найти цитируемый пост)
Спасибо, но вопрос уже не актуален. =) Выбрал другой метод осуществления поиска. 

 smile   smile  smile 

docwar, Вы уж извините, но еще пара таких финтов и здесь перестанут серьезно относится к Вашим вопросам. 

Модератор: тему я закрываю. Тем более, что  это не по теме. Первончально речь шла о поиске в таблице, а не в гриде. Если есть желание все таки выяснить вопрос о поиске в гриде, заведите другой топик 


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Страницы: (3) [Все] 1 2 3 
Закрытая темаСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1792 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.