Создание ведомости результатов

Данных

Для ведения диалога с файлом Расценки создадим следующие классы диалоговых окон: класс CCenaDobDlg для создания/добавления записей, класс CCenaProsm для просмотра записей, класс CCenaPoisk для поиска, замены и удаления записей.

Расценки-Добавление
  Вид работы Расценка _ OK Cancel

Рис. 10.8. Диалоговое окно добавления записей файла

Расценки-Просмотр
  Вид работы Расценка _ << < > >> Cancel Запись 0 из 0

Рис. 10.9. Диалоговое окно просмотра записей файла

Расценки-Поиск
  Вид работы Расценка _ Вид работы-поиск _ Поиск Следующая Замена/Удаление

Рис. 10.10. Диалоговое окно поиска, замены, удаления записей файла Расценки

Выполнить действия аналогично созданию диалога с файлом оперативных данных Акты.

Для ведения диалога получения ведомости результатов создадим класс CVedomDlg.

1). Создание ресурса диалогового окна с идентификатором IDD_VEDOMDLG.

Создать следующую форму диалогового окна ведомости результатов (рис. 10.11).

Ведомость
Таб. номер Разряд _ Вид работы Объем Стоимость … … … … … … Итого: Таб. номер-поиск Создать Отмена

Рис. 10.11. Диалоговое окно ведомости результатов.

- Создать шаблон диалогового окна. Для этого выполнить команду Project-> Add Resource и в появившемся окне Add Resource дважды щелкнуть на элементе Dialog в списке Resource Type. Появляется шаблон диалогового окна с идентификатором IDD_DIALOG1 и заголовком Dialog, а также панели инструментов Dialog Editor и Toolbox. В окне имеются две кнопки OK и Cancel. Отмасштабировать окно.

- В окне свойств окна Properties изменить значение свойства ID с IDD_DIALOG1 на IDD_VEDOMDLG, а также – значение свойства Caption с Dialog на Ведомость стоимости работ.

- Установить язык Русский. Для этого в окне Resource View щелкнуть на идентификаторе IDD_VEDOMDLG. В появившемся окне свойств Properties щелкнуть на свойстве Language и в списке выбрать язык Русский.

- Добавить в диалоговое окно элементы управления: семь надписей (три – названия текстовых полей и четыре – названия статических элементов управления) инструментом Static Text, три текстовых поля (Edit Control), две кнопки (Button) и четыре статических элемента управления для вывода текстовых строк с результатами расчетов (Static Text). Отрегулировать размеры полей статических элементов управления с помощью маркеров. Для добавления элемента управления щелкнуть сначала на инструменте панели инструментов Toolbox, а затем - в выбранной области диалогового окна. Для изменения свойств элементов щелкнуть на элементе и в окне свойств Properties ввести значения: для надписей только названия в свойство Caption – Таб. Номер, Разряд, Вид работы, Объем, Стоимость, Итого:, Таб. Номер-поиск; для текстовых полей в свойство ID – IDC_TABN, IDC_RAZRJAD, IDC_TABN_POISK; для кнопки Создать в свойство ID – IDC_VED_SOZD и в свойство Caption - Создать; для кнопки Отмена в свойство ID – IDOK и в свойство Caption – Отмена; для статических элементов управления только в свойство ID соответственно – IDC_VIDRAB, IDC_OBJEM, IDC_STOIM, IDC_RESULT.

2) Создание класса диалогового окна.

- Открыть шаблон диалогового окна при отсутствии его. Для этого щелкнуть на вкладке Resource View или выполнить команду View->Resource View и в появившемся окне Resource View открыть папки Pr, Pr.rc, затем – Dialog и дважды щелкнуть на идентификаторе IDD_VEDOMDLG.

- Щелкнуть правой кнопкой мыши на пустом месте диалогового окна и выполнить команду контекстного меню Add Class. Откроется окно мастера MFC Class Wizard.

- Ввести в поле Class name имя нового класса CVedomDlg, в списке Base class выбрать имя CDialog, проверить наличие в свойстве Dialog ID идентификатора IDD_VEDOMDLG, и затем щелкнуть на кнопке Finish.

3) Связывание элементов управления диалогового окна с

функциями-обработчиками сообщений

Связать кнопку Создать.

- Открыть окно Class View и щелкнуть на имени класса CVedomDlg. Появится окно свойств Properties.

- Щелкнуть на кнопке Events и в появившемся списке идентификаторов раскрыть идентификатор IDC_VED_SOZD (щелкнуть на символе +). Появляется список сообщений

- Выбрать элемент BN_CLICKED, а в комбинированном списке справа щелкнуть на команде <Add> OnBnClickedVedSozd(). Прототип новой функции-обработчика будет добавлен в файл VedSozd.h, а ее текст – в файл VedSozd.cpp.

4) Связывание переменных класса с элементами окна

Связать с текстовым полем Таб. номер.

- Запустить мастер создания переменных класса Add Member Variable Wizard. Для этого открыть окно Class View и выделить имя класса CVedomDlg. Затем выполнить команду Project->Add Variable.

- В появившемся окне Add Member Variable Wizard-Pr выполнить следующее: установить флажок Control variable; в списке Control ID выбрать идентификатор текстового поля IDC_TABN; в списке Category выбрать значение value; в списке Variable type появится CString; ввести в поле Variable name строку m_strTabn; в списке Access проверить наличие элемента public; и наконец, щелкнуть на кнопке Finish. Появляется содержимое файла VedomDlg.cpp с функциями класса CVedomDlg.

- Аналогично связать с текстовыми полями Разряд (IDC_ RAZRJAD) и Таб. номер-поиск (IDC_TABN_POISK) переменные класса m_strRazrjad и m_strTabnPoisk.

- Аналогично связать статический элемент управления Итого: с IDC_RESULT и получить переменную m_strResult; проследить, чтобы в списке Categorie был Value и в Variable type – CString.

- Аналогично связать статический элемент управления (заголовок Вид работы) с IDC_VIDRAB и получить переменную m_strVidrab; проследить, чтобы в списке Categorie был Value и в Variable type – CString. Получить также для этого статического элемента переменную m_ctrlVidrab и проследить, чтобы в списке Categorie был Control и в Variable type – CStatic.

-Аналогично связать статический элемент управления (заголовок Объем) с IDC_OBJEM и получить переменную m_strObjem; проследить, чтобы в списке Categorie был Value и в Variable type – CString. Получить также для этого статического элемента переменную m_ctrlObjem и проследить, чтобы в списке Categorie был Control и в Variable type – CStatic.

-Аналогично связать статический элемент управления (заголовок Стоимость) с IDC_STOIM и получить переменную m_strStoim; проследить, чтобы в списке Categorie был Value и в Variable type – CString. Получить также для этого статического элемента переменную m_ctrlStoim и проследить, чтобы в списке Categorie был Control и в Variable type – CStatic.

5) Добавление функции-обработчика OnInitDialog().

Необходимо создать функцию CVedomDlg::OnIninDialog(), которая вызывается непосредственно перед отображением диалогового окна.

- Открыть окно Class View и щелкнуть на имени класса CVedomDlg. Появится окно свойств Properties.

- Щелкнуть на кнопке Overrides (с изображением зеленого ромба) и в списке функций выбрать элемент OnInitDialog(), а в комбинированном списке справа щелкнуть на команде <Add> OnInitDialog(). Прототип новой функции-обработчика будет добавлен в файл VedomDlg.h, а ее текст – в файл VedomDlg.cpp.

- Заменить текст функции:

BOOL CVedomDlg::OnInitDialog()

{

CDialog::OnInitDialog(); //активизир. элементов управления окна

GetDlgItem(IDC_TABN)->EnableWindow(FALSE); //блокир

GetDlgItem(IDC_RAZRJAD)->EnableWindow(FALSE); //полей

return TRUE;

}

6) Добавление переменных и текста функций–обработчиков в файлы VedomDlg.h и VedomDlg.cpp.

- В файл VedomDlg.h:

#include “Akt.h”

#include “Cena.h”

class CVedomDlg: public CDialog

{

public:

CAkt base;

CCena cena;

CString AddSpaces(CString st,int len); //доб. пробелов в поле=10

int StringToInt(CString st); //преобразование String в int

}

- В файл VedomDlg.cpp:

void CVedomDlg::OnBnClickedVedSozd()

{

UpdateData(TRUE); //значение текст. поля – в перем. m_str…

if (m_strTabnPoisk=="")

{

MessageBox("Введите Таб. номер","Ошибка ввода",

MB_ICONEXCLAMATION);

return;

}

m_strVidrab="";

m_strResult="";

m_strObjem="";

m_strStoim="";

UpdateData(FALSE); //значения переменных m_str… в текст. поля

GetDlgItem(IDC_TABN)->EnableWindow(TRUE); //доступность

GetDlgItem(IDC_RAZRJAD)->EnableWindow(TRUE); //полей

int nomer;

base.Init();

cena.Init();

int cur_result=0;

int total_result=0;

int pr=0; //признак 0 - запись не найдена

int nomer1;

for (nomer1=0; (nomer1=base.poisk_ind (m_strTabnPoisk,

nomer1,

nomer))!=-1; nomer1++)

{

base.ChtenieZap(nomer); //чтение найденной записи в Акт

m_strTabn=base.Tabn; //присваив. полей записи перем. m_str…

m_strRazrjad=base.Razrjad;

UpdateData(FALSE); //значения переменных – в текст. поля

int nomer2=0;

if ((nomer2=cena.poisk_ind(base.VidRab,nomer2,nomer))!=-1)

{

cena.ChtenieZap(nomer); //чтение найденной записи в Расценки

pr=1; //признак 1 - запись найдена

cur_result=(StringToInt(base.Objem))*

(StringToInt(cena.Rascenka));

CString rez;

m_ctrlVidrab.GetWindowText(rez);//получ.из элем. упр. текст

m_strVidrab=rez+AddSpaces(base.VidRab,10);

m_ctrlObjem.GetWindowText(rez);

m_strObjem=rez+AddSpaces(base.Objem,10);

m_ctrlStoim.GetWindowText(rez);

CString cur_rez;

cur_rez.Format(“%i”,cur_result);//преобразование из int в текст

m_strStoim=rez+AddSpaces(cur_rez,10);

UpdateData(FALSE); //значения переменных m_str… в текст. поля

total_result+=cur_result;

} //if((nomer2…

else

{

CString st;

st=”Вид работы “+base.VidRab+” не найден в файле”;

MessageBox(st,”Ошибка ввода”,MB_ICONEXCLAMATION);

return;

}

} //for…

if ((nomer1==-1)&& (!pr))

{

Cstring st;

st=»Таб. Номер «+m_strTabnPoisk+» не найден в файле»;

MessageBox(st,”Ошибка ввода”,MB_ICONEXCLAMATION);

return;

}

Cstring st;

st.Format(“%i”,total_result);

m_strResult=”Итого: “+st;

UpdateData(FALSE); значения переменных m_str… в текст. поля

}

int CVedomDlg::StringToInt(CString st)//преобраз. текста в целое

{

int ten=1;

int rez=0;

int Char;

st.TrimLeft();//удаление ведущих пробелов из строки

st.TrimRight();//удаление хвостовых пробелов из строки

for (int i=st.GetLength()-1;i>=0;--i)

{

Char=st.GetAt(i); //считыв. символа в заданной позиции

if (Char==45) //45 - код ‘-‘, 48 - код ‘0’, 49 – код ‘1’ …

return rez*(-1);

Char=Char-48;

rez=rez+(Char*ten);

ten=ten*10;

}

return rez;

}

CString CVedomDlg::AddSpaces(CString st, int len) //доб. пробелов

{ //в размер поля = 10

CString rez;

rez=st;

int string_len=st.GetLength();

for (int i=string_len;i<=len;i++)

rez+=" ";

return rez;

}

7) Добавление в файл MainFrm.cpp текста функции вызова диалогового окна.

...

#include “VedomDlg.h”

void CMainFrame::OnVedsozd()

{

CVedomDlg dlg;

dlg.DoModal();

}

8) Компиляция и запуск приложения.

Протестировать приложение на контрольном примере.

При необходимости отрегулировать размеры полей статических элементов управления для вывода текстовых строк с результатами расчетов.


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



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