Тогда я выложу самый "глючный" код. Тот который дома у меня работает, а на работе ошибку внешней базы выдаёт. Но и этот "глючный" вроде бы ничем не отличается от "нормальных".. Единственно, что у меня используется редактор полей, может быть он на новой машине как-то по другому запускается..
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//Закомментирована 2 строки для варианта без редактора полей
//Form1->ADOQuery1->SQL->Text = "Select OKATO, Punkt As НасПункт, Centr As ОблЦентр, RAION358 As Район, Dop69 As Доп, StatusP As ТипНасПункта from OKATOTFTAT ORDER BY Punkt";
//Form1->ADOQuery1->SQL->Text = "Select * from OKATOTFTAT ORDER BY PUNKT";
//Переключаюсь на русский
LoadKeyboardLayout("00000419",KLF_ACTIVATE);
//ADOQuery1->ConnectionString="Provider=MSDASQL.1;Persist Security Info=False;Data Source=OKATOTFTAT";
//ADOQuery1->Active=true;
//Описание флагов в заголовочном файле
qwe=false;
qwe1=false;
qwe2=false;
//вызывается, чтоб быстрый поиск быстрее реагировал на нажатие первой клавиши поиска в первый раз
TForm1::DBGrid1KeyPress(DBGrid1, 'ё');
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
//Выход
if (ADOQuery1)
ADOQuery1->Close();
Form1->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::KeySeek(const AnsiString asSearchVal)
{
//Поиск
if (qwe)//Если функцию вызвала не форма при открытии, а сам пользователь, то вывожу его символы на панель
{
pnlCaption->Caption = asSearch;
}
//Поиск и запись
TLocateOptions loSearch;
loSearch.Clear();
//Игнорировать разницу реестра
loSearch<<loCaseInsensitive;
//ключ поиска
loSearch<<loPartialKey;
ADOQuery1->First();
//Осуществляет поиск и делает запись активной (закомментирована строка для варианта без редактора полей)
//НасПункт - поле по кот-рому ищу, 2-й параметр - что ищу, 3-й - опции
//ADOQuery1->Locate("НасПункт", (Variant)asSearchVal, loSearch);
ADOQuery1->Locate("PUNKT", (Variant)asSearchVal, loSearch);
qwe1=true; //Программа ВОЗВРАЩАЕТСЯ в ловушку клавиатуры и ждёт нажатий клавиш теперь уже пользователем
}
void __fastcall TForm1::DBGrid1KeyPress(TObject *Sender, char &Key)
{
//Обработчик события OnKeyPress для TDBGrid
DWORD dwElapsedTime = 0;
//GetTickCount() - время от начала
dwElapsedTime = abs(GetTickCount() - dwLastPress);
//abs(Key) - абсолютная величина целого, это на коды всех символов кроме кирилицы - это 1-й блок
//на "красную" раскладку клавиатуры - 2-й блок, через || с первым. Ясно, что кроме кирилицы прих-ся перечислять через || другие красные символы
if((( abs(Key) >= 0x20 && abs(Key) <= 0x7E) || ( abs(Key) >= 0xC0 && abs(Key) <= 0xFF) || abs(Key) == 0x80) ||((Key>='А')
&& (Key<='я')||(Key>='а')&&(Key<='я')||(Key =='ё')||(Key =='Ё') || Key == '№' || Key == ';' || Key == ':' || Key == '?'
|| Key == '/' || Key == '"'))
//В буфере какой-то символ
{
if(dwElapsedTime > 5000)
{
//если долго не нажимать, то буфер для поиска очищается
asSearch = AnsiString(Key);
//Весь след. блок из if нагорожен, чтобы не съедался первый символ если он нажат более чем через 5 сек. после открытия
if (!qwe)//Програма уже ждёт ПЕРВОГО символа от пользователя, а не введённого "формой"
if (qwe1)//если программа зашла в эту ловушку не менее чем второй раз (в первый раз её вводила форма при инициализации)
if (!qwe2)//программа действительно зашла сюда ИМЕННО второй раз, ПО СИМВОЛУ ПОЛЬЗОВАТЕЛЯ
qwe=true;//символ уже сам пользователь нажал!
}
else
//если нажимать быстро, то символы плюсуются (кроме вызова F формой при первом открытии)
{
if (!qwe) //Нажимаю символ не подождав 5 сек после открытия программы
{
asSearch = AnsiString(Key);
qwe=true; //теперь функцию будет вызывать не форма, а сам пользователь
}
else //Если F вызвана нажатием клавиши пользователем,
{
asSearch += AnsiString(Key);
}
}//конец блока "если нажимать быстро"
//Переводит в верхний регистр
asSearch = AnsiUpperCase(asSearch);
KeySeek(asSearch);
dwLastPress = GetTickCount();
}
//В буфере (нажат) не символ
else
{
//Нажат не символ, а забой
if(abs(Key) == 0x7F || abs(Key) == 0x08)
//Если 0x7F убрать, то при забое стирает на панели сразу всё, а не посимвольно
{
if(asSearch.Length() < 2 || dwElapsedTime > 5000)//если все символы убрала забоем или долго медлю
{
asSearch = "";
KeySeek(asSearch);
}
else//если есть ещё более одного символа, чтоб их убрать забоем
{
asSearch.SetLength(asSearch.Length()-1);
KeySeek(asSearch);
dwLastPress = GetTickCount();
}
}
//Нажат не символ, и не забой
else
{
if(Key == VK_ESCAPE)
//Нажат не символ, а ESCAPE
{
asSearch = "";
KeySeek(asSearch);
}
else
//Нажат не символ, и не забой, и не ESCAPE, а всё остальное
dwLastPress = 0;
}
}
if (qwe)//Если функцию вызвала не форма при открытии, а сам пользователь
{
pnlCaption->Caption = asSearch;//Без этой строки не исчезает последний, убранный забоем, символ и таблица с ним вначале
}
}