Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Анализ текстов, созданных АррWizard для класса, производного от CRecordSet. (Функции DoFieldExchange(), GetDefaultConnect(), GetDefaultSQL() и др.).




Переопределяемые методы

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

virtual void CRecordset:: DoFieldExchange (CFieldExchange* pFX)

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

В качестве параметра функция принимает указатель на объект CFieldExchange, который авт-ески создается и передается библиотекой MFC.

Примечание  Эти функции доступны только в том случае, если для результирующего набора используется класс, производный от CRecordset. Если же применяется непосредственно класс CRecordset, то для получения данных необходимо вызывать функцию GetFieldValue.

Собственно обмен данными осуществляется с помощью механизма RFX (Record Field Exchange, Обмен полями записи), который работает в обоих направления от полей данных результирующего набора к записям источника данных и наоборот. Ниже приведен фрагмент, демонстрирующий переопределение функции DoFieIdExchange.

void CDBSet::DoFildExchange(CFieldExchange* pFX)

{ //{{AFX__FIELD__MAP(CDBSet)

   pFX->SetFieldType(CFieldExchange::outputColumn);

RFX_Text(pFX, _T("(ProductName]"), m_ProductName);

    RFX_Long (pFX,   _T (" [CategoryID] "),, m__CategoryID) ;

   RFX_Text(pFX,   _T("[QuantityPerUnit]''), m__QuantityPerUnit);

    RFX_Text(pFX,    _T("[UnitPrice]"), m_UnitPrice);
//}}AFX_FIELD_MAP }

 Примечание

Мастер CiassWizard не поддерживает обмен полями блочных записей, и необходимо переопределить соответствующую функцию вручную, реализовав в ней вызовы функций BulkRFX (блочный обмен полями записи).

virtual CString CRecordset::GetDefaultConnect ( )

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

    CString CDBSet::GetDefaultConnect()

{    return _T("ODBC;DSN=MS Access 97 Database"); }

virtual CString CRecordset::GetDefaultSQL ( )

Библиотека MFC вызывает эту функцию, чтобы получить строку, содержащую оператор SQL, на котором базируется результирующий набор. Это должно быть или имя таблицы, или непосредственно оператор SELECT. Можно также определить здесь вызов предопределенного запроса, используя оператор CALL. Ниже приведен фрагмент кода, который иллюстрирует использование этой функции.

CString CDBSet::GetDefaultSQL( )

                                                  {      return _T{"[Products]");}

Если библиотека MFC не сможет найти имя таблицы или корректно интерпрети­ровать оператор CALL, функция возвращает пустую строку.

Примечание

Между круглой скобкой и ключевым словом, например, CALL или SELECT, не должно быть пробелов.

Рассмотренные классы, безусловно, существенно облегчают работу с результирующими наборами, однако без предоставления этой информации пользователю, да еще в удобном виде, она мало что значит. К счастью, в библиотеке MFC реализовано множество классов представления (view), которые сделают эту paботу достаточно простой.

CWnd

CView

    CScrollView

             CFormView

                       CRecordView

 

 

Анализ текстов, созданных Арр Wizard для класса, производного от CRecordView. (Функции DoDataExchange(), OnInitialUpdate(), OnMove()). Связь ресурсов с ассоциированными переменными. Доступ к объекту «набор данных» (класса CRecordSet) из класса CRecordView.

Класс CRecordView

Объекты этого класса предоставляют для изображения записей базы данных в элементах управления форму, которая непосредственно соединена с объектом CRecordset. Объекты CRecordView используют механизм DDX (Dialog Data Exchange, Обмен данными с блоком диалога) и RFX (Record Field Exchange, Обмен полями записей) для автоматического перемещения данных между элементами управления формы и полями результирующего набора. Кроме того, можно воспользоваться реализованными возможностям перемещения по записям и обновления текущей записи.

Вce компоненты и методы этого класса можно условно разбить на три категории.

· Создание объекта. Имеется только конструктор для создания объекта.

· Атрибуты данных. Три функции, используемые для получения информации результирующем наборе, к которому присоединена форма.

· Операции, Единственная функция, позволяющая программисту изменить указатель на текущую запись.

Ниже приведено описание каждой из этих категорий.

Создание объекта

В эту категорию входит только конструктор, имеющий две реализации.

CRecordView::CRecordView(LPCSTR lpszTemplateName)

CRecordView::CRecordView{UINT nIDTemplate)

Создает объект класса. В качестве параметра конструктор принимает идентификатор шаблона блока диалога, задаваемый либо строкой (lpszTemplateName), либо номером (nlDTemplate), При создании класса, производного от CRecordView, в нем можно определить только один конструктор, в котором необходимо вызвать конструктор базового класса CRecordView::CRecordView с идентификатором ресурса в качестве параметра, как это показано в приведенном ниже фрагменте:

CDBView::CDBView() : CRecordView(CDBView::IDD)

{    // {{AFX__DATA_ INIT (CDBView) 

m_pSet = NULL;

m_strPrice =_ T("");

// }} AFX_DATA_INIT

m_bAdd = FALSE;

m_nSort = ID_SORT_TITLE; }

Атрибуты данных

Функции этой категории позволяют получить информацию о представлении записи

virtual CRecordset* CRecordView::OnGetRecordset ( )

Возвращает указатель на объект CRecordset, ассоциированный с формой, позволяет тем самым работать с некоторым результирующим набором. Чисто виртуальная функция, которая требует обязательного переопределения. Причина этого понятна — библиотека не может знать, с каким результирующим набором, т. e. объектом класса CRecordset, вы работаете.

Ниже показан фрагмент кода, который выдает мастер AppWizard при создании приложения для работы с базой данных:

CRecordset* CDBView::OnGetRecordset()

{ eturn m_pSet }

BOOL CRecordView::IsOnFirstRecord ( )

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

BOOL CRecordView::IsOnLastRecord( )

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

Операции

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

virtual BOOL CRecordView::OnMove(UINT nIDMoveCommand)

Позволяет изменять указатель на текущую запись, или, другими словами, перемещаться no записям результирующего набора и отображать его поля в элементах управления формы. Параметр nIDMoveCommand задает направление перемещения и может принимать следующие значения:

ID_RECORD_FiRST              Переход к первой строке в результирующем наборе

ID_RECORD_LAST               Переход к последней строке в результирующем наборе

ID_RECORD_NEXT               Переход к следующей строке в результирующем наборе

ID_RECORD_PREV                  Переход к предыдущей строке в результирующем наборе

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

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

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










Последнее изменение этой страницы: 2018-04-12; просмотров: 248.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...