Поиск:

Ответ в темуСоздание новой темы Создание опроса
> BCB6+ADO+Улучшенный поиск 
:(
    Опции темы
Palladin
Дата 8.6.2008, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

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



АЦЦКАЙ ПОИСК


В статье BCB6+ADO был приведен поиск, который работает корректно, но как всегда есть НО, во первых тот поиск убирает все неподходящие записи, во вторых  ошибись ты хотя бы на один символ и не найдешь то что надо, а если оно будет совсем рядом ты этого не увидешь! На днях увидел поиск в программе Галактика, это что-то типа 1С, там при клике по аналогу DBGrid-a появляется аналог компонента Edit в него заносится информация из ячейки по которой кликнули, после изменения данных в Edit-e, указатель по таблице прогоняется к нужной записи, а вместе с ним и Edit, чуть выше записи! Очень удобно, к примеру ищем мы инвентарный номер в таблице в которой в поле "инвентарный номер" более 5000 записей, указатель подгоняется все ближе и ближе и вы всегда можете немного изменить искомые данные!

  Итак приступаем:
   Будем считать что Ваша БД уже сделана, вы сделали добавление и т.д. приступаем к поиску!
Кидаем на форму Edit1, уменьшаем его габариты ну скажем 75 на 17, далее устанавливем размер шрифта вводимого в Edit до 6. Прячем(Visible=false;)  Кидаем на форму DBEdit1, прячем, конектим к искомому полю.
будем считать что поле "инвентарный номер" это у вас первый столбец, тогда
на OnCellClick компонента DBGridпишем код:
Код

if(DBGrid1->SelectedIndex==0) //проверка на то, что кликнули по первому столбцу DBGrid-a, 
// значениe 1 будет второе и т.д.
{
POINT p; 
::GetCursorPos(&p);
::ScreenToClient(Handle, &p); //узнаем координаты курсора мыши
Edit1->Top=p.x; // передаем их нашему Edit-y 
Edit1->Top=p.y;
Edit1->Visible=true; //показываем Edit
Edit1->Text=DBGrid1->SelectedField->Text.Trim(); //передаем текст кликнутой ячейки в Edit
}else Edit1->Visible=false; //если кликнули ен по нужнмоу столбцу, прячем если до этого был отображен

Далее на onKeyDown Edit-a пишем код:
Код

if(Key==13)
{
if(DBGrid1->SelectedIndex==0) //опять же проверка
{
 ADOTable1->First(); //переходим на первую запись таблицы
 for(int i=1;i<=ADOTable1->RecordCount;i++) //цикл по всем записям
 {
     if(Edit1->Text.Trim()==DBEdit1->Text.Trim())  //проверяем каждую запись на равенство с //введенной в Edit, при этом на случай если вы юзаете таблицу на FoxPro, удаляем Trim-ом все //лишние пробелы
     {position=i; } //запоминаем позицию 
   ADOTable1->Next(); //переходим к след записи
   }
  ADOTable1->First(); //указатель на первую запись
  for(int i=1;i<position;i++) //цикл для подгонки указателя до нужной записи
   ADOTable1->Next();
}
}else Key=0;

Подсветим найденную, тогда в onDrawColumnCel l DBGrid-a пишем код:
Код

   if (State.Contains(gdSelected)) //проверка на селект ячейки
   {
       Edit1->Top=Rect.Top+18; // корректируем положение Edit-a по осям
       Edit1->Left=Rect.Left+15; 
       DBGrid1->Canvas->Brush->Color = clBackground; //цвет фона, в данном случае синий
       DBGrid1->Canvas->Font->Color = clBlack; // цвет текста
       DBGrid1->Canvas->FillRect(Rect); //закрашиваем фон
       DBGrid1->Canvas->TextOutA(Rect.Left, Rect.Top, Column->Field->Text); //закрашиваем текст
    }


Вот и все, код кривоват, есть пару недоработак, таких как мерцание, ну и может еще что
Надеюсь комунить пригодится, критика принимается, отладка кода тоже, заранее спс
Спасибо Rrader-y он сам того не зная помог в этом делеsmile
16.06.2008 подправил поиск, чтобы улучшить работу этого поиска с OnChange Edita обработку перекинул на OnKeyDown, при нажатии на Enter пойдет поиск smile 




Это сообщение отредактировал(а) Palladin - 6.7.2008, 23:59


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
Bugmaker
Дата 6.7.2008, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



У меня пример не откомпилировался в билдере пока я не написал Key вместо key.
PM MAIL   Вверх
Palladin
Дата 6.7.2008, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

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



Исправил smile 


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C++: Базы данных"
chipset

Данный форум предназначен для обсуждения вопросов прямым образом связанных с C++ и БД. Так, вопросы только по C++ следует задавать в C++:Общие вопросы а вопросы по абстрактным БД в Базах данных или в соответствующих под-форумах.

Благодарим за понимание.


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

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


 




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


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

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