- •О.С. Зеленський
- •Розділ 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. Перевірка значень змінних під час виконання програми
- •Контрольні питання
- •Список літератури
- •Додатки
9.2.3. Створення дочірніх вікон без використання архітектури «Документ-Вид» (переключення вікон з використанням функції ShowWindow)
Створимо приклад аналогічний до описаного у п. 9.2.2. з назвою Dchild_no_tem_2 (папка DISK\Structure\Dchild_no_tem_1). Відмінність буде полягати у способі зміни вікон. Усі вікна будуть створені у функції OnCreate класу CMainFrame, для цього додамо такі рядки коду:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
.............................................................
m_child1 = new CChild1;
m_child2 = new CChild2;
m_client1 = new CClient1;
m_client1->par_child1 = m_child1;
m_child1->CreateEx(0,
NULL, "Child 1", AFX_WS_DEFAULT_VIEW,
CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST);
m_child2->CreateEx(0,
NULL, "Child 2", WS_CHILD|WS_VISIBLE|WS_BORDER,
CRect(0, 0, 0, 0),this, AFX_IDW_PANE_FIRST + 1);
CRect rect;
GetWindowRect(&rect);
rect.OffsetRect(20,80);
m_client1->CreateEx(0,NULL, "Client 1",
WS_VISIBLE|WS_OVERLAPPEDWINDOW,rect, m_child1,0);
m_client1->ShowWindow(SW_HIDE);
return 0;
}
При створенні дочірніх вікон, вікну Child1 надається ідентифікатор AFX_IDW_PANE_FIRST (воно буде вкладеним по умовчанню). Дочірньому вікну Child2 надається AFX_IDW_PANE_FIRST+1. Всі вікна будуть знаходитись у пам’яті, при натисненні на пункти меню буде виводитись потрібне вікно, завдяки функціям ShowWindow та SetDlgCtrlID.
Програмний код функцій для виведення вікон:
void CMainFrame::OnChild1()
{
m_child1->ShowWindow(SW_HIDE);
m_child2->ShowWindow(SW_HIDE);
m_child2->SetDlgCtrlID(AFX_IDW_PANE_FIRST + 1);
m_child1->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
m_child1->ShowWindow(SW_SHOW);
RecalcLayout();
}
void CMainFrame::OnChild2()
{
m_child1->ShowWindow(SW_HIDE);
m_child2->ShowWindow(SW_HIDE);
m_client1->ShowWindow(SW_HIDE);
m_child1->SetDlgCtrlID(AFX_IDW_PANE_FIRST + 1);
m_child2->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
m_child2->ShowWindow(SW_SHOW);
SendMessage(WM_SIZE);
}
Порівняно з попереднім прикладом цей спосіб є більш простим з точки зору програмної реалізації. Але недоліком може бути те, що класи дочірніх вікон завжди знаходяться у пам’яті.
Зверніть увагу на константу AFX_IDW_PANE_FIRST, вона задає ідентифікатор дочірнього вікна. Кожному вікну можна задати ідентифікатор (певний номер), за яким можна «відрізнити» одне вікно від іншого. В певний момент часу може бути показане тільки одне з дочірніх вікон. Показується вікно ідентифікатор якого дорівнює AFX_IDW_PANE_FIRST. У певний момент часу може існувати лише одне дочірнє вікно, що має ідентифікатор AFX_IDW_PANE_FIRST.
Функція SetDlgCtrlID має важливе значення та призначена для зміни ідентифікатора відображуваного дочірнього вікна. При створені ми не можемо всім дочірнім вікнам дати ідентифікатор AFX_IDW_PANE_FIRST, отже деякі вікна не будуть показані. Саме ця функція дозволяє змінювати ідентифікатори вікон, отже можна керувати відображенням дочірніх вікон.
Результат роботи програми показано на рис. 9.7.
Рис. 9.7. Приклад роботи додатку Dchild_no_tem_2, із вікнами Child1 та Client1
9.3. Архітектура «Документ-Вид»
Всі програми з архітектурою «Документ-Вид» створюються на основі класів шаблонів. CDocTemplate – абстрактний клас, на його основі об`єкти шаблонів не створюються. Його основна роль у забезпеченні шаблонів основними властивостями, а для створення конкретних об’єктів в бібліотеці MFC реалізовані два інших класи – CSingleDoTemplate і CMultiDocTemplate, які спеціально адаптовані для роботи відповідно у SDI- та MDI-додатках.
Класи шаблонів при створенні вимагають ідентифікатор строкового ресурсу і 3 класи: 1) документа (C...Doc), 2) головного вікна з рамкою (CMainFrame), 3) вікна виду (C...View).
Приклад коду для створення об’єкта шаблону:
BOOL C...App::InitInstance()
{
.............................................................
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(C...Doc),
RUNTIME_CLASS(CMainFrame),// main SDI frame window
RUNTIME_CLASS(C...View));
AddDocTemplate(pDocTemplate);
.............................................................
}