Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

FindDialog и Table

2.0K
27 июня 2003 года
Magistr(ru)
27 / / 27.06.2003
Помогите!! Горит дипломка!

Как осуществить поиск с помощью FindDialog по Table(Paradox7) с полем Name?:!!!:
293
27 июня 2003 года
SEDEGOFF
586 / / 06.10.2002
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();

Будут вопросы - спрашивай
2.0K
07 июля 2003 года
Magistr(ru)
27 / / 27.06.2003
Цитата:
Originally posted by SEDEGOFF
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
ищет только первое значение, а нужно и последующие тоже.Можно ли сие реализовать и КАК?

293
07 июля 2003 года
SEDEGOFF
586 / / 06.10.2002
Все дело в том, что сам по себе компонент диалога поиска этот поиск не обеспечивает и надо самому додумывать как сделать поиск далее.
Ну а я бы сделал примерно так.
Есть такой метод как LocateNext - он ищет дальше от курсора.. то есть тебе необходимо отследить ситуацию как тебе искать. В первом приближении это выглядит так Создаешь два пункта меню - НАЙТИ и НАЙТИ ДАЛЕЕ в случае с НАЙТИ используешь Locate иначе LocateNext
Ну а как запонинать строку поиска и определять какое меню было выбрано я думаю ты сам додумаешся
//Используй глобальные переменные String И bool
2.0K
10 июля 2003 года
Magistr(ru)
27 / / 27.06.2003
Цитата:
Originally posted by SEDEGOFF
Все дело в том, что сам по себе компонент диалога поиска этот поиск не обеспечивает и надо самому додумывать как сделать поиск далее.
Ну а я бы сделал примерно так.
Есть такой метод как LocateNext - он ищет дальше от курсора.. то есть тебе необходимо отследить ситуацию как тебе искать. В первом приближении это выглядит так Создаешь два пункта меню - НАЙТИ и НАЙТИ ДАЛЕЕ в случае с НАЙТИ используешь Locate иначе LocateNext
Ну а как запонинать строку поиска и определять какое меню было выбрано я думаю ты сам додумаешся
//Используй глобальные переменные String И bool



Я пишу вместо Locate LocateNext ,а BCB его не распознаёт ни каким образом.

293
10 июля 2003 года
SEDEGOFF
586 / / 06.10.2002
А у тебя какой BCB
2.0K
11 июля 2003 года
Magistr(ru)
27 / / 27.06.2003
Цитата:
Originally posted by SEDEGOFF
А у тебя какой BCB




BCB5...Плохо???

293
11 июля 2003 года
SEDEGOFF
586 / / 06.10.2002
Наверное да - так как я не знаю есть ли там LoacteNext - скорее всего нет
Ставь 6 или попробуй сделать следующее
Во первых у тебя в базе должен быть уникальный ключ
делаешь следующее
когда пользователь нажимает найти то ты открываешь во втором запросе все данные которые соответствуют информации для поиска и устанавливаешь курсор на первую запись, затем берем уникальный ключ и ищем его методом Locate
Когда пользователь выбирает найти далее , то во втором запросе ты переводьшь курсор на следующую запись и если ее нет то сообщаешь что таких значений больше нет, иначе методом Locate ищешь тот уникальный ключ который соответствует этой записи и тд
Только не забываей отлавливать чтобы сначало нажималась кнопка найти. Это можно сделать проверкой - открыт ли второй набор данных или нет
2.0K
15 июля 2003 года
Magistr(ru)
27 / / 27.06.2003
Цитата:
Originally posted by SEDEGOFF
Наверное да - так как я не знаю есть ли там 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();
}
}
При этом задействовано две кнопки. Как зделать так, чтобы можно было использовать только одну кнопку?

293
15 июля 2003 года
SEDEGOFF
586 / / 06.10.2002
Введи булеву переменную и исходя из ее значения выполняй ту или иную функцию
если она false - то запускаем новый поиск
иначе продолжаем поиск
Изменять ее значение можно так
сначала она всегда false
после первого поиска она становиться true и остается true пока вункция поика тебе не скажет что мол нету больше искомого значения - Но это тупой вариант - я сейчас придумал лучше
Если строка поиска не равна предыдущей то запускаешь новый поиск - а если равна то продалжаешь поиск. строку поиска храниться у тебя в Edit1
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог