- •О.С. Зеленський
- •Розділ 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. Перевірка значень змінних під час виконання програми
- •Контрольні питання
- •Список літератури
- •Додатки
12.4. Створення елемента ActiveX на базі стандартних елементів
Приклад створення елементу ActiveX на базі кнопки знаходиться у папці DISK\ActiveX\buttoner. Приклад додатку, який використовує даний елемент знаходиться у папці DISK\ActiveX\buttonerapp.
Цей приклад демонструє ряд нових аспектів програмування ActiveX, наприклад, можливість створення елементів на базі існуючих керуючих елементів (наприклад, кнопок). Ми також побачимо, як організувати в елементах ActiveX підтримку подій – програма, в яку запроваджено такий елемент, зможе обробити подію так само, як будь-яке повідомлення Windows. У нашому випадку елемент буде називатися Buttoner і підтримувати подію Click. Присутній у програмі метод-обробник (скажімо, OnClickButtonerctrl1()) буде викликатися при клацанні мишею всередині елемента.
Крім того, в новому прикладі будуть підтримуватися методи елементів ActiveX – зокрема, ми включимо в нього метод Веер(). В інших програмах за допомогою ClassWizard ви зможете створювати змінні, пов'язані з нашим елементом (наприклад, m_buttoner), і викликати метод за допомогою запису типу m_buttoner.Веер().
Нарешті, ми розглянемо властивості елементів ActiveX. У нашому прикладі буде підтримуватися властивість з ім'ям data. У ній зберігатиметься кількість клацань мишею, зроблених на елементі. Існує два способи звернення до властивості data з інших програм: можна або дозволити посилатися на властивість в записі типу m_buttoner.data і безпосередньо читати і присвоювати значення цієї властивості, або скористатися більш надійним способом і надати спеціальні методи для звернення до властивості. У цьому випадку інша програма повинна викликати метод m_buttoner.SetData(), щоб привласнити значення властивості, і m_buttoner.GetData(), щоб отримати його. Використання методів для доступу більш надійно, оскільки присвоюване значення можна заздалегідь перевірити. У нашому прикладі буде використовуватися саме цей варіант.
Створіть програму Buttoner за допомогою ControlWizard. У другому вікні Control Wizard виберіть рядок BUTTON з розкривного списку під питанням Which window class, if any, should this control subclass? (Який віконний клас, якщо такий існує, повинен субкласувати даний елемент?), як показано на рис. 12.7, і завершіть створення елемента кнопкою Finish.
Рис. 12.7. Створення елемента Buttoner на базі кнопки
Можна приступати до настройки елементу Buttoner.
Налаштування елемента Buttoner
Поки що наш новий елемент ActiveX виглядає, як порожня кнопка, проте ми можемо налаштувати його зовнішній вигляд і помістити на нього напис, наприклад «Натисни мене!». Ми зробимо це в конструкторі елемента, розташованому у файлі ButtonerCtl.cpp:
CButtonerCtrl::CButtonerCtrl()
{
InitializeIIDs(&IID_DButtoner, &IID_DButtonerEvents);
// ЗРОБИТИ: ініциалізуйте дані екземпляра
// вашого елемента.
}
Елемент Buttoner, як і всі керуючі елементи ActiveX, породжується від класу COleControl, тому можна скористатися методом SetText() цього класу і змінити напис на елементі:
CButtonerCtrl::CButtonerCtrl()
{
InitializeIIDs(&IID_DButtoner, &IID_DButtonerEvents);
// ЗРОБИТИ: ініциалізуйте дані екземпляра
// вашого елемента.
SetText("Нажми меня!");
}
Рис. 12.8. Налаштування елемента ActiveX
Приступимо до програмування. Почнемо з додавання подій в елемент ActiveX. Інші програми, які користуються цим керуючим елементом, можуть містити обробники, що викликаються при виникненні події.
Додавання подій
Ми створимо в елементі Buttoner подію Click, яка відбувається при клацанні мишею. Її виникнення (з повідомленням програми, в яку запроваджено елемент ActiveX) називається збудженням (firing) події, тому говорять, що при натисканні мишею програма збуджує подію Click. При порушенні події Click викликається її обробник у програмі, яка містить наш елемент. Це робиться наступним чином.
У ClassWizard необхідно перейти на вкладку ActiveX Events та натиснути кнопку Add Event. Відкривається однойменне вікно (рис. 12.9).
Рис. 12.9. Додавання події до елемента ActiveX
У ньому ми і створимо подію Click. Виберіть рядок Click у списку External name (див. рис. 12.9) – в наш елемент додається подія Click. Щоб подія дійсно відбулась, потрібно викликати метод FireClick(), який також вказаний у вікні Add Event.
Підказка. Якщо ви хочете, щоб нова подія викликалась з параметрами (які будуть передаватися оброблювачу програми, що працює з елементом), введіть параметри та його типи в списку Parameter, розташованому в нижній частині вікна Add Event.
Подія Click буде порушуватися при клацанні лівою кнопкою миші, тому зараз ми включимо в елемент ActiveX обробник OnLButtonDown():
void CButtonerCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
// ЗРОБИТИ: додайте код обробки події
// і/або викличте обробник за замовчуванням
COleControl::OnLButtonDown(nFlags, point);
}
Щоб порушити подію Click, досить викликати спеціальний метод FireClick(), створений ClassWizard (якщо подія передає обробникам будь-які параметри, їх слід передати методу FireEvent(), де Event – ім'я вашої події):
void CButtonerCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
FireClick();
COleControl::OnLButtonDown(nFlags, point);
}
Цей фрагмент призводить до того, що при кожному клацанні мишею буде порушуватися подія Click, а програми, що працюють з елементом, зможуть відреагувати на неї в обробнику.
Ми навчилися порушувати події з елемента ActiveX. Число клацань повинно зберігатися у властивості data, і зараз ми створимо цю властивість.
Додавання властивостей до елементів ActiveX
Властивістю називається змінна класу елемента. Якщо той містить властивість data, то інші програми можуть звертатися до нього через запис типу m_buttoner.data або через функції читання / запису властивості: m_buttoner.SetData() і m_buttoner.GetData(). Ми познайомимося з властивостями на прикладі data, який зберігає число клацань мишею.
Щоб додати властивості в елемент ActiveX також використовується ClassWizard. Відкрийте його і перейдіть на вкладку Automation (за назвою технології OLE Automation), потім натисніть кнопку Add Property, щоб викликати однойменне вікно (рис. 12.10).
Рис. 12.10. Вікно Add Property
Введіть в поле External name назву властивості data; зробіть її коротким цілим числом, вибравши зі списку Туре рядок short. Встановіть перемикач Member Variable. Натисніть кнопку OК, щоб закрити вікно Add Property, а потім закрийте ClassWizard.
Тепер в програмі можна посилатися на значення властивості data через змінну m_data. Почнемо з обнулення цього значення в конструкторі:
CButtonerCtrl::CButtonerCtrl()
{
InitializeIIDs(&IID_DButtoner, &IID_DButtonerEvents);
SetText("Haжми меня!");
m_data = 0;
}
У властивості має зберігатися число кліків на елементі, тому в OnLButtonDown() слід збільшувати значення m_data:
void CButtonerCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
// ЗРОБИТИ: додайте код обробки події
// і/або викличте обробник за замовчуванням
FireClick();
m_data++;
COleControl::OnLButtonDown(nFlags, point);
}
Якщо інша програма викличе метод GetData() нашого елемента, вона отримає значення змінної m_data, яке дорівнює кількості клацань, зроблених на ньому.
Додавання властивості закінчено. До справжнього моменту наш елемент має подію Click і властивість data. Зараз ми додамо до нього метод Beep(), який може викликатися іншими програмами за допомогою запису виду m_buttoner.Веер().
Додавання методів
Щоб додати елемент метод, викличте ClassWizard і перейдіть на вкладку Automation. Натисніть кнопку Add Method для відкриття вікна (рис. 12.11).
Дайте новому методу ім'я Beep (в обох полях – External name і Internal name) і тип значення, що повертається void (рис. 12.11). Натисніть кнопку ОК, щоб закрити вікно Add Method, а потім закрийте ClassWizard. В елементі з'являється метод Beep()
void CButtonerCtrl::Beep()
{
// ЗРОБИТИ: додайте код диспетчерської обробки
}
Рис. 12.11. Вікно Add Method
При виклику цього методу комп'ютер буде видавати звуковий сигнал, для цього ми скористаємося методом MFC MessageBeep():
void CButtonerCtrl::Beep()
{
MessageBeep(MB_OK);
}
У нашому елементі з'явився новий метод, який може використовуватися в інших програмах. Тепер вони можуть викликати метод Beep() елемента всередині свого коду. Настав час подивитися, як елемент Buttoner веде себе в інших додатках. Давайте спробуємо впровадити його в програму і попрацювати з ним на рівні програмного коду.