Назад | Начало урока | Вперед
Содержание

Вверх

Перемещение по набору записей

Функция OnDataFirst()
Функция MoveFirst()

Функция OnDataPrevious()
Функция MovePrevious()

Функция OnDataNext()
Функция MoveNext()

Функция OnDataLast()
Функция MoveLast()

Для того чтобы пользователь мог перемещать маркер по набору записей, добавим в меню четыре новых пункта, соответствующие основным действиям перемещения:переход на первую, последнюю, следующую и предыдущую записи.

Поскольку объект RecordSet и указатель на интерфейс , используемый для хранения данных, являются частью объекта документа, сообщения о событиях должны передаваться в класс документа, который обновит текущую запись в базе данных и переместит маркер на следующую выбранную запись.Однако экземпляр класса представления должен получать сообщение о событии раньше так как именно он копирует значения из из управляющих элементов формы в переменные экземпляра класса хранения данных, а это должно быть сделано до того, как будет обновлена запись в БД.

Когда завершено перемещение маркера текущей записи, представление должно обновить выведенные на экран в управляющие элементы формы значения полей записи.

Учитывая последовательность обработки сообщений, о событиях, имеет смысл установить обработчик этих событий в классе представления, а уже из него вызывать необходимые функции класса документа.

Чтобы добавить эту возможность, выполните следующее:

  1. Добавьте в меню пункты для перемещения по набору записей:First (первая запись), Previous, Next, Last. Кроме того , соответствующие кнопки следует добавить и на панель инструментов.
  2. Добавьте в класс представления функции - обработчики событий - для всех четырех пунктов меню.

Подсказка

Функция OnDataFirst
Отредактируйте функцию OnDataFirst обработки события(нажатие первого пункта меню "First Record"), включив в нее вызов метода MoveFirst класса документа.Для этого добавьте код как в 13.8

Вверх

Листинг 13.8 Функция OnDataFirst()


void CAdoDatabaseView::OnDataFirst()
{
// Обновить текущую запись (данными с экрана)
UpdateBoundData();
// Перейти к первой записи
GetDocument()->MoveFirst();
// Обновить экран данными из записи
RefreshBoundData();
}

Функция MoveFirst
Теперь в класс документа добавим функцию MoveFirst (переход на первую запись).Для этого выполните следующее:

  1. Добавьте в класс документа новый метод, тип -- void. MoveFirst -имя, public - Доступ
  2. Отредактируйте функцию как в 13.9

Вверх

Листинг 13.9 Функция MoveFirst()


void CAdoDatabaseDoc::MoveFirst(void)
{
try
{
// Обновить текущую запись (данными с экрана)
m_piAdoRecordBinding->Update(&m_rsRecSet);
// Перейти к первой записи
m_ptrRs->MoveFirst();
}
// Any errors?
catch (_com_error &e)
{
// Generate the error message
GenerateError(e.Error(), e.Description());
}
}

Анализ:

Вот так это и происходит: Сообщение о событии (например нажатие на первый пункт меню "First Record") обрабатывается функцией класса представления OnDataFirst.
В этой функции сначала происходит запись данных с экрана в текущий объект записи затем вызывается нужная функция документа.Например в данном случае функция MoveFirst(), которая сначала обновляет текущий объект записи данными которые только что были получены с экрана, затем эта функция передвигает маркер на первый объект записи (в других функциях маркер может быть пердвинут на предыдущий. последующий или последний объект записи).После этого уже снова в функции представления OnDataFirst данные, на которые указывает маркер в классе документа, обрабатываются и они выводятся на экран.

Еще раз как это происходит:допустим мы нажали пункт меню "First Record". Проиходит все то что мы только, что описали выше.Мы видим на экране все данные из объекта номер один в массиве записей.Если у нас не было ни каких записей то мы увидим чистые поля первого объекта.Теперь заполним эти чистые поля данными.И нажмем пункт меню "Next Record".Что делает программа? Программа должна обработать это событие, то есть перейти к следующей записи. Но перед тем как перейти к следующей записи, надо сохранить те данные которые мы только что ввели для первого объекта записи.

Добавьте функции, реализующие перемещение к следующей записи в классы представления и документа.

