Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Базы данных > BCB6+ADO+Улучшенный поиск


Автор: Palladin 8.6.2008, 15:30
АЦЦКАЙ ПОИСК


В статье 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 



Автор: Bugmaker 6.7.2008, 19:54
У меня пример не откомпилировался в билдере пока я не написал Key вместо key.

Автор: Palladin 6.7.2008, 23:59
Исправил smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)