- •О.С. Зеленський
- •Розділ 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. Перевірка значень змінних під час виконання програми
- •Контрольні питання
- •Список літератури
- •Додатки
Invalidate();
}
10. Оброблювач команди меню готовий.
11. Далі ми оголосимо OutputString у заголовному файлі виду:
// buggyView.h : інтерфейс класа CBuggyView
.............................................................
protected:
CString OutputString;
.............................................................
}
12. У конструкторі виду в цей рядок заноситься підказка, що пропонує користувачеві виконати команду Calculate → Calculate Average (підказка буде виведена при запуску програми):
void CBuggyView::OnDraw(CDC* pDC)
{
CBuggyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut(0, 0, OutputString);
}
13. Залишається занести в OutputString текст підказки, яка відображається у методі OnDraw():
CBuggyView::CBuggyView()
{
OutputString = "Выполните команду Calculate|Calculate Average";
}
Програма готова до виконання.
Запустіть її і виберіть команду Calculate Average. Програма повідомляє, що середнє арифметичне чисел 1-5 дрівнює -21474833.600 (рис. 13.1). Можливо, ви отримаєте інше число.
Рис. 13.1. Програма buggy: перша спроба
Схоже, ми десь помилилися.
13.3. Установка точки переривання
Перейдемо до налагодження програми buggy. Бажано потрапити в програму під час її роботи, щоб можна було почати послідовне виконання, однак починати з самого початку програми не хочеться, оскільки в цьому випадку нам доведеться проходити через стартовий код Visual C++, який в звичайному випадку ми навіть не побачимо. Налагодження повинно починатися ближче до того місця, де, як можна припустити, виникає проблема, – до фрагмента, який відповідає за обчислення середнього арифметичного.
Щоб почати налагодження з довільного рядка, слід встановити точку переривання. Під час виконання програма зупиниться на ньому, ми зможемо переглянути свій код і при необхідності перейти в покроковий режим. Подивимося, як це робиться. Ми помістимо точку переривання на початку фрагмента для обчислення середнього арифметичного, конкретніше – на початку методу OnCalculateCalculateaverage(), в першому рядку циклу for:
void CBuggyView::OnCalculateCalculateaverage()
{
CBuggyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
float Sum;
float Average;
for(int loop_index = 1; loop_index < 5; loop_index++)
{
Sum += pDoc->data[loop_index];
}
Average = Sum / (float) 5.0;
OutputString.Format(
"Среднее арифметическое пяти чисел равно: %.3f",
Average);
Invalidate();
}
Точку переривання можна встановити перед запуском програми або під час її зупинки на іншій точці. Натискаючи клавішу F10, ми зможемо переміщатися по коду програми. Одноразове натиснення цієї клавіші переводить нас до наступного рядка програми:
void CBuggyView::OnCalculateCalculateaverage()
{
CBuggyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
float Sum;
float Average;
for(int loop_index = 1; loop_index < 5; loop_index++)
{
Sum += pDoc->data[loop_index];
}
Average = Sum / (float) 5.0;
OutputString.Format(
"Среднее арифметическое пяти чисел равно: %.3f",
Average);
Invalidate();
}
Багаторазово натиснувши F10, ви зможете переміщатися в програмі і далі. Заодно можна буде переглянути значення різних змінних, так що в процесі налагодження ви як би зайдете у виконувану програму «з чорного ходу». Оскільки ми знаємо, як повинен працювати цей фрагмент, нам буде легше виявити проблеми, що виникають.
Щоб розмістити точку переривання на початку циклу for, встановіть на цьому рядку текстовий курсор і натисніть клавішу F9 або кнопку з піднятою рукою на панелі інструментів (вона виконує ту ж функцію ). У результаті на рядку буде встановлена точка переривання (у програмі може бути кілька точок переривання), як показано на рис. 13.2. Точка переривання позначається маленьким значком у вигляді стоп-сигналу на лівому полі.
Рис. 13.2. Установка точки переривання
Підказка. Не дозволяється встановлювати точки переривання на рядках програми, що містять оголошення змінних (наприклад, float Sum;).
Виконання програми до точки переривання
Давайте запустимо програму buggy у відладчик – для цього досить виконати команду Build → Start Debug → Go. На екрані з'являється вікно програми, і ви можете виконати команду Calculate → Calculate Average. У результаті код методу OnCalculateCalculateAverage() виконується до рядка, на якому встановлена точка переривання. Потім програма зупиняється і відображає у вікні Visual C++ код методу (рис. 13.3). Стрілка на лівому полі Visual C++, зображена на рис. 13.3, означає поточний виконуваний рядок нашої програми.
Зверніть увагу – в Visual C++ меню Build замінилося на Debug (див. рис. 13.3). Серед різних команд цього меню особливо цікаві команди Step Into (F11), Step Over (F10), Step Out (Shift+F11) та Run To Cursor (Ctrl+F10). Вони відповідають різним способам виконання програми, передбаченим у режимі налагодження Visual C++.
Рис. 13.3. Зупинка на крапці переривання