C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Одна кнопка вместо двух, поиск в Query
Magistr(ru)
Отправлено: 15.07.2003, 03:54


Ученик-кочегар

Группа: Участник
Сообщений: 20



Этот код при нажатии на 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();
}
}
При этом задействовано две кнопки. Как зделать так, чтобы можно было использовать только одну кнопку?
Георгий
Отправлено: 15.07.2003, 19:29


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



при использовании только одной кнопки алгоритм будет такой:
жмём на эту кнопку и входим в режим поиска
последующии нажатия находят следующую запись
как больше записей нет — переходим в состояние готовности поиска

как это делается — это будет классический конечный автомат (кстати — я удивлён почему по сих пор никто не ответил на этот простой вопрос)

CODE
обработчик нажатия нашей новой кнопки:
static int CurrentState=0;//пусть ноль будет обозначать нулевое состояние
switch (CurrentState)
case 0:
 this->Button2->Click();
 CurrentState=(Удалось найти)?(1):(0);
 break;
case 1:
 this->Button3->Click();
 CurrentState=(Удалось найти)?(1):(0);
 break;
default:
 CurrentState=0;//защита от вспышек на солнце
 break;
Ну как тебе эта идея?
Bond
Отправлено: 16.07.2003, 15:50


Станционный диспетчер

Группа: Участник
Сообщений: 142



при редактировании строки поиска — состояние поиска первого елемента, а при нажатии кнопки или нажатию клавиши ВВОД в строке поиска — состояние поиска следующего:

CODE

//------------------------------
int FindState; //текущее состояние поиска
enum {fsFirst, fsNext};
//------------------------------
//FindEdit->OnChange
      ...
  FindState = fsFirst;
      ...
//------------------------------
//FindEdit->OnPressKey
      ...
  FindHandler();
      ...
//------------------------------
//FindButton->OnClick
      ...
  FindHandler();
      ...
//------------------------------
//FindHandler
      ...
switch (FindState)
{
  case fsFindFirst:
     FindState = fsNext;

      ...   //формируем строку поиска и делаем поиск первого
  break;
  case fsFindNext:
      ...   //делаем поиск следующего
  break;
  default:
     FindState = fsNext;
}
//------------------------------


можешь при смене состояния поиска побаловаться с FindButton->Caption
Guest
Отправлено: 24.07.2003, 21:46


Не зарегистрирован







QUOTE (Георгий @ 15/07/2003, 20:31)
при использовании только одной кнопки алгоритм будет такой:
жмём на эту кнопку и входим в режим поиска
последующии нажатия находят следующую запись
как больше записей нет — переходим в состояние готовности поиска

как это делается — это будет классический конечный автомат (кстати — я удивлён почему по сих пор никто не ответил на этот простой вопрос)

CODE
обработчик нажатия нашей новой кнопки:
static int CurrentState=0;//пусть ноль будет обозначать нулевое состояние
switch (CurrentState)
case 0:
this->Button2->Click();
CurrentState=(Удалось найти)?(1):(0);
break;
case 1:
this->Button3->Click();
CurrentState=(Удалось найти)?(1):(0);
break;
default:
CurrentState=0;//защита от вспышек на солнце
break;
Ну как тебе эта идея?

что-то не получается...
Георгий
Отправлено: 24.07.2003, 23:24


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



а что именно не получается?
если речь идёт о том, что я как код написал — то нет ничего удивительного — в виде кода я только идею обрисовал и this->Button2->Click() не надо понимать буквально

Вернуться в Работа с базами данных в C++Builder