- •О.С. Зеленський
- •Розділ 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.4. Додатки mdi, робота з шаблонами
MDI (multi document interface) – це додатки, які можуть працювати з декількома документами одразу. Тобто можна відкрити декілька документів одною програмою. MDI-додаток відображає інформацію як у головному вікні додатку, так і у дочірніх вікнах. Головне вікно є похідним від класу CMDIFrameWnd, а дочірні вікна від класу CMDIChildWnd.
Завдяки класам шаблонів можливо підключити до програми декілька видів документів. Така програма може працювати з різними типами документів.
Якщо додаток створити на основі MDI та додати декілька шаблонів, отримаємо программу, яка може відкривати різні типи документів по декілька вікон в одному головному вікні.
9.4.1. Приклад додатку mdi з одним шаблоном
Створити MDI додаток з використанням MFC AppWizard можливо через меню File → New. На вкладці Projects потрібно вибрати пункт MFC AppWizard (exe) (рис. 9.1). На 1-му кроці виберіть Multiple documents (рис. 9.2).
MFC AppWizard створює для додатку з багатовіконним інтерфейсом декілька основних класів (табл. 9.4):
Таблиця 9.4
Перелік класів додатку MDI з одним шаблоном
Назва класу |
Базовий клас |
Опис |
CMultiApp |
CWinApp |
Головний клас додатку |
CMainFrame |
CMDIFrameWnd |
Клас головного вікна додатку |
CChildFrame |
CMDIChildWnd |
Клас дочірнього вікна MDI |
CMultiDoc |
CDocument |
Клас документа додатку |
CMultiVeiw |
CView |
Клас виду документа |
9.4.2. Приклад додатку mdi з декількома шаблонами
Приклад знаходиться у папці DISK\Structure\MultiTemplate.
Створимо програму на основі MDI-інтерфейсу, з 3-ма шаблонами, дамо їй назву MultiTemplate. Схему цього додатку показано на рис. 9.14.
Рис. 9.14. Схема підключення класів, у додатку MultiTemplate
Додамо новий клас документа CDMultiPredDoc2. В класи документів додамо строкові змінні:
CString str;
Ці змінні заповнимо в конструкторах класів різними даними, щоб на екрані можна було бачити з яким документом працює наш додаток.
Додамо клас виду CDMultiPredView1, та клас CScroll похідний від CScrollView. Коди функцій OnDraw будуть виводити на екран рядки str зі своїх документів:
void CDMultiPredView0::OnDraw(CDC* pDC)
{
CDMultiPredDoc0* pDoc = GetDocument();
pDC->TextOut (10,10,pDoc->str + " Представление 0");
}
void CDMultiPredView1::OnDraw(CDC* pDC)
{
CDMultiPredDoc1* pDoc
= (CDMultiPredDoc1*) GetDocument();
pDC->TextOut (10,10,pDoc->str + " Представление 1");
}
Змінимо перший шаблон і додамо ще 2 шаблона в функцію InitInstance:
BOOL CDMultiPredApp::InitInstance()
{
.............................................................
CMultiDocTemplate*pDocTemplate0
= new CMultiDocTemplate(
IDR_DMULTITYPE0,
RUNTIME_CLASS(CDMultiPredDoc0),
RUNTIME_CLASS(CChildFrame),
// custom MDI child frame
RUNTIME_CLASS(CDMultiPredView0));
AddDocTemplate(pDocTemplate0);
CMultiDocTemplate*pDocTemplate1
= new CMultiDocTemplate(
IDR_DMULTITYPE1,
RUNTIME_CLASS(CDMultiPredDoc1),
RUNTIME_CLASS(CChildFrame),
RUNTIME_CLASS(CDMultiPredView1));
AddDocTemplate(pDocTemplate1);
CMultiDocTemplate*pDocTemplate2
= new CMultiDocTemplate(
IDR_DMULTITYPE2,
RUNTIME_CLASS(CDMultiPredDoc0),
RUNTIME_CLASS(CChildFrame),
RUNTIME_CLASS(CScroll));
AddDocTemplate(pDocTemplate2);
.............................................................
};
Зверніть увагу на константи: IDR_DMULTITYPE0, IDR_DMULTITYPE1 та IDR_DMULTITYPE2, це ідентифікатори рядків і водночас ідентифікатори для меню. За ними кожному класу шаблону співставляється строковий параметр (було описано у п. 9.3), а також меню. Отже для кожного шаблону може бути своє меню.
Як видно з рис. 9.14 всі класи документів та видів співставляються один з одним через клас CChildFrame, тому для зміни видів, для підключення нових типів документів, ми додамо саме в цей клас відповідні функції, які зв’яжемо з відповідними пунктами меню:
void OnTemplate0() – створення файлу на основі 0-го шаблону;
void OnTemplate1() – створення файлу на основі 1-го шаблону;
void OnTemplate2() – створення файлу на основі 2-го шаблону.
Якщо створено 2 та більше шаблонів, то при запуску або відкритті нового документа буде виводитися стандартний MFC-й діалог (рис. 9.15), де буде вказано усі шаблони додані через функцію AddDocTemplate:
Рис. 9.15. Приклад діалогу MFC для вибору шаблону, за яким буде створено новий документ
Розглянемо функції для створення документів за різними шаблонами, без стандартного діалогу вибору шаблона. В цих функціях одразу буде створено новий документ за певним шаблоном:
void CChildFrame::OnTemplate0()
{
per_temp = 0;
CMultiDocTemplate* pDocTemplate;
POSITION pos;
pos = AfxGetApp()->GetFirstDocTemplatePosition();
pDocTemplate = (CMultiDocTemplate*)
AfxGetApp()->GetNextDocTemplate(pos);
pDocTemplate->OpenDocumentFile(NULL);
}
void CChildFrame::OnTemplate1()
{
per_temp = 1;
CMultiDocTemplate* pDocTemplate;
POSITION pos;
pos = AfxGetApp()->GetFirstDocTemplatePosition();
pDocTemplate = (CMultiDocTemplate*)
AfxGetApp()->GetNextDocTemplate(pos);
pDocTemplate = (CMultiDocTemplate*)
AfxGetApp()->GetNextDocTemplate(pos);
pDocTemplate->OpenDocumentFile(NULL);
}
void CChildFrame::OnTemplate2()
{
per_temp = 2;
CMultiDocTemplate* pDocTemplate;
POSITION pos;
pos = AfxGetApp()->GetFirstDocTemplatePosition();
pDocTemplate = (CMultiDocTemplate*)
AfxGetApp()->GetNextDocTemplate(pos);
pDocTemplate = (CMultiDocTemplate*)
AfxGetApp()->GetNextDocTemplate(pos);
pDocTemplate = (CMultiDocTemplate*)
AfxGetApp()->GetNextDocTemplate(pos);
pDocTemplate->OpenDocumentFile(NULL);
}
Ці функції виконують таку послідовність дій: 1) задається вказівка на клас шаблона та змінна для визначення позиції; 2) викликається функція класу шаблона GetFirstDocTemplatePosition для вибору початкової позиції шаблонів; 3) функцією GetNextDocTemplate переходимо на потрібний шаблон; як видно з коду, виклик функції робиться стільки разів, скільки потрібно для переходу на потрібний шаблон; 4) створення нового документа відбувається у функції OpenDocumentFile, параметр NULL вказує саме на необхідність створення нового документа. В цьому параметрі можна вказати шлях до певного файлу на диску, у такому разі відбудеться відкриття існуючого файлу (ім’я функції OpenDocumentFile перекладається як «відкрити файл документа»).
Результат роботи додатку можна бачити на рисунку 9.16:
Рис. 9.16. Вікно додатку MultiTemplate на основі різних шаблонів