powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / FindNext, обработка исключений
8 сообщений из 8, страница 1 из 1
FindNext, обработка исключений
    #34620818
_Andrew_N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
C++Builder + ADO + mdb. Нужно в обьекте ADOTable организовать поиск типа "Найти далее" с последовательным переходом по записям (фильтрация не подойдет). Для поиска записей использую FindNext c соответствующим фильтром. В принципе работает, но есть проблема. Если курсор попадает на последнюю удовлетворяющую запись, то следующий FindNext вызывает исключительную ситуацию EOleException с сообщением Eof или Bof имеет значение true. Пытаюсь ее стандартно обработать, типа
try
{
ADOTable->FindNext();
}
catch (...)
{
ShowMessage("Исключение");
}
но что-то не получается, все-равно вызывается исключение.
Подскажите пожалуйста в чем ошибка или подскажите другой вариант решения.
...
Рейтинг: 0 / 0
FindNext, обработка исключений
    #34620967
iiyama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибка во время отладки в IDE?
...
Рейтинг: 0 / 0
FindNext, обработка исключений
    #34621247
_Andrew_N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибка во время выполнения. Т.е. запускаю программу в IDE, выполняю поиск - переходит по записям, но когда становиться на последнюю удовлетворяющую запись в таблице и нажимаю Найти далее - вылетает ошибка. Может это я туплю где-то?
...
Рейтинг: 0 / 0
FindNext, обработка исключений
    #34621252
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если без отладчика?
...
Рейтинг: 0 / 0
FindNext, обработка исключений
    #34621581
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще процесс навигации по записям задуман без обработки исключений.
А справка не поможет?

FindFirst, FindNext, FindClose Example

The following example uses an edit control, a button, a string grid, and seven check boxes. The check boxes correspond to the seven possible file attributes. When the button is clicked, the path specified in the edit control is searched for files matching the checked file attributes. The names and sizes of the matching files are inserted into the string grid.

void __fastcall TForm1::Button1Click(TObject *Sender)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
{
  TSearchRec sr;
  int iAttributes = 0;
  StringGrid1->RowCount = 1;
  iAttributes |= faReadOnly * CheckBox1->Checked;
  iAttributes |= faHidden * CheckBox2->Checked;
  iAttributes |= faSysFile * CheckBox3->Checked;
  iAttributes |= faVolumeID * CheckBox4->Checked;
  iAttributes |= faDirectory * CheckBox5->Checked;
  iAttributes |= faArchive * CheckBox6->Checked;
  iAttributes |= faAnyFile * CheckBox7->Checked;
  StringGrid1->RowCount = 0;
  if (FindFirst(Edit1->Text, iAttributes, sr) == 0)

  {
    do
    {
      if ((sr.Attr & iAttributes) == sr.Attr)
      {
        StringGrid1->RowCount = StringGrid1->RowCount + 1;
        StringGrid1->Cells[1][StringGrid1->RowCount-1] = sr.Name;
        StringGrid1->Cells[2][StringGrid1->RowCount-1] = IntToStr(sr.Size);
      }
    } while (FindNext(sr) == 0);
    FindClose(sr);
  }
}
...
Рейтинг: 0 / 0
FindNext, обработка исключений
    #34623269
_Andrew_N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за советы, действительно если запускать без отладчика - исключение ловится.
Но все оказалось не так просто. Идея была такая - на последней записи обработать исключение и запустить FindFirst() и так по кругу. Но оказалось,во первых, что если в очередном шаге поменять условие фильтра и запустить FindNext, то он продолжает искать записи по старому фильтру и чтобы действительно поменять условие нужно запустить сначала FindFirst с новым фильтром. Во-вторых, метод FindFirst, если не находит запись - возвращает false и, на сколько я понял, устанавливает значение Eof в true и при повторном вызове вызывает исключение. Вобщем удалось пока решить куском кода, который и выставляю для критики.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
{
AnsiString BookMark = MaterialsForm->ADOTable1->Bookmark;
if (NameEdit->Text!="")
  {
  try
    {
    MaterialsForm->ADOTable1->Filter ="НаименованиеМатериала like *" + NameEdit->Text+ "*";
      if (!MaterialsForm->ADOTable1->FindFirst())
         {
         throw  1 ;
         }
      else
        {
        MaterialsForm->ADOTable1->Bookmark=BookMark;
        if (!MaterialsForm->ADOTable1->FindNext())
          {
          MaterialsForm->ADOTable1->FindFirst();
          }
        }
    }
  catch(...)
    {
    ShowMessage("Запись не найдена!");
    }
  }
...
Рейтинг: 0 / 0
FindNext, обработка исключений
    #34623427
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а зачем здесь try/catch ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
AnsiString BookMark = MaterialsForm->ADOTable1->Bookmark;
if (NameEdit->Text!="")
  {
      MaterialsForm->ADOTable1->Filter ="НаименованиеМатериала like *" + NameEdit->Text+ "*";
      if (!MaterialsForm->ADOTable1->FindFirst()) 
        ShowMessage("Запись не найдена!");
      else
        {
        MaterialsForm->ADOTable1->Bookmark=BookMark;
        if (!MaterialsForm->ADOTable1->FindNext())
          {
          MaterialsForm->ADOTable1->FindFirst();
          }
        }
  }
...
Рейтинг: 0 / 0
FindNext, обработка исключений
    #34632883
_Andrew_N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to egorych
Спасибо за ответ. Да, действительно, try/catch здесь не нужно. Работает и так.
Вроде бы проблема решена.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / FindNext, обработка исключений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]