- •Ф.Ф. Павлов технология программирования
- •Санкт-Петербург
- •090103 – Организация и технология защиты информации
- •Содержание
- •Раздел 1 Создание программных приложений………………..…..7
- •Тема 1. Технология программирования. Основные понятия........7
- •Тема 3. Объектно-ориентированный подход
- •Тема 4 Объектно-ориентированное проектирование
- •Раздел 3 «Перспективные направления в области создания технологий программирования» содержит 3 темы: технология ActiveX, технологии доступа к базам данных, технологии для работы в Internet.
- •Раздел 1. Создание программных приложений
- •Тема 1. Технология программирования.
- •1.1. Этапы эволюции технологии программирования
- •1.2. Жизненный цикл и этапы разработки программ
- •1.3. Постановка задачи и спецификация программы
- •1.4. Проектирование и реализация программы
- •2.1 Структура программы
- •2.2 Структура функции
- •2.3. Типы данных
- •2.4. Средства управления экраном и клавиатурой
- •2.5 Средства управления файлами
- •Тема 3. Объектно-ориентированный подход
- •3.1. Сущность объектно-ориентированного подхода
- •3.2. Инкапсуляция
- •3.3. Наследование
- •3.4. Полиморфизм
- •Тема 4. Объектно-ориентированное проектирование
- •4.1. Постановка задачи и определение спецификаций
- •4.2. Проектирование структуры программы
- •4.3. Проектирование файлов интерфейсов классов
- •4.4. Проектирование файлов реализации классов
- •Раздел 2. Особенности программирования в Windows
- •5.1. Система окон разработки и система меню
- •5.2. Библиотека классов mfc
- •5.3. Сообщения – реакция на события
- •Тема 6. Создание Windows-приложений
- •6.1. Консольные приложения
- •6.4. Диалоговые приложения
- •Тема 7. Ввод-вывод информации
- •7.1. Управление клавиатурой
- •7.2. Управление курсором
- •7.3. Управление мышью
- •Тема 8. Программирование интерфейса приложений
- •8.1. Система меню
- •8.2. Система диалоговых окон и элементов управления
- •Тема 9. Программирование файловой обработки
- •9.1. Файловая обработка объектов класса mfc
- •9.2. Файловая обработка объектов классов пользователя
- •9.3. Файловая обработка с классом cFile
- •Тема 10. Технология программирования в Widows
- •10.1. Проектирование структуры программы,
- •10.2. Создание классов предметной области
- •10.3. Создание диалоговых окон
- •10.4. Создание диалоговых окон базы справочных
- •10.5. Создание ведомости результатов
- •Раздел III. Прогрессивные технологии
- •Тема 11. Технология ActiveX
- •11.1. Концепция технологии ActiveX
- •11.2. Создание приложения-контейнера
- •11.3. Создание приложения-сервера
- •Тема 12. Поддержка баз данных
- •12.1. Технологии доступа к данным
- •12.2. Создание приложения с базой данных
- •Тема 13. Программирование для Internet
- •13.1. Технологии для работы в Internet
- •13.2. Приложение в стиле браузера
- •13.3. Приложение с протоколом http в WinInet
- •13.4. Приложение с протоколом ftp в WinInet
- •Раздел 1 «Создание программных приложений»:
- •Раздел 2 «Особенности программирования в Windows»:
- •Раздел 3 «Прогрессивные технологии программирования»:
- •Извлечение из рабочей программы дисциплины
- •Утверждаю
- •Рабочая программа
- •Технология программирования
- •Санкт-Петербург
- •4. Содержание разделов и тем дисциплины
- •Раздел 1. Создание программных приложений
- •Тема 1. Технология программирования. Основные
- •Тема 4. Технология объектно-ориентированного
Тема 10. Технология программирования в Widows
10.1. Проектирование структуры программы,
создание проекта и меню
В теме 4 рассмотрены этапы объектно - ориентированного программирования на примере информационной системы управления: постановка задачи и определение спецификаций, проектирование программы. Этап реализации (программирования) рассмотрим в этой теме.
Начальная модель построения программы на рис. 10.1.
akt cena
\ /
ved
Рис. 10.1. Начальная модель построения программы
Реорганизованная иерархия классов видна на рис. 10.2.
CIndex
/ \
CAkt CCena
Рис. 10.2. Иерархия классов мини-системы
Меню мини-системы должно выглядеть, как на рис. 10.3.
Pr |
File Акты Расценки Ведомости View Help Имена файлов Создание Создание Создание Status Bar About Exit Просмотр Просмотр Поиск Поиск Замена Замена Удаление Удаление |
Рис. 10.3. Меню мини-системы
Классами, описывающими диалог, будут 8 классов диалоговых окон:
- CAktDobDlg–реализует создание записей актов,
- CAktProsm–реализует просмотр записей актов,
- CAktPoisk–реализует поиск,замену,удаление записей,
- CCenaDobDlg–реализует создание записей расценок,
- CCenaProsm–реализует просмотр записей расценок,
- CCenaPoisk–реализует поиск,замену,удаление записей,
- CFilesDlg-реализует выбор имен файлов базы данных,
- CVedomDlg-реализует расчет и вывод ведомости.
Создание проекта приложения
1) Выбор типа приложения:
в списке Project Types - Visual C++ Project MFC, а в списке Templates – MFC Application. Ввести имя проекта Pr
2) Настройка приложения.
3) Удаление дочернего окна (класс CChildFrame) .
4) Установление языка Русский.
Создание меню
1) Вызов редактора меню.
2) Удаление команд главного меню.
3) Добавление в меню File команды Имена файлов.
4) Подключение команды Имена файлов к приложению.
5) Добавление нового меню Акты после меню File.
6) Добавление команд для меню Акты.
7) Подключение команд для меню Акты к приложению.
8) Аналогично добавление меню Расценки
9) Аналогично добавление меню Ведомость
10) Компиляция и запуск приложения.
Протестировать меню.
10.2. Создание классов предметной области
Класс CIndex
Класс CIndex предназначен для создания базы данных с индексной организацией, позволяющей использовать прямой доступ к записям базы данных. Класс CIndex имеет файл заголовков Index.h и файл кодов Index.cpp. Создать новый файл заголовков Index.h. Для добавления нового файла в проект необходимо: выбрать команду File->Add New Item и в появившемся окне щелкнуть в Templates на Header File (.h). Ввести имя файла Index.h и щелкнуть на кнопке Open. Откроется пустое окно для ввода текста файла. Аналогично создать файл кодов Index.cpp, только в Templates выбрать C++ File (.cpp).
//Файл заголовков Index.h –см. п. 4.2.
//Файл кодов Index.cpp
#include "stdafx.h"
#include "Pr.h"
#include "Index.h"
CIndex::CIndex()
{
}
CIndex::~CIndex()
{
}
void CIndex::init_ind(int i,CString kl)
{
index[i].kluch=kl;
index[i].nomer=i;
return;
}
void CIndex::init_kol(int k)
{
kol=k;
}
int CIndex::dob_ind(CString kl)
{
int nom;
for (int i=0;i<kol;i++)
if (index[i].kluch=="")
{
index[i].kluch=kl;
return(index[i].nomer);
}
index[kol].kluch=kl;
index[kol].nomer=kol;
nom=kol;
kol++;
return(nom);
}
int CIndex::poisk_ind(CString kl,int i,int& nomer)
{
while (i<kol)
{
if (index[i].kluch!="")
{
if (kl==index[i].kluch)
{
nomer=index[i].nomer;
return(i);
}
}
i++;
}
return(-1);
}
void CIndex::cor_ind(int i,CString kl)
{
index[i].kluch=kl;
return;
}
Класс CAkt
Класс CAkt предназначен для создания и ведения файла оперативных данных: учет выполнения работ рабочими.
//Файл Akt.h – см. п. 4.2.
//Файл Akt.cpp
#include "stdafx.h"
#include "Pr.h"
#include "Akt.h"
extern CString AktFile; //объявл. переменной имени файла
CAkt::CAkt()
{
Tabn="";
Razrjad="";
VidRab="";
Objem="";
fact_kol=0;
}
CAkt::~CAkt()
{
}
void CAkt::Zamena(int nomer)
{
ZapisZap(nomer);
cor_ind(nomer,Tabn);
}
void CAkt::Udalenie(int nomer)
{
Tabn="";
ZapisZap(nomer);
cor_ind(nomer,Tabn);
}
void CAkt::Init() //создание индексного массива
{
int pr=0; //признак пустого файла
int i=0; //открытие на чтение или создание нового файла
CFile file(AktFile, CFile::modeRead|CFile::modeCreate |CFile::
modeNoTruncate);//если файл сущ.,его содержимое не усекается
DWORD nom; //32-битовое целое без знака
nom=file.GetLength(); //получение длины файла
nom=nom/35; //nom-количество записей, 35-размер записи
file.Close();
for(i=0;i<int(nom);i++)
{
ChtenieZap(i); //чтение записи
init_ind(i,Tabn); //корректировка элемента индексного массива
if (Tabn!="")
{
fact_kol++;
pr=1; //признак не пустого файла
}
}
init_kol(nom);
return;
}
void CAkt::Sozdanie()//запись в файл и коррект. индексного массива
{
int nom;
nom=dob_ind(Tabn);//поиск в инд. массиве номера пустой записи
ZapisZap(nom); //запись записи в файл
return;
}
void CAkt::ChtenieZap(int nomer)//чтение записи из файла
{ //открытие на чтение
CFile file(AktFile, CFile::modeRead | CFile::modeNoTruncate);
char buf[10]; //если файл сущ.,его содержимое не усекается
try //обработка исключений
{
file.Seek(nomer*35,CFile::begin);
file.Read(buf,10);
Tabn=CString(buf);
file.Read(buf,10);
Razrjad=CString(buf);
file.Read(buf,5);
VidRab=CString(buf);
file.Read(buf,10);
Objem=CString(buf);
}
catch (CFileException *e) //обработка ошибок работы с файлом
{
char pMsg[255];
if(e->GetErrorMessage(pMsg,255))//сообщение об исключении
AfxMessageBox(pMsg); //глоб. функция вывода сообщения
}
file.Close();
return;
}
void CAkt::ZapisZap(int nomer) //запись записи в файл
{
CFile file(AktFile, CFile::modeWrite|CFile::modeCreate|
CFile:: modeNoTruncate);
try
{
file.Seek(nomer*35,CFile::begin);
file.Write(LPCTSTR(Tabn),10); //указатель строки
file.Write(LPCTSTR(Razrjad),10);
file.Write(LPCTSTR(VidRab),5);
file.Write(LPCTSTR(Objem),10);
}
catch (CFileException *e)
{
char pMsg[255];
if(e->GetErrorMessage(pMsg,255))
AfxMessageBox(pMsg);
}
file.Close();
return;
}
Класс CCena
Класс CCena предназначен для создания и ведения базы справочных данных: расценки работ.
//Файл Cena.h – см. п. 4.2.
//Файл Cena.cpp
#include "stdafx.h"
#include "Pr.h"
#include "Cena.h"
extern CString CenaFile; //объявл. переменной имени файла
CCena::CCena()
{
Vid="";
Rascenka="";
fact_kol=0;
}
CCena::~CCena()
{
}
void CCena::ZapisZap(int nomer)
{
CFile file(CenaFile, CFile::modeWrite|CFile::modeCreate|
CFile::modeNoTruncate);
try
{
file.Seek(nomer*15,CFile::begin);
file.Write(LPCTSTR(Vid),5);
file.Write(LPCTSTR(Rascenka),10);
}
catch (CFileException *e)
{
char pMsg[255];
if(e->GetErrorMessage(pMsg,255))
AfxMessageBox(pMsg);
}
file.Close();
return;
}
void CCena::ChtenieZap(int nomer)
{
CFile file(CenaFile, CFile::modeRead | CFile::modeNoTruncate);
char buf[10];
try
{
file.Seek(nomer*15,CFile::begin);
file.Read(buf,5);
Vid=CString(buf);
file.Read(buf,10);
Rascenka=CString(buf);
}
catch (CFileException *e)
{
char pMsg[255];
if(e->GetErrorMessage(pMsg,255))
AfxMessageBox(pMsg);
}
file.Close();
return;
}
void CCena::Sozdanie()
{
int nom;
nom=dob_ind(Vid);
ZapisZap(nom);
return;
}
void CCena::Init()
{
int pr=0;
int i=0;
CFile file (CenaFile, CFile::modeRead|CFile::modeCreate|
CFile::modeNoTruncate);
DWORD nom;
nom=file.GetLength();
nom=nom/15;
file.Close();
for(i=0;i<int(nom);i++)
{
ChtenieZap(i);
init_ind(i,Vid);
if (Vid!="")
{
fact_kol++;
pr=1;
}
}
init_kol(nom);
return;
}
void CCena::Zamena(int nomer)
{
ZapisZap(nomer);
cor_ind(nomer,Vid);
}
void CCena::Udalenie(int nomer)
{
Vid="";
ZapisZap(nomer);
cor_ind(nomer,Vid);
}
Класс CFilesDlg
Класс CFilesDlg предназначен для выбора имен файлов базы данных: файла оперативных данных (Акты) и файла справочных данных (Расценки).
Создание ресурса диалогового окна с идентификатором IDD_FILESDLG.
Создать форму окна выбора имен файлов (см. рис. 10.4).
Файлы Базы Данных |
Файл Акт Akt1.akt Выбор файла Акт Файл Расценки Cena1.cen Выбор файла Расценки OK Cancel |
Рис. 10.4. Диалоговое окно выбора имен файлов
- Создать шаблон диалогового окна.
Для этого выполнить команду Project-> Add Resource и в появившемся окне Add Resource дважды щелкнуть на элементе Dialog в списке Resource Type. Появляется шаблон диалогового окна с идентификатором IDD_DIALOG1 и заголовком Dialog, а также панели инструментов Dialog Editor и Toolbox. В окне имеются две кнопки OK и Cancel. Отмасштабировать окно.
- В окне свойств окна Properties изменить значение свойства ID с IDD_DIALOG1 на IDD_FILESDLG, а также – значение свойства Caption с Dialog на Файлы Базы Данных.
- Установить язык Русский. Для этого в окне Resource View щелкнуть на идентификаторе IDD_FILESDLG. В появившемся окне свойств Properties щелкнуть на свойстве Language и в списке выбрать язык Русский.
- Добавить в диалоговое окно элементы управления: две надписи (инструмент Static Text), два текстовых поля (Edit Control) и две кнопки (Button). Щелкнуть сначала на инструменте панели инструментов Toolbox, а затем - в выбранной области диалогового окна. Для изменения свойств элементов щелкнуть на элементе и в окне свойств Properties ввести значения: для надписей только в свойство Caption – Файл Акты и Файл Расценки; для текстовых полей в свойство ID – IDC_FILEAKT и IDC_FILECENA; для кнопки выбора файла Акты в свойство ID – IDC_BUTTONAKT, в свойство Caption – Выбор файла Акты; для кнопки выбора файла Расценки в свойство ID – IDC_BUTTONCENA, в свойство Caption – Выбор файла Расценки; для кнопки OK в свойство ID – IDC_BUTTONOK; для кнопки Cancel – IDC_BUTTONCANCEL.
2) Создание класса диалогового окна.
- Открыть шаблон диалогового окна при отсутствии его. Для этого щелкнуть на вкладке Resource View или выполнить команду View->Resource View и в появившемся окне Resource View открыть папки Pr, Pr.rc, затем – Dialog и дважды щелкнуть на идентификаторе IDD_FILESDLG.
- Щелкнуть правой кнопкой мыши на пустом месте диалогового окна и выполнить команду контекстного меню Add Class. Откроется окно мастера MFC Class Wizard.
- Ввести в поле Class name имя нового класса CFilesDlg, в списке Base class выбрать имя базового класса диалоговых окон CDialog, проверить наличие в поле Dialog ID идентификатора IDD _ FILESDLG, и затем щелкнуть на кнопке Finish.
3) Связывание элементов управления диалогового окна с
функциями-обработчиками сообщений
Связать кнопку Выбор файла Акты.
- Открыть окно Class View и щелкнуть на имени класса CFilesDlg. Появится окно свойств Properties.
- Щелкнуть на кнопке желтая молния Events (События) и в появившемся списке идентификаторов раскрыть идентификатор IDC_BUTTONAKT (щелкнуть на символе +). Появляется список сообщений
- Выбрать элемент BN_CLICKED, а в комбинированном списке справа щелкнуть на команде <Add> OnBnClickedButtonakt. Прототип новой функции-обработчика будет добавлен в файл FilesDlg.h, а ее текст – в файл FilesDlg.cpp.
- Аналогично связать три остальные кнопки: кнопку Выбор файла Расценки (IDC_BUTTONCENA) с функцией-обработчиком OnBnClickedButtoncena(), кнопку OK (IDC_BUTTONOK) с функцией-обработчиком OnBnClickedButtonok(), кнопку Cancel (IDC_ BUTTONCANCEL) с функцией-обработчиком OnBnClickedButtoncancel().
4) Связывание переменных класса с элементами окна
Связать с текстовым полем Файл Акты.
- Запустить мастер создания переменных класса Add Member Variable Wizard. Для этого открыть окно Class View и выделить имя класса CFilesDlg. Затем либо выполнить команду Project->Add Variable, либо щелкнуть правой кнопкой мыши на имени класса и выполнить команду контекстного меню Add->Add Variable. А можно также еще открыть диалоговое окно, щелкнуть правой кнопкой мыши на пустом месте окна и выполнить команду контекстного меню Add Variable.
- В появившемся окне Add Member Variable Wizard-Pr выполнить следующее: установить флажок Control variable; в списке Control ID выбрать идентификатор текстового поля IDC_FILEAKT; в списке Category выбрать значение value; в списке Variable type появится CString; ввести в поле Variable name строку m_strFileakt; в списке Access проверить наличие элемента public; и наконец, щелкнуть на кнопке Finish. Появляется содержимое файла CFilesDlg.cpp с функциями класса CFilesDlg.
- Аналогично связать с текстовым полем Файл Расценки (IDC_FILECENA) переменную класса m_strFilecena.
5) Определение и объявление переменных – имен файлов БД.
-Добавить в файл MainFrm.cpp определение переменных – имен файлов Базы Данных.
CString AktFile=”akt1.akt”; //определение переменных
CString CenaFile=”cena1.cen”; //внешний класс памяти
int AktMode=0;
int CenaMode=0;
-Добавить в файл FilesDlg.cpp объявление переменных – имен файлов Базы Данных.
extern CString AktFile;
extern CString CenaFile;
6) Добавление функции-обработчика OnInitDialog().
Необходимо создать функцию CFilesDlg:OnIninDialog(), которая вызывается перед отображением диалогового окна. В результате в текстовых полях выводятся имена файлов.
- Открыть окно Class View и щелкнуть на имени класса CFilesDlg. Появится окно свойств Properties.
- Щелкнуть на кнопке Overrides (с изображением зеленого ромба) и в списке функций выбрать элемент OnInitDialog(), а в комбинированном списке справа щелкнуть на команде <Add> OnInitDialog(). Прототип новой функции-обработчика OnInitDialog() будет добавлен в файл FilesDlg.h, а ее текст – в файл FilesDlg.cpp.
- Заменить текст функции.
BOOL CFilesDlg::OnInitDialog()
{
CDialog()::OnInitDialog();
m_strFileakt=AktFile;//имена файлов присваиваются переменным
m_strFilecena=CenaFile;//m_str…класса
UpdateData(FALSE);//заносит в текст. поле значения перем. m_str.
return TRUE;
}
7) Добавление текстов функций-обработчиков в файл CFilesDlg.
Для кнопки Выбор файла Акты :
void CFilesDlg::OnBnClickedButtonakt()
{
CString strAkt;
static char Filter[]="Akt Files(*.akt)|*.akt||";//фильтр имен ф.
CFileDialog dialog(TRUE, "*.akt", strAkt, OFN_ HIDEREAD-
ONLY | OFN_OVERWRITEPROMPT, Filter);//откр. диал. окна
if (dialog.DoModal()==IDOK)//вывод диалог. окна
{
strAkt=dialog.GetPathName();//возвр. имя файла с указ. пути
m_strFileakt=strAkt;
UpdateData(FALSE);//заносит в текст. поле знач. перем.m_str
}
}
Для кнопки Выбор файла Расценки:
void CFilesDlg::OnBnClickedButtoncena()
{
CString strCena;
static char Filter[]="Cena Files (*.cen)|*.cen||";
CFileDialog dialog (TRUE,"*.cen",strCena,OFN_HIDEREAD
ONLY | OFN_OVERWRITEPROMPT,Filter);
if (dialog.DoModal()==IDOK)
{
strCena=dialog.GetPathName();
m_strFilecena=strCena;
UpdateData(FALSE);//значения перем. m_str… в текстовое поле
}
}
Для кнопки OK:
void CFilesDlg::OnBnClickedButtonok()
{
UpdateData(TRUE);// знач. текст. поля - в переменную m_str…
AktFile=m_strFileakt;….//знач. перем. m_str…присваиваются
CenaFile=m_strFilecena; // перем. файла MainFrm.cpp
EndDialog(1);//устан. флажка закрытия файла, 1 – в DoModal()
}
Для кнопки Cancel:
void CFilesDlg::OnBnClickedButtoncancel()
{
OnOK();//фиксирование данных блока диалога и обновление
} //переменных приложения
8) Добавление в файл MainFrm.cpp текста функции вызова диалогового окна и подключение файла заголовков FilesDlg.h:
#include “FilesDlg.h”
...
void CMainFrame::OnFilename()
{
CFilesDlg dlg;
dlg.DoModal();//вывод диалогового окна и удаление после диалога
}
9) Компиляция и и тестирование приложения.