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

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
27.06.2007, 14:09
    #34623269
_Andrew_N
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FindNext, обработка исключений
Спасибо за советы, действительно если запускать без отладчика - исключение ловится.
Но все оказалось не так просто. Идея была такая - на последней записи обработать исключение и запустить 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
27.06.2007, 14:39
    #34623427
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FindNext, обработка исключений
а зачем здесь 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
02.07.2007, 16:53
    #34632883
_Andrew_N
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FindNext, обработка исключений
to egorych
Спасибо за ответ. Да, действительно, try/catch здесь не нужно. Работает и так.
Вроде бы проблема решена.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / FindNext, обработка исключений / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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