Данных
Для ведения диалога с файлом Расценки создадим следующие классы диалоговых окон: класс 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) Компиляция и запуск приложения.
Протестировать приложение на контрольном примере.
При необходимости отрегулировать размеры полей статических элементов управления для вывода текстовых строк с результатами расчетов.