Функция OnDataNext
Отредактируйте функцию OnDataNext обработки события(нажатие третьего пункта меню "Next Record"), включив в нее вызов метода MoveNext класса документа.Для этого добавьте код как в 13.8

Вверх

Листинг 13.8 Функция OnDataNext()


void CAdoDatabaseView::OnDataNext()
{
// Обновить текущую запись (данными с экрана)
UpdateBoundData();
// Перейти к следующей записи
GetDocument()->MoveNext();
// Обновить экран данными из записи
RefreshBoundData();
}

Функция MoveNext
Теперь в класс документа добавим функцию MoveNext (переход на следующую запись).Для этого выполните следующее:

  1. Добавьте в класс документа новый метод, тип -- void. MoveNext -имя, public - Доступ
  2. Отредактируйте функцию как в 13.9

Вверх

Листинг 13.9 Функция MoveNext()


void CAdoDatabaseDoc::MoveNext(void)
{
try
{
// Update the current record
m_piAdoRecordBinding->Update(&m_rsRecSet);
// Move to the next record
m_ptrRs->MoveNext();
}
// Any errors?
catch (_com_error &e)
{
// Generate the error message
GenerateError(e.Error(), e.Description());
}
}

Далее добавьте функции, реализующие перемещение к предыдущей и последней записи в классы представления и документа.

Функция OnDataPrevious
Отредактируйте функцию OnDataNext обработки события(нажатие второго пункта меню "Previous Record"), включив в нее вызов метода MoveNext класса документа.Для этого добавьте код как в 13.8

Вверх

Листинг 13.8 Функция OnDataPrevious()


void CAdoDatabaseView::OnDataPrevious()
{
// Обновить текущую запись (данными с экрана)
UpdateBoundData();
// Перейти к предыдущей записи
GetDocument()->MovePrevious();
// Обновить экран данными из записи
RefreshBoundData();
}

Функция MovePrevious
Теперь в класс документа добавим функцию MovePrevious (переход на предыдущую запись).Для этого выполните следующее:

  1. Добавьте в класс документа новый метод, тип -- void. MovePrevious -имя, public - Доступ
  2. Отредактируйте функцию как в 13.9

Вверх

Листинг 13.9 Функция MovePrevious()


void CAdoDatabaseDoc::MovePrevious(void)
{
try
{
// Update the current record
m_piAdoRecordBinding->Update(&m_rsRecSet);
// Move to the Previous record
m_ptrRs->MovePrevious();
}
// Any errors?
catch (_com_error &e)
{
// Generate the error message
GenerateError(e.Error(), e.Description());
}
}

Функция OnDataLast
Отредактируйте функцию OnDataLast обработки события(нажатие четвертого пункта меню "Last Record"), включив в нее вызов метода MoveNext класса документа.Для этого добавьте код как в 13.8

Вверх

Листинг 13.8 Функция OnDataLast()


void CAdoDatabaseView::OnDataLast()
{
// Обновить текущую запись (данными с экрана)
UpdateBoundData();
// Перейти к последней записи
GetDocument()->MoveLast();
// Обновить экран данными из записи
RefreshBoundData();
}

Функция MoveLast
Теперь в класс документа добавим функцию MoveLast (переход на последнюю запись).Для этого выполните следующее:

  1. Добавьте в класс документа новый метод, тип -- void. MoveLast -имя, public - Доступ
  2. Отредактируйте функцию как в 13.9

Вверх

Листинг 13.9 Функция MoveLast()


void CAdoDatabaseDoc::MoveLast(void)
{
try
{
// Update the current record
m_piAdoRecordBinding->Update(&m_rsRecSet);
// Move to the Last record
m_ptrRs->MoveLast();
}
// Any errors?
catch (_com_error &e)
{
// Generate the error message
GenerateError(e.Error(), e.Description());
}
}

После добавления этих функций можно приступать к компиляции и тестированию приложения.Созданное приложение позволяет открывать таблицу Addresses базы данных, а так же просматривать и изменять каждую из записей этой таблицы.

АВ: Думаю, что сейчас самое время создать БД с именем STYVCDB (она уже создана, но пока не инициализирована). Создать в этой БД таблицу с именем Addresses, инициировать ее данными (сделать это на языке Java, как я умею делать) Таблица Addresses упоминается в функции OnNewDocument() класса документа и более нигде.



Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz