- •О.С. Зеленський
- •Розділ 9. Структура створення додатків
- •9.1. Загальна структура додатків
- •9.2. Додатки без використання архітектури «Документ-вид»
- •9.2.1. Приклад додатку реєстрації wnd-класу вікна
- •9.2.2. Створення та видалення дочірніх вікон без використання архітектури «Документ-Вид»
- •9.2.3. Створення дочірніх вікон без використання архітектури «Документ-Вид» (переключення вікон з використанням функції ShowWindow)
- •9.3. Архітектура «Документ-Вид»
- •Idr_mainframe формат строкового ресурсу.
- •9.3.1. Приклад додатку з використанням архітектури «Документ-Вид»
- •9.3.2. Види у архітектурі «Документ-Вид»
- •9.3.3. Створення видів у архітектурі «Документ-Вид» (переключення видів з використанням функції ShowWindow)
- •9.3.4. Робота з документами та видами на прикладі додатку SingleTemplate
- •9.4. Додатки mdi, робота з шаблонами
- •9.4.1. Приклад додатку mdi з одним шаблоном
- •9.4.2. Приклад додатку mdi з декількома шаблонами
- •Контрольні питання
- •Розділ 10. Робота з базами даних з використанням об'єктів ado
- •10.1.1. Ініціалізація об'єктів com з використанням директиви #import
- •10.1.2. Підтримка класів сом
- •10.2. Об'єкт Connection
- •10.3. Об'єкт Command
- •10.4. Об'єкт Recordset
- •10.5. Об'єкт Field і колекція Fields
- •10.6. Об'єкт Error і колекція Errors
- •10.8. Коротка характеристика структури мови sql
- •10.9. Синтаксис оператора вибору Select
- •10.10. Приклад програмування об'єктів ado
- •10.11. Опис розробленого навчального пакету ado6 для роботи з базами даних access та MySql
- •Int tip_bd; // тип бд 1- ms access, 2- MySql, 3 - xml
- •Void Connect_Baza(cString str);
- •Void ErrMessage(_com_error &ce);
- •If(pConn.CreateInstance("adodb.Connection"))
- •If(pRecordset.CreateInstance("adodb.RecordSet"))
- •Void cAdo6Doc::ErrMessage(_com_error &ce)
- •Void cAdo6Doc::OnMsaccess()
- •Void cAdo6Doc::OnMysql()
- •Void cAdo6Doc::OnXmlRead()
- •Void cAdo6Doc::Connect_Baza(cString str)
- •Virtual void DoDataExchange(cDataExchange* pDx);
- •Void cAdo6Dlg::DoDataExchange(cDataExchange* pDx)
- •Void cAdo6Dlg::Struct_MySql()
- •Void cAdo6Dlg::OnSelchangeListBaza()
- •Void cAdo6Dlg::OnVibor_bd()
- •Void cAdo6Dlg::AccessOpen()
- •Void cAdo6Dlg::xmlOpen()
- •Void cAdo6Dlg::Structura_bd()
- •Void cAdo6Dlg::OnSelchangeListTab()
- •Void cAdo6Dlg::show(int kod, int kod_bd)
- •Void cAdo6Dlg::Recordset_Baza(cString str)
- •Void cAdo6Dlg::OnClose()
- •10.11.2. Формування списку бд (MySql), відкриття бази даних (ms access), відкриття xml-файлу, формування списку таблиць (MySql і ms access) та полів (MySql, ms access, xml)
- •Void cAdo6Dlg::OnSelchangeListTab()
- •1. Обрану таблицю необхідно брати в зворотні лапки "`", щоб виключити помилку в тому випадку, якщо в імені таблиці будуть зустрічатися пробіли.
- •10.11.3. Робота з sql-запитами
- •Void cAdo6Dlg::OnZapros_Select()
- •If (str_query.Mid(0,6).Compare("select"))
- •If(!baza.Left(3).Compare("otl") &&
- •Void cAdo6Dlg::Recordset_Baza(cString str)
- •Void cado6Dlg::OnZapros_Make()
- •Vr_zap.Format(" Запрос выполнен за %f сек ",conec - nach);
- •10.11.4. Видалення, сортування, пошук, фільтрація, оновлення набору записів
- •Void cado6Dlg::OnZapis_Delete()
- •Void cado6Dlg::OnCheck_Sort()
- •Void cado6Dlg::OnFind()
- •0L,adSearchForward,bb);
- •Void cado6Dlg::OnFilter()
- •Void cado6Dlg::OnVozvrat()
- •10.11.5. Переходи по записах
- •Void cado6Dlg::OnButtonFirst()
- •Void cado6Dlg::OnButtonLast()
- •Void cado6Dlg::OnButtonLeft()
- •Void cado6Dlg::OnButtonRight()
- •Void cado6Dlg::OnButtonRecno()
- •Void cado6Dlg::OnButtonPgup()
- •Void cado6Dlg::OnButtonPgdn()
- •Void cado6Dlg::OnButtonBookmark()
- •10.11.6. Запис даних до xml-файлу
- •Void cAdo6Dlg::OnButtonSave()
- •10.11.7. Кнопки, призначені тільки для роботи з otl_tab
- •Void cado6Dlg::OnZapis_Add1()
- •Void cado6Dlg::OnZapis_Add2()
- •Void cado6Dlg::OnZapis_Update1()
- •Void cado6Dlg::OnZapis_Update2()
- •Void cado6Dlg::OnFormir_bd()
- •Void cAdo6Dlg::OnValues_Fields()
- •10.12. Використання у якості джерела даних електронної таблиці Excel
- •Контрольні питання
- •Завдання
- •Розділ 11. Програмування для інтернет
- •11.1. Створення броузера
- •11.3. Використання протоколу http
- •If ((pInternetSession)
- •11.4. Використання протоколу ftp
- •Контрольні питання
- •Розділ 12. Створення елементів activex
- •12.1. Створення елементів ActiveX
- •Invalidate();
- •12.2. Тестування елемента ActiveX
- •12.4. Створення елемента ActiveX на базі стандартних елементів
- •12.5. Відображення елементів ActiveX
- •Контрольні питання
- •Розділ 13. Налагодження програм
- •Int data[5];
- •Invalidate();
- •13.3. Установка точки переривання
- •13.2. Покрокове виконання програми
- •13.4. Перевірка значень змінних під час виконання програми
- •Контрольні питання
- •Список літератури
- •Додатки
Void cado6Dlg::OnButtonRecno()
{
if(pRecordset->GetState()==0)return;
if(!pRecordset->GetRecordCount())return;
try
{
pRecordset->PutAbsolutePosition((PositionEnum)5);
}
catch(_com_error &ce)
{
Doc->ErrMessage(ce);
}
}
// Перехід на попередню сторінку - кнопка <PgUp>
Void cado6Dlg::OnButtonPgup()
{
if(pRecordset->GetState()==0)return;
if(!pRecordset->GetRecordCount())return;
// Установка кількості записів на сторінці
pRecordset->PageSize = 7;
try
{
PositionEnum tt;
tt = pRecordset->GetAbsolutePage ();
if(tt>1) pRecordset->PutAbsolutePage (PositionEnum(tt-1));
}
catch(_com_error &ce)
{
Doc->ErrMessage(ce);
}
}
// Перехід на наступну сторінку - кнопка <PgDn>
Void cado6Dlg::OnButtonPgdn()
{
if(pRecordset->GetState()==0)return;
if(!pRecordset->GetRecordCount())return;
// Установка кількості записів на сторінці
pRecordset->PageSize = 7;
try
{
PositionEnum tt;
tt = pRecordset->GetAbsolutePage ();
if (tt<pRecordset->PageCount)
pRecordset->PutAbsolutePage (PositionEnum(tt+1));
}
catch(_com_error &ce)
{
Doc->ErrMessage(ce);
}
}
У функції відгуку OnButtonRecno() здійснюється перехід на запис із логічним (абсолютним) номером 5. Для цього використовується властивість Recordset AbsolutePosition або це робиться за допомогою функції PutAbsolutePosition(). Слід зазначити, що установка абсолютних (логічних) позицій для переміщення на зазначений запис або сторінку (властивості AbsolutePosition, AbsolutePage) для входу вимагають структуру типу PositionEnum. У цьому випадку реалізований універсальний підхід, щоб мати можливість користуватися як перерахованими константами enum, так і своїми власними цілими значеннями. Так, у нашому випадку, для переходу на п'ятий запис необхідно число 5 привести до типу (PositionEnum).
Для здійснення посторінкового переходу по записах спочатку необхідно встановити кількість записів на сторінці за допомогою властивості PageSize (за замовчуванням 10 записів). У нашому випадку доцільно встановити кількість записів, які вміщатимуться в елемент керування DataGrid при виведенні, що буде відповідати 7 записам. Властивості об'єкта Recordset PageSize та PageCount взаємозалежні. Так при установці кількості записів на сторінці за допомогою властивості PageSize, кількість сторінок (властивість PageCount) буде розраховано автоматично. При переході на попередню сторінку (функція відгуку OnButtonPgup()) зчитується положення поточної сторінки за допомогою функції GetAbsolutePage(), і якщо воно більше одиниці – переходимо на попередню сторінку. Що стосується переходу на наступну сторінку (функція відгуку OnButtonPgdn()), то тут поточне значення сторінки порівнюється з кількістю сторінок (властивість PageCount), і якщо воно менше загальної кількості сторінок – здійснюється перехід на наступну сторінку. Для універсальності підходу використовується перерахований тип даних PositionEnum.
У наступній функції відгуку OnButtonBookmark() (кнопка <Bookmark>) показана робота із закладками (Bookmark). Закладки (Bookmark) призначені для збереження поточної позиції запису, з наступним переходом на неї. Bookmark – унікальне значення, що привласнюється кожному запису. При початковому завантаженні Recordset – Bookmark відповідає порядковому (фізичному) номеру запису. Коли ж відбувається видалення, сортування записів – закладки не перебудовуються. Вони перебудовуються в тому випадку, коли Recordset знову перечитується, що еквівалентно відкриттю набору заново. Тобто, закладки формуються тільки один раз, при формуванні набору. Можна сказати, що закладки при початковому формуванні Recordset відповідають фізичному номеру запису.
Слід зазначити, що тип властивості BookMark – _variant_t, що містить у собі тип даних double.
Приведемо текст функції відгуку OnButtonBookmark().
// Перехід на закладку з номером 5 - кнопка <Bookmark>