FindDialog и Table
Как осуществить поиск с помощью FindDialog по Table(Paradox7) с полем Name?:!!!:
Для поиска используй функцию Locate
Должно получиться что то примерно следующее
void __fastcall TForm40::FindDialog1Find(TObject *Sender)
{
TLocateOptions op;
op.Clear();
//учитывать регистр
if(FindDialog1->Options.Contains(frMachCase))
op<<loCaseInsensitive;
//искать полное совпадение или нет
if(FindDialog1->Options.Contains(frWholeWord))
op<<loPartialKey;
if(!Table1->Locate("NAME",FindDialog->FindText,op))
ShowMessage("Введенная выми строка не найдена");
}
//соответственно диалог вызывается
FindDialog1->Execute();
Будут вопросы - спрашивай
FindDialog возвращает тебе строку поиска и выбранные условия
Для поиска используй функцию Locate
Должно получиться что то примерно следующее
void __fastcall TForm40::FindDialog1Find(TObject *Sender)
{
TLocateOptions op;
op.Clear();
//учитывать регистр
if(FindDialog1->Options.Contains(frMachCase))
op<<loCaseInsensitive;
//искать полное совпадение или нет
if(FindDialog1->Options.Contains(frWholeWord))
op<<loPartialKey;
if(!Table1->Locate("NAME",FindDialog->FindText,op))
ShowMessage("Введенная выми строка не найдена");
}
//соответственно диалог вызывается
FindDialog1->Execute();
Будут вопросы - спрашивай
Привет SEDEGOFF.
Спасибо за помощь, но дело в том что FindDialog
ищет только первое значение, а нужно и последующие тоже.Можно ли сие реализовать и КАК?
Ну а я бы сделал примерно так.
Есть такой метод как LocateNext - он ищет дальше от курсора.. то есть тебе необходимо отследить ситуацию как тебе искать. В первом приближении это выглядит так Создаешь два пункта меню - НАЙТИ и НАЙТИ ДАЛЕЕ в случае с НАЙТИ используешь Locate иначе LocateNext
Ну а как запонинать строку поиска и определять какое меню было выбрано я думаю ты сам додумаешся
//Используй глобальные переменные String И bool
Все дело в том, что сам по себе компонент диалога поиска этот поиск не обеспечивает и надо самому додумывать как сделать поиск далее.
Ну а я бы сделал примерно так.
Есть такой метод как LocateNext - он ищет дальше от курсора.. то есть тебе необходимо отследить ситуацию как тебе искать. В первом приближении это выглядит так Создаешь два пункта меню - НАЙТИ и НАЙТИ ДАЛЕЕ в случае с НАЙТИ используешь Locate иначе LocateNext
Ну а как запонинать строку поиска и определять какое меню было выбрано я думаю ты сам додумаешся
//Используй глобальные переменные String И bool
Я пишу вместо Locate LocateNext ,а BCB его не распознаёт ни каким образом.
А у тебя какой BCB
BCB5...Плохо???
Ставь 6 или попробуй сделать следующее
Во первых у тебя в базе должен быть уникальный ключ
делаешь следующее
когда пользователь нажимает найти то ты открываешь во втором запросе все данные которые соответствуют информации для поиска и устанавливаешь курсор на первую запись, затем берем уникальный ключ и ищем его методом Locate
Когда пользователь выбирает найти далее , то во втором запросе ты переводьшь курсор на следующую запись и если ее нет то сообщаешь что таких значений больше нет, иначе методом Locate ищешь тот уникальный ключ который соответствует этой записи и тд
Только не забываей отлавливать чтобы сначало нажималась кнопка найти. Это можно сделать проверкой - открыт ли второй набор данных или нет
Наверное да - так как я не знаю есть ли там LoacteNext - скорее всего нет
Ставь 6 или попробуй сделать следующее
Во первых у тебя в базе должен быть уникальный ключ
делаешь следующее
когда пользователь нажимает найти то ты открываешь во втором запросе все данные которые соответствуют информации для поиска и устанавливаешь курсор на первую запись, затем берем уникальный ключ и ищем его методом Locate
Когда пользователь выбирает найти далее , то во втором запросе ты переводьшь курсор на следующую запись и если ее нет то сообщаешь что таких значений больше нет, иначе методом Locate ищешь тот уникальный ключ который соответствует этой записи и тд
Только не забываей отлавливать чтобы сначало нажималась кнопка найти. Это можно сделать проверкой - открыт ли второй набор данных или нет
Я узнал что в BCB5 LocateNext есть только в IBQuery, но это не подходит.
Я решил свою проблему на 50%:
Этот код при нажатии на Button2 ищет(от курсора вниз) первое подходящее значение в Table1Name. При Button3: Table1->Next() и дальше тоже самое.
void __fastcall TForm1::Button2Click(TObject *Sender)
{
//чтобы не мельтешило
Table1->DisableControls();
//запоминаем текущую запись
TBookmark Bookmark = Table1->GetBookmark();
try
{
//проверяем , что искомый код модифицирован
//и допустим, что Modified - признак модификации
if (Table1->Modified)
Table1->First();
while(!Table1->Eof)
{
if(Table1Name->AsString==Edit1->Text)
{
Table1Name->FocusControl();
return;
}
Table1->Next();
}
ShowMessage("Указанное слово больше не найдено");
//Вернем как было
Table1->GotoBookmark(Bookmark);
}
__finally
{
Table1->FreeBookmark(Bookmark);
Table1->EnableControls();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Table1->Next();
Table1->DisableControls();
//запоминаем текущую запись
TBookmark Bookmark = Table1->GetBookmark();
try
{
//проверяем , что искомый код модифицирован
//и допустим, что Modified - признак модификации
if (Table1->Modified)
Table1->First();
while(!Table1->Eof)
{
if(Table1Name->AsString==Edit1->Text)
{
Table1Name->FocusControl();
return;
}
Table1->Next();
}
ShowMessage("Указанное слово больше не найдено");
//Вернем как было
Table1->GotoBookmark(Bookmark);
Table1->First();
}
__finally
{
Table1->FreeBookmark(Bookmark);
Table1->EnableControls();
}
}
При этом задействовано две кнопки. Как зделать так, чтобы можно было использовать только одну кнопку?
если она false - то запускаем новый поиск
иначе продолжаем поиск
Изменять ее значение можно так
сначала она всегда false
после первого поиска она становиться true и остается true пока вункция поика тебе не скажет что мол нету больше искомого значения - Но это тупой вариант - я сейчас придумал лучше
Если строка поиска не равна предыдущей то запускаешь новый поиск - а если равна то продалжаешь поиск. строку поиска храниться у тебя в Edit1