пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

Анализ текстов, созданных Арр 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 базируется на многих других классах, откуда и наследует все их возможности.

Иерархия вызовов функций при организации модального диалога

После вызова DoModal управление возвращается Вашей программе, только когда пользователь закрывает диалоговое окно. Если Вы понимаете это, значит, Вы понимаете, что такое модальный диалог. Перейдя к немодальным диалогам, Вы еще оцените, насколько просто было программировать модальные диалоги. Но вернемся к нашей теме и рассмотрим, как выглядит краткая сводка "кто кого вызывает":

 

CDialog::DoModal

   CEx06aDiaiog::OnInitDialog

       Дополнительная инициализация…

            CDialog::OnInitDialog

                  CWnd::UpdateData(FALSE)

                            CEx06aDialog::DoDataExchange

пользователь вводит данные...

пользователь щелкает кнопку ОК

 

CEx06aDiaiog::OnOK

 

        …дополнительная проверка…

CDialog::OnOK

          CWnd::UpdateData(TRUE)

                     CEx06aDialog::DoDataExchange

CDialog::EndDialog(IDOK)

 

OnInitDialog  и DoDataExchange— виртуальные функции, замещенные в классе CEx06aDialog. Windows вызывает OnInitDialog при инициализации диалогового окна, и это приводит к вызову DoDataExchange, виртуальной CWnd-функции, замещенной мастером ClassWizard. Взгляните на листинг этой функции:

 

void CEx06aDia.log: :DoDataExchange(CDataExchange* pDX)

 

зн

     CDiaIog::DoDataExchange(pDX);

     //знзн AFX_DATA_MAP(CexO6aDialog)

      DDX_Text(pDX,  IDC_BIO, m._strBio);

      DDX_Radio(pDX, IDC_CAT, m_nCat);

      DDX_LBString(pDX,  IDC_DEPT, m_strDept);

      DDX_Check(pDX,  IDC_DIS, m.bInsDis);

      DDX_BString(pDX,  IDC_LANG, m_strLang);

 

DDX_Check(pDX, IDC_LIFE,m_bInsLife);

DDX_Scroll(pDX, IDC_LOYAL, m_nLoyal);

DDX_Check(pDX, IDC_MED, m_bInsMed);

DDX_Text(pDX, IDC_NAME, m_strName);

DDX_Scroll(pDX, IDC_RELY, m_nRely);

DDX_CBString(pDX, IDC_SKILL, m_strSkill);

DDX_Text(pDX, IDC_SSN, m_nSsn);

DDV_MinMaxInt(pDX, m_nSsn, 0, 999999999);

DDX_CBString(pDX, IDC_EDUC, m_strEduc);

//>зн AFX_DATA_MAP

 

DoDataExchange и функции DDX__ (обмен) и DDV__ (проверка достоверности) являются "дву-сторонними". Если UpdateData вызывается с параметром FALSE, то переносит данные из элементов данных в элементы управления диалогового окна. Если же этот параметр — TRUE, функция передает данные из элементов управления в элементы данных. DDX_Text замещается для подстройки под множество типов данных.

Функция EndDialog критична для процедуры завершения диалогового окна. DoModal возвращает параметр, передаваемый в EndDialog. IDOK принимает данные из диалогового окна, а IDCANCEL отменяет диалог.


18.01.2020; 22:34
хиты: 47
рейтинг:0
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь