- •О.С. Зеленський
- •Розділ 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. Перевірка значень змінних під час виконання програми
- •Контрольні питання
- •Список літератури
- •Додатки
Idr_mainframe формат строкового ресурсу.
Строковий ресурс IDR_MAINFRAME формується автоматично через MFC AppWizard. Цей рядок включає ряд параметрів розділених \n. (табл. 9.2).
IDR_MAINFRAME < windowTitle > \n < docName > \n
< fileNewName > \n
< filterName > \n < filterExt > \n < regFileTypeID > \n
< regFileTypeName > \n \n
< filterMacName(filterWinName) >
Таблиця 9.2
Перелік параметрів рядкового ресурсу IDR_MAINFRAME
Параметр |
Значення |
<windowTitle> |
Ім’я додатку. |
<docName> |
Ім’я документа за умовчанням. |
<fileNewName> |
Ім’я типу документу. Використовується якщо програма працює з декількома класами документів. З’являється при використанні меню File → New при створені документа (рис. 9.15). |
<filterName> |
Фільтр для діалогу відкриття файлу. |
<filterExt> |
Розширення файлу документа. |
<regFileTypeID> |
Тип документу, для внутрішнього використання. |
<regFileTypeName> |
Ім’я додатку для реєстрації в базі даних Windows. На основі цього імені в реєстрі Windows створюється розділ. Подивитися його можна використовуючи RegEdit. |
9.3.1. Приклад додатку з використанням архітектури «Документ-Вид»
Створимо простий додаток example2 з використанням архітектури «Документ-Вид» за допомогою майстра MFC AppWizard. Для цього виберемо на вкладці Projects пункт MFC AppWizard (exe) (рис. 9.1). На 1-му кроці виділимо опцію Document/View architecture support? (рис. 9.2). Ця опція виділена за умовчанням.
Розглянемо приклад додатку на основі MDI. В результаті отримаємо наступні класи (табл. 9.3):
Таблиця 9.3
Перелік класів додатку з використанням архітектури «Документ-вид»
Назва класу |
Базовий клас |
Опис |
CExample2App |
CWinApp |
Головний клас додатку |
CMainFrame |
CFrameWnd |
Клас головного вікна додатку |
CChildFrame |
CMDIChildWnd |
Клас вікна, який зв’язує між собою класи документа та вікна виду |
CExample2Doc |
CDocument |
Клас документу |
CExample2View |
CView |
Клас вікна виду |
CAboutDlg |
CDialog |
Клас вікна діалогу |
Приклад роботи додатку Example2 представлено на рис. 9.8:
Рис. 9.8. Приклад роботи додатку Example2 з використанням архітектури документ-вид
9.3.2. Види у архітектурі «Документ-Вид»
Приклад створення декількох видів знаходиться у папці DISK\Structure\Dpred1.
Створимо додаток з назвою Dpred1. Одразу у створеній програмі буде один клас виду CDpredView (дамо йому інше ім’я CDpredView0). Додамо клас виду з назвою CDpredView1 (через меню View → ClassWizard… → Add Class… → New…). Конструктор та деструктор класу винесемо у public. Додамо вказівку на клас документа pDoc:
class CDpredView1 : public CView
{
public:
CDpredView1();
CDpredDoc* pDoc;
.............................................................
public:
virtual ~CDpredView1();
.............................................................
};
Клас виду, створений на основі початкового проекту MFC AppWizard (exe) містить функцію GetDocument, яка повертає вказівку на документ:
CDpredDoc* CDpredView0::GetDocument()
{
ASSERT(m_pDocument->IsKindOf(
RUNTIME_CLASS(CDpredDoc)));
return (CDpredDoc*)m_pDocument;
}
У класі виду CDpredView1, який створюється через ClassWizard, подібна функція не має місця. Замість неї в клас додається вказівка pDoc, яку необхідно ініціалізувати при створені класу, що буде розглянуто далі. На рис. 9.9 наведено схему підключення класів вікон у додатку Dpred1.
Рис. 9.9. Схема підключення класів вікон у додатку Dpred1
У класі CMainFrame додамо рядок підключення файлу:
#include "DpredView1.h"
А також вказівки на вікна:
class CMainFrame : public CFrameWnd
{
.............................................................
CDpredView0 * p0;
CDpredView1 * p1;
.............................................................
};
Присвоєння значення p0 відбуватиметься у функції InitInstance класу CDpredApp:
BOOL CDpredApp::InitInstance()
{
.............................................................
CMainFrame* frm = (CMainFrame*)m_pMainWnd;
frm->p0 = (CDpredView0*)frm->GetActiveView();
return TRUE;
}
В клас документа CDpredDoc додамо змінну:
class CDpredDoc : public CDocument
{
.............................................................
CString str;
.............................................................
};
В конструкторі класу заповнимо цю змінну початковим значенням:
CDpredDoc::CDpredDoc()
{
str = "Представление 0";
}
Цю змінну будемо виводити на екран у класах виду. В класи видів CDpredView0 та CDpredView1 додамо функції OnDraw:
void CDpredView0::OnDraw(CDC* pDC)
{
CDpredDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut(10,10,pDoc->str);
}
void CDpredView1::OnDraw(CDC* pDC)
{
pDC->TextOut(10,10,pDoc->str);
}
Як видно з коду, на екран виводиться напис із значенням змінної str, якій присвоєно певні значення. Методи доступу до цієї змінної різні. В клас CDpredView1 введено змінну pDoc, яка буде вказівкою на клас документа:
class CDpredView1 : public CView
{
public:
.............................................................
CDpredDoc*pDoc;
.............................................................
};
Кожному вікну документа може відповідати декілька вікон видів, але лише одне вікно виду має бути активним (виводитись на екран). Зміна цих вікон виду здійснюється у функціях OnView0 та OnView1:
void CMainFrame::OnView0()
{
if (p0) return;
p0 = new CDpredView0;
p0->Create(NULL,
NULL,
AFX_WS_DEFAULT_VIEW,
rectDefault,
this,
AFX_IDW_PANE_FIRST,
NULL);
GetActiveDocument()->AddView(p0);
p1->ShowWindow(SW_HIDE);
GetActiveDocument()->RemoveView(p1);
SetActiveView(p0); // 1 завжди активний ...
delete p1;
p1=0;
((CDpredDoc*)GetActiveDocument())->str
= "Представление 0";
RecalcLayout();
}
void CMainFrame::OnView1()
{
if (p1) return;
p1 = new CDpredView1;
//Отримання вказівки на документ
p1->pDoc = (CDpredDoc*)GetActiveDocument();
p1->Create (NULL,
NULL,
AFX_WS_DEFAULT_VIEW,
rectDefault,
this,
AFX_IDW_PANE_FIRST,
NULL);
GetActiveDocument()->AddView(p1);
p0->ShowWindow(SW_HIDE);
GetActiveDocument()->RemoveView(p0);
SetActiveView(p1);
delete p0;
p0=0;
((CDpredDoc*)GetActiveDocument())->str
= "Представление 1";
RecalcLayout();
}
Функція GetActiveDocument класу CMainFrame повертає вказівку на активний документ. У класі документа ми можемо змінювати вікна видів, завдяки функціям AddView та RemoveView. Клас документа не може бути без вікна виду, тому спочатку ми додаємо новий вид через AddView. Попередній вид ми ховаємо функцією ShowWindow з параметром SW_HIDE. Функція RemoveView видаляє вікно виду з шаблону (контейнеру).
Функцією SetActiveView ми робимо активним новий вид, без цього буде помилка, так як документ залишиться без активного вікна виду!!! Функція GetActiveView повертає вказівку на вікно виду, встановлене функцією SetActiveView. Отже ще одне з призначень функції SetActiveView полягає у забезпеченні можливості отримати вказівку на клас активного виду сторонніми класами, яким це може знадобитись. Після активізації нового вікна виду необхідно видалити об’єкт попереднього вікна виду (рядок delete p0;). У функції OnView1 необхідно отримати вказівку на документ. Робиться це наступним чином:
p1->pDoc = (CDpredDoc*)GetActiveDocument();
Розрахунок розмірів вікон робиться функцією RecalcLayout (функція детально була розглянута у п. 9.2.2).
Приклад роботи додатку показано на рисунку 9.10.
Рис. 9.10. Вікно додатку Dpred1, із вікном виду CDpredView1