Создание диалоговых окон

Класс CFilesDlg

Класс CCena

Try

Класс CAkt

Класс CIndex

Создание классов предметной области

Создание меню

Создание проекта и меню

Проектирование структуры программы,

В теме 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) Компиляция и запуск приложения.

Протестировать меню.

Класс 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 предназначен для создания и ведения файла оперативных данных: учет выполнения работ рабочими.

//Файл 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);

{

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 предназначен для создания и ведения базы справочных данных: расценки работ.

//Файл 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 предназначен для выбора имен файлов базы данных: файла оперативных данных (Акты) и файла справочных данных (Расценки).

Создание ресурса диалогового окна с идентификатором 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) Компиляция и и тестирование приложения.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: