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

Изменения в классе вида CAdoDatabaseView

Заполнение формы

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

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

Функция RefreshBoundData
  1. Добавьте в класс представления (АВ: класс вида) новый метод, тип -- void. RefreshBoundData -имя, public - Доступ Отредактируйте функцию как в 13.6

Вверх

Листинг 13.6 Функция RefreshBoundData


void CAdoDatabaseView::RefreshBoundData(void) {
CCustomRs* pRs;

// Get a pointer to the document object
pRs = GetDocument()->GetRecSet();

// Is the field OK
if (adFldOK == pRs->lFirstNameStatus)

// Copy the value
m_strFirstName = pRs->m_szFirstName;
else
// Otherwise, set the value to 0
m_strFirstName = _T("");

// Is the field OK
if (adFldOK == pRs->lLastNameStatus)

// Copy the value
m_strLastName = pRs->m_szLastName;
else
// Otherwise, set the value to 0
m_strLastName = _T("");

// Is the field OK
if (adFldOK == pRs->lAddressStatus)

// Copy the value
m_strAddress = pRs->m_szAddress;
else
// Otherwise, set the value to 0
m_strAddress = _T("");

// Sync the data with the controls
UpdateData(FALSE);

}


Анализ:

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

  1. Эта функция должна прежде всего получить указатель на экземпляр класса хранения данных от документа.

    CCustomRs* pRs;
    // Получить указатель на документ
    pRs = GetDocument()->GetRecSet();

  2. Затем функция проверяет состояние каждого поля записи в экземпляре класса хранения данных и, если значение готово для копирования, копирует его.

    // Поле готово для копирования?
    if (adFldOK == pRs->lFirstNameStatus)

    // Копировать значение
    m_strFirstName = pRs->m_szFirstName;
    else
    // В противном случае установить значение 0
    m_strFirstName = _T("");
    . . .
    . . .

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

    // Обновить экран
    UpdateData(FALSE);

Вверх

Сохранение изменений

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

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

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

Функция UpdateBoundData
  1. Добавьте в класс представления (АВ: класс вида) новый метод, тип -- void. UpdateBoundData -имя, private - Доступ
  2. Отредактируйте функцию как в 13.7

Вверх

Листинг 13.7 Функция UpdateBoundData



void CAdoDatabaseView::UpdateBoundData(void) {
CCustomRs* pRs;
// Get a pointer to the document
pRs = GetDocument()->GetRecSet();
// Sync the controls with the variables
UpdateData(TRUE);

// Has the field changed? If so, copy the value back
if (m_strFirstName != pRs->m_szFirstName)
strcpy(pRs->m_szFirstName, (LPCTSTR)m_strFirstName);

// Has the field changed? If so, copy the value back
if (m_strLastName != pRs->m_szLastName)
strcpy(pRs->m_szLastName, (LPCTSTR)m_strLastName);

// Has the field changed? If so, copy the value back
if (m_strAddress != pRs->m_szAddress)
strcpy(pRs->m_szAddress, (LPCTSTR)m_strAddress);

}


Анализ:

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

  1. CCustomRs* pRs;
    // Получить указатель на документ
    pRs = GetDocument()->GetRecSet();

  2. // Синхронизация
    UpdateData(TRUE);

  3. // Поле изменилось?Если да то сопировать значение в переменную
    if (m_strFirstName != pRs->m_szFirstName)
    strcpy(pRs->m_szFirstName, (LPCTSTR)m_strFirstName);
    . . .
    . . .

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


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

Hosted by uCoz