- •О.С. Зеленський
- •Розділ 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. Перевірка значень змінних під час виконання програми
- •Контрольні питання
- •Список літератури
- •Додатки
Void cado6Dlg::OnZapis_Add2()
{
if(pRecordset->GetState()==0)return;
_variant_t a;
long i;
COleDateTime mytime(2000,1,1,0,0,0);
FieldPtr field;
try
{
pRecordset->AddNew();
for(i=0;i<fields->GetCount ();i++)
{
// повернення вказівки на об'єкт поля
field = fields->GetItem ((_variant_t)i);
switch(i)
{
case 0:
a= pRecordset->GetRecordCount();
break;
case 1:
a = pRecordset->GetRecordCount()+200L;
break;
case 2:
a = "Додавання2";
break;
case 3:
a = mytime;
break;
case 4:
a = 1L;
break;
}
field->Value = a;
}
pRecordset->Update();
}
catch(_com_error &ce)
{
Doc->ErrMessage(ce);
}
}
У даному фрагменті представлений доступ до об'єктів колекції полів Fields і до конкретного поля Field з використанням вказівок, відповідно FieldsPtr та FieldPtr. Після додавання порожнього запису (метод AddNew()) у циклі в об'єкт field за допомогою функції GetItem() повертається вказівка на конкретне поле. Входом у функцію GetItem() є об'єкт типу _variant_t, щоб можна було увійти як ім'ям, так і індексом поля. Так як в нашому випадку використовуються індекси полів, доцільно змінну i, що бере участь у циклі оголосити як long, а потім у функції GetItem() приводити її до типу (_variant_t).
В операторі switch() залежно від індексу поля таблиці otl_tab зміній a типу _variant_t привласнюється відповідне значення. Використовуючи властивість Value (або функцію PutValue()) об'єкта Field кожному полю привласнюється значення a типу _variant_t. Після присвоєння всім полям поточного запису відповідних значень необхідно викликати метод Update() для запису даних безпосередньо в БД.
Функції відгуку оновлення поточного запису в прикладі ADO6 також реалізовані двома способами. У першій з них, OnZapis_Update1() (кнопка <Обновление 1>) наведена робота функції Update() з параметрами. Вона є нераціональним підходом і наведена для того щоб показати роботу з динамічними масивами. Друга функція відгуку, OnZapis_Update1() (кнопка <Обновление 2>) є класичним раціональним прикладом роботи із записом, а саме просте присвоєння кожному полю конкретного значення.
Приведемо текст функції відгуку OnZapis_Update1().
// кнопка <Обновление1>
// Відновлення поточного запису з використанням функції Update
Void cado6Dlg::OnZapis_Update1()
{
if(pRecordset->GetState()==0)return;
if (!pRecordset->GetRecordCount ())
{
MessageBox("Пустая таблица!!!","Внимание!!!",
MB_ICONINFORMATION);
return;
}
SAFEARRAY * ar_f;
SAFEARRAY * ar_v;
SAFEARRAYBOUND rgsabound;
rgsabound.lLbound = 0;
rgsabound.cElements = 5;
long i;
_variant_t var1;
ar_f = SafeArrayCreate(VT_VARIANT, 1, &rgsabound);
ar_v = SafeArrayCreate(VT_VARIANT, 1, &rgsabound);
for(i = 0; i < 5; i++)
SafeArrayPutElement(ar_f, &i, &(_variant_t)i);
i = 0;
var1 = (long)(i + 100);
SafeArrayPutElement(ar_v, &i, &var1);
i = 1;
// -------------------------------------------------
time_t time1;
struct tm *tm1;
time(&time1); // time - кількість секунд із 1970 р.
tm1 = localtime(&time1);
var1= (long)tm1->tm_sec;
SafeArrayPutElement(ar_v, &i, &var1);
// -------------------------------------------------
i = 2;
var1="обновление";
SafeArrayPutElement(ar_v, &i, &var1);
i = 3;
COleDateTime mytime(2007,1,1,0,0,0);
var1 = mytime;
SafeArrayPutElement(ar_v, &i, &var1);
i = 4;
var1 = (long)0;
SafeArrayPutElement(ar_v, &i, &var1);
_variant_t fields,values;
values.vt = VT_ARRAY|VT_VARIANT;
fields.vt = VT_ARRAY|VT_VARIANT;
fields.parray = ar_f;
values.parray = ar_v;
try
{
pRecordset->Update(fields,values);
}
catch(_com_error &ce)
{
Doc->ErrMessage(ce);
}
}
Робота з динамічними масивами в даній функції аналогічна роботі у функції OnZapis_Add1() кнопки <Добавление 1>. Інтерес представляє робота із класичними функціями дати й часу. У даній функції в друге поле таблиці otl_tab записується кількість секунд поточної дати. Функція time(), входом у яку є адреса на змінну time1 типу long (або time_t) повертає кількість секунд із 1970-го року. Функція localtime() перетворить цю змінну до змінного tm1 типу структури tm, у якій буде вміщуватись поточна дата.
Приведемо нижче опис структури tm.
struct tm
{
int tm_sec; /* Секунди */
int tm_min; /* Хвилини */
int tm_hour; /* Години (0--23) */
int tm_mday; /* День місяця (1--31) */
int tm_mon; /* Місяць (0--11) */
int tm_year; /* Рік (календарний рік мінус 1900) */
int tm_wday; /* День тижня (0--6; Неділя = 0) */
int tm_yday; /* День року (0--365) */
int tm_isdst; /* відмінний від 0 при денному світлі */
};
Таким чином, використовуючи роботу із класичною датою, у друге поле (kod) записується кількість секунд поточної дати (число від 0 до 59).
Приведемо текст функції відгуку OnZapis_Update2() по кнопці <Обновление 2>.
// кнопка <Обновление2>
// Відновлення поточного запису з використанням доступу до полів об'єкта