- •Ф.Ф. Павлов технология программирования
- •Санкт-Петербург
- •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.3. Создание диалоговых окон
базы оперативных данных
Для ведения диалога с файлом оперативных данных создадим следующие классы диалоговых окон: класс CAktDobDlg для добавления записей, класс CAktProsm для просмотра записей, класс CAktPoisk для поиска, замены и удаления записей.
Класс CaktDobDlg
1) Создание ресурса диалогового окна с идентификатором IDD_AKTDOBDLG.
Создать форму диалогового окна добавления записей файла Акт (рис. 10.5).
Акты-Добавление |
Таб. номер Вид работы _ Разряд Объем _ OK Cancel |
Рис. 10.5. Диалоговое окно добавления записей файла Акт
- Создать шаблон диалогового окна.
Для этого выполнить команду Project-> Add Resource и в появившемся окне Add Resource дважды щелкнуть на элементе Dialog в списке Resource Type. Появляется шаблон диалогового окна с идентификатором IDD_DIALOG1 и заголовком Dialog, а также панели инструментов Dialog Editor и Toolbox. В окне имеются две кнопки OK и Cancel. Отмасштабировать окно.
- В окне свойств окна Properties изменить значение свойства ID с IDD_DIALOG1 на IDD_AKTDOBDLG, а также – значение свойства Caption с Dialog на Акты - Добавление.
- Установить язык Русский.
Для этого в окне Resource View щелкнуть на идентификаторе IDD_AKTDOBDLG. В появившемся окне свойств Properties щелкнуть на свойстве Language и в списке выбрать язык Русский.
- Добавить в диалоговое окно элементы управления
Добавить четыре надписи (инструмент Static Text), четыре текстовых поля (Edit Control) и две кнопки. Щелкнуть сначала на инструменте панели инструментов Toolbox, а затем - в выбранной области диалогового окна.
Для изменения свойств элементов щелкнуть на элементе и в окне свойств Properties ввести значения: для надписей только в свойство Caption – Таб. Номер, Разряд, Вид работы, Объем; для текстовых полей в свойство ID – IDC_TABN, IDC_RAZRJAD, IDC_VIDRAB, IDC_OBJEM; для кнопки OK в свойство ID – IDC_AKTDOB и в поле Caption - OK; для кнопки Cancel – IDOK.
2) Создание класса диалогового окна.
- Открыть шаблон диалогового окна при отсутствии его. Для этого щелкнуть на вкладке Resource View или выполнить команду View->Resource View и в появившемся окне Resource View открыть папки Pr, Pr.rc, затем – Dialog и дважды щелкнуть на идентификаторе IDD_AKTDOBDLG.
- Щелкнуть правой кнопкой мыши на пустом месте диалогового окна и выполнить команду контекстного меню Add Class. Откроется окно мастера MFC Class Wizard.
- Ввести в поле Class name имя нового класса CAktDobDlg, в списке Base class выбрать имя CDialog, проверить наличие в свойстве Dialog ID идентификатора IDD_AKTDOBDLG, и затем щелкнуть на кнопке Finish.
3) Связывание элементов управления диалогового окна с
функциями-обработчиками сообщений
Связать кнопку OK.
- Открыть окно Class View и щелкнуть на имени класса CAktDobDlg. Появится окно свойств Properties.
- Щелкнуть на кнопке Events (События) и в появившемся списке идентификаторов раскрыть идентификатор IDC_AKTDOB (щелкнуть на символе +). Появляется список сообщений
- Выбрать элемент BN_CLICKED, а в комбинированном списке справа щелкнуть на команде <Add> OnBnClickedAktdob(). Прототип новой функции-обработчика будет добавлен в файл AktDobDlg.h, а ее текст – в файл AktDobDlg.cpp.
- Аналогично связать кнопку Cancel (IDOK) с функцией-обработчиком OnBnClickedOk().
4) Связывание переменных класса с элементами окна
Связать с текстовым полем Таб. номер.
- Запустить мастер создания переменных класса Add Member Variable Wizard. Для этого открыть окно Class View и выделить имя класса CAktDobDlg. Затем либо выполнить команду Project->Add Variable, либо щелкнуть правой кнопкой мыши на имени класса и выполнить команду контекстного меню Add->Add Variable. А можно также еще открыть диалоговое окно, щелкнуть правой кнопкой мыши на пустом месте окна и выполнить команду контекстного меню 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. Появляется содержимое файла AktDobDlg.cpp с функциями класса AktDobDlg.
- Аналогично связать с текстовыми полями Разряд (IDC_ RAZRJAD), Вид работы (IDC_VIDRAB), Объем (IDC_OBJEM) переменные класса m_strRazrjad, m_strVidrab, m_strObjem.
5) Добавление текстов функций-обработчиков в файлы AktDobDlg.h и AktDobDlg.cpp.
- В файл AktDobDlg.h:
#include “Akt.h”
...
class CAktDobDlg: public CDialog
{
public:
CAkt base;//объявление объекта класса CAkt в классе CActDobDlg
BOOL CheckInput();//ввод в текст. поля и проверка ввода
void ClearForm();//очистка формы документа
void Input(CAkt& base);//ввод данных из текст. полей в запись
- В файл AktDobDlg.cpp:
...
m_strObjem=(_T(“”));
{
base.Init();//вызов ф-ии Init класса CAkt
} //в конструкторе класса CAktDobDlg
...
void CAktDobDlg::OnBnClickedAktdob()
{
if (CheckInput())();//ввод в текст. поля и проверка ввода
{
Input(base);//ввод данных из текст. полей в запись
base.Sozdanie();//запись в файл и коррект. инд. массива
ClearForm();//очистка формы документа
}
}
void CAktDobDlg::Input(CAkt &base) );//ввод из текст. полей
{ // в запись
UpdateData(TRUE); //значения текст. полей – в перем. m_str
base.Tabn=m_strTabn;//значения перм. m_str – в запись
base.Razrjad=m_strRazrjad;//т.е. в переменные класса CAkt
base.VidRab=m_strVidrab;
base.Objem=m_strObjem;
}
void CAktDobDlg::ClearForm()//очистка формы документа
{
m_strTabn=""; //обнуление переменныз m_str…
m_strRazrjad="";
m_strVidrab="";
m_strObjem="";
UpdateData(FALSE); //значения m_str… - в текст. поля
}
BOOL CAktDobDlg::CheckInput()//проверка ввода
{
UpdateData(TRUE); //значения текст. полей – в перем. m_str
if(m_strTabn=="")
{
MessageBox("Введите Таб. номер", "Ошибка ввода",
MB_ICONEXCLAMATION);// ",//сообщение, заголовок
return FALSE; // восклицат. знак
}
if (m_strRazrjad=="")
{
MessageBox("Введите Разряд","Ошибка ввода",
MB_ICONEXCLAMATION);
return FALSE;
}
if (m_strVidrab=="")
{
MessageBox("Введите Вид работы","Ошибка ввода",
MB_ICONEXCLAMATION);
return FALSE;
}
if (m_strObjem=="")
{
MessageBox("Введите Объем","Ошибка ввода",//сообщение,
MB_ICONEXCLAMATION); //заголовок, восклицат. знак
return FALSE;
}
return TRUE;
}
void CAktDobDlg::OnBnClickedOk()
{
OnOk();
}
6) Добавление в файл MainFrm.cpp файл заголовков и текст функции вызова диалогового окна.
#include “AktDobDlg.h”
void OnAktsozd()
{
CAktDobDlg dlg;
..dlg.DoModal(); //вывод диалогового окна
}
7) Компиляция и запуск приложения.
Протестировать команду Создание меню Акты БД.
Класс CAktProsm
1) Создание ресурса диалогового окна с идентификатором IDD_AKTPROSM.
Создать следующую форму диалогового окна просмотра записей файла Акт (рис. 10.6).
Акты-Просмотр |
Таб. номер Вид работы _ Разряд Объем _ << < > >> Cancel Запись 0 из 0 |
Рис. 10.6. Диалоговое окно просмотра записей файла Акт
- Создать шаблон диалогового окна.
Для этого выполнить команду Project-> Add Resource и в появившемся окне Add Resource дважды щелкнуть на элементе Dialog в списке Resource Type.
Появляется шаблон диалогового окна с идентификатором IDD_DIALOG1 и заголовком Dialog, а также панели инструментов Dialog Editor и Toolbox. В окне имеются две кнопки OK и Cancel. Отмасштабировать окно.
- В окне свойств окна Properties изменить значение свойства ID с IDD_DIALOG1 на IDD_AKTPROSM, а также – значение свойства Caption с Dialog на Акт-Добавление.
- Установить язык Русский.
Для этого в окне Resource View щелкнуть на идентификаторе IDD_AKTPROSM. В появившемся окне свойств Properties щелкнуть на свойстве Language и в списке выбрать язык Русский.
- Добавить в диалоговое окно элементы управления.
Добавить четыре надписи (инструмент Static Text), четыре текстовых поля (Edit Control), четыре кнопки и надпись Запись 0 из 0.
Щелкнуть сначала на инструменте панели инструментов Toolbox, а затем - в выбранной области диалогового окна. Для изменения свойств элементов щелкнуть на элементе и в окне свойств Properties ввести значения:
- для надписей только в свойство Caption – Таб. Номер, Разряд, Вид работы, Объем; для текстовых полей в свойство ID – IDC_TABN, IDC_RAZRJAD, IDC_VIDRAB, IDC_OBJEM;
- для кнопки << в ID - IDC_AKTPROSM_NACH и в свойство Caption - символы << ; для кнопки < IDC_AKTPROSM_PRED и символ < ; для кнопки > - IDC_AKTPROSM_SLED и символ > ; для кнопки >> IDC_AKTPROSM_KONEC и символы >> , для кнопки Cancel – IDOK; для надписи Запись 0 из 0 – IDC_STATIC_NUMBER.
2) Создание класса диалогового окна.
- Открыть шаблон диалогового окна при отсутствии его. Для этого щелкнуть на вкладке Resource View или выполнить команду View->Resource View и в появившемся окне Resource View открыть папки Pr, Pr.rc, затем – Dialog и дважды щелкнуть на идентификаторе IDD_AKTPROSM.
- Щелкнуть правой кнопкой мыши на пустом месте диалогового окна и выполнить команду контекстного меню Add Class. Откроется окно мастера MFC Class Wizard.
- Ввести в поле Class name имя нового класса CAktProsm, в списке Base class выбрать имя CDialog, проверить наличие в свойстве Dialog ID идентификатора IDD_AKTPROSM, и затем щелкнуть на кнопке Finish.
3) Связывание элементов управления диалогового окна с
функциями-обработчиками сообщений
Связать кнопку <<.
- Открыть окно Class View и щелкнуть на имени класса CAktProsm. Появится окно свойств Properties.
- Щелкнуть на кнопке Events и в появившемся списке идентификаторов раскрыть идентификатор IDC_AKTPROSM_NACH (щелкнуть на символе +). Появляется список сообщений
- Выбрать элемент BN_CLICKED, а в комбинированном списке справа щелкнуть на команде <Add> OnBnClicked-AktprosmNach(). Прототип новой функции-обработчика будет добавлен в файл AktProsm.h, а ее текст – в файл AktProsm.cpp.
- Аналогично связать кнопку < с функцией-обработчиком OnBnClickedAktprosmPred(), кнопку > с функцией-обработчиком OnBnClickedAktprosmSled(),кнопку >> с функцией-обработчиком OnBnClickedAktprosmKonec(), кнопку Cancel (IDOK) с функцией-обработчиком OnBnClickedOk().
4) Связывание переменных класса с элементами окна.
Связать с текстовым полем Таб. номер.
- Запустить мастер создания переменных класса Add Member Variable Wizard. Для этого открыть окно Class View и выделить имя класса CAktProsm. Затем выполнить команду 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. Появляется содержимое файла AktProsm.cpp с функциями класса AktProsm.
- Аналогично связать с текстовыми полями Разряд (IDC_ RAZRJAD), Вид работы (IDC_VIDRAB), Объем (IDC_OBJEM) переменные класса m_strRazrjad, m_strVidrab, m_strObjem.
- Выполнить те же действия для надписи Запись 0 из 0 с получением переменной m_strNumber.
5) Добавление функции-обработчика OnInitDialog().
Необходимо создать функцию CAktProsm:OnIninDialog(), которая вызывается непосредственно перед отображением диалогового окна. В результате в текстовых полях выводятся значения полей первой записи файла Акты или сообщение, что файл пуст.
- Открыть окно Class View и щелкнуть на имени класса CAktProsm. Появится окно свойств Properties.
- Щелкнуть на кнопке Overrides (с изображением зеленого ромба) и в списке функций выбрать элемент OnInitDialog(), а в комбинированном списке справа щелкнуть на команде <Add> OnInitDialog(). Прототип новой функции-обработчика будет добавлен в файл AktProsm.h, а ее текст – в файл AktProsm.cpp.
- Заменить текст функции:
BOOL CAktProsm::OnInitDialog()
{
CDialog::OnInitDialog();
if (base.fact_kol==0)//base-объект класса CAkt, объявленный в
{ //классе CAktProsm, fact_kol-кол-во заполненных записей
MessageBox("Файл пуст”, //сообщение, заголовок,восклицат. знак
"Ошибка",MB_ICONEXCLAMATION);
EndDialog(1);//флажок закрытия файла, 1 – в DoModal()
}
else
{
fact_number=1; //фактич. номер не пустой записи (кл. CaktProsm)
int i=0;
do //цикл нахождения первой не пустой записи
{
base.ChtenieZap(i);
curr_rec_number=i; //текущий номер записи (класс CAktProsm)
i++;
}
while (base.Tabn=="");
Output(base); //вывод данных в текстовые поля
CString rec_number;
rec_number.Format("Запись 1 из %d",base.fact_kol); //преобраз.
m_strNumber=rec_number; //fact_kol из целого (d) в текст
UpdateData(FALSE); //значение m_strNumber - в текст. поле
}
return TRUE;
}
6) Добавление переменных в файл AktProsm.h.
#include “Akt.h”
class CAktProsm::public CDialod
{
public:
int curr_rec_number; //текущий номер записи
int fact_number; //фактический номер не пустой записи
CAkt base; )//base-объект класса CAkt
void Output(CAkt& base); //вывод записи в текст. поля
...
}
7) Добавление текстов функций-обработчиков в файл AktProsm.cpp.
...
m_strNumber=_T(“”);
{
base.Init(); //вызов Init в конструкторе класса CAktProsm
curr_rec_number=0; //ирициализ. текущего номера записи и
fact_number=-1; //инициализ. фактич. номера не пустой записи
} //в конструкторе класса CAktProsm
void CAktProsm::Output(CAkt& base)//вывод записи в текст. поля
{
m_strTabn=base.Tabn; //присваивание знач. полей записи
m_strRazrjad=base.Razrjad;//переменным m_str…
m_strVidrab=base.VidRab;
m_strObjem=base.Objem;
UpdateData(FALSE); //знач. перем. m_str… - в текст. поля
}
-Для кнопки << :
void CAktProsm::OnBnClickedAktprosmNach()
{
int i=0;
fact_number=1; //инициализ. фактич. номера не пустой записи
do //цикл нахождения начальной не пустой записи
{
base.ChtenieZap(i);
curr_rec_number=i;
i++;
}
while (base.Tabn=="");
Output(base); // вывод начальной записи в текст. поля
CString rec_number;
rec_number.Format("Запись 1 из %d",base.fact_kol); // преобраз.
m_strNumber=rec_number; //fact_kol из целого (d) в текст
UpdateData(FALSE); //значение m_strNumber - в текст. поле
}
//Для кнопки < :
void CAktProsm::OnBnClickedAktprosmPred()
{
int prev=curr_rec_number; //значения текущих переменных
int prev_fact=fact_number; //запоминаются в локальных перем.
int i=curr_rec_number-1; //i-текущий номер предыдущей записи
do //цикл нахождения предыдущей не пустой записи
{
if (i==-1)
{
curr_rec_number=-1;
break;
}
base.ChtenieZap(i);
if (base.Tabn!="")
fact_number--;
curr_rec_number=i;
i--;
}
while (base.Tabn=="");
if ((curr_rec_number==-1) || (fact_number<1))
{
MessageBox("Начало файла", "Ошибка", // сообщение,
MB_ICONEXCLAMATION); //заголовок, восклицат. знак
curr_rec_number=prev; //восстановление прежних значений
fact_number=prev_fact; //текущих перем. из локальных
}
else
{
base.ChtenieZap(curr_rec_number); //чтение предыдущей записи
Output(base); //вывод предыдущей записи в текст. поля
CString rec_number;
c_number.Format("Запись %d из %d", fact_number, //преобраз.
base.fact_kol); //fact_number и fact_kol из целых (d) в тексты
m_strNumber=rec_number;
UpdateData(FALSE); //значение m_strNumber - в текст. поле
}
}
//Для кнопки > :
void CAktProsm::OnBnClickedAktprosmSled()
{
int prev=curr_rec_number; //значения текущих переменных
int prev_fact=fact_number; //запоминаются в локальных перем.
int i=curr_rec_number+1; //i - текущий номер следующей записи
do //цикл нахождения следующей не пустой записи
{
base.ChtenieZap(i);
if (base.Tabn!="")
fact_number++;
curr_rec_number=i;
i++;
}
while (base.Tabn=="");
if (curr_rec_number>=base.kol)
{
MessageBox("Конец файла","Ошибка", // сообщение,
MB_ICONEXCLAMATION); //заголовок, восклицат. знак
curr_rec_number=prev; //восстановл. прежних значений
fact_number=prev_fact; //текущих перем. из локальных
}
else
{
base.ChtenieZap(curr_rec_number); //чтение текущей записи
Output(base); //вывод следующей записи в текст. поля
CString rec_number;
rec_number.Format("Запись %d из %d",fact_number, //преобраз.
base.fact_kol); //fact_number и fact_kol из целых (d) в тексты
m_strNumber=rec_number;
UpdateData(FALSE); //значение m_strNumber - в текст. поле
}
}
//Для кнопки >> :
void CAktProsm::OnBnClickedAktprosmKonec()
{
int last_rec_number=-1; //номер последней записи
for (int i=0;i<base.kol;i++) //цикл чтения всех записей кроме
{ //последней, т.е. нахождение последней записи
base.ChtenieZap(i);
if (base.Tabn!="")
last_rec_number=i;
}
base.ChtenieZap(last_rec_number);
Output(base); //вывод последней записи в текст. поля
CString rec_number;
rec_number.Format("Запись %d из %d", base.fact_kol, //преобраз.
base.fact_kol); //fact_kol и fact_kol из целых (d) в тексты
m_strNumber=rec_number;
curr_rec_number=base.kol-1;
fact_number=base.fact_kol;
UpdateData(FALSE); //значение m_strNumber - в текст. поле
}
8) Добавление в файл MainFrm.cpp текста функций вызова диалогового окна:
#include “AktProsm.h”
void CMainFrame::OnAktprosm()
{
CAktProsm dlg;
dlg.DoModal();//вывод диалогового окна
}
9) Компиляция и запуск приложения.
Протестировать просмотр записей файла Акты.
Класс CAktPoisk
1) Создание ресурса диалогового окна с идентификатором IDD_AKTPOISK.
Создать следующую форму диалогового окна поиска, замены, удаления записей файла Акт (рис. 10.7)
Акты-Поиск |
Таб. номер Вид работы _ Разряд Объем _ Таб. номер-поиск _ Поиск Следующая Замена/Удаление
|
Рис. 10.7. Диалоговое окно поиска, замены, удаления записей файла Акт
- Создать шаблон диалогового окна.
Для этого выполнить команду Project-> Add Resource.
В появившемся окне Add Resource дважды щелкнуть на элементе
Dialog в списке Resource Type Появляется шаб-
лон диалогового окна с идентификатором IDD_DIALOG1 и заголовком Dialog, а также панели инструментов Dialog Editor и Toolbox. В окне имеются две кнопки OK и Cancel. Отмасштабировать окно.
- В окне свойств окна Properties изменить значение свойства ID с IDD_DIALOG1 на IDD_AKTPOISK, а также – значение свойства Caption с Dialog на Акты-Поиск/Замена/Удаление.
- Установить язык Русский. Для этого в окне Resource View щелкнуть на идентификаторе IDD_AKTPOISK. В появившемся окне свойств Properties щелкнуть на свойстве Language и в списке выбрать язык Русский.
- Добавить в диалоговое окно элементы управления: пять надписи (инструмент Static Text), пять текстовых полей (Edit Control) и три кнопки. Щелкнуть сначала на инструменте панели инструментов Toolbox, а затем - в выбранной области диалогового окна. Для изменения свойств элементов щелкнуть на элементе и в окне свойств Properties ввести значения: для надписей только в свойство Caption – Таб. Номер, Разряд, Вид работы, Объем, Таб. номер - поиск; для текстовых полей в свойство ID – IDC_TABN, IDC_RAZRJAD, IDC_VIDRAB, IDC_OBJEM, IDC_TABN_POISK; для кнопки Поиск в свойство ID – IDC_AKT_POISK и в свойство Caption - Поиск; для кнопки Следующая в свойство ID – IDC_AKT_SLED и в свойство Caption – Следующая;. для кнопки Замена/Удаление в свойство ID – IDC_AKT_ZAM_UD и в свойство Caption – Замена/Удаление.
2) Создание класса диалогового окна.
- Открыть шаблон диалогового окна при отсутствии его. Для этого щелкнуть на вкладке Resource View или выполнить команду View->Resource View и в появившемся окне Resource View открыть папки Pr, Pr.rc, затем – Dialog и дважды щелкнуть на идентификаторе IDD_AKTPOISK.
- Щелкнуть правой кнопкой мыши на пустом месте диалогового окна и выполнить команду контекстного меню Add Class. Откроется окно мастера MFC Class Wizard.
- Ввести в поле Class name имя нового класса CAktPoisk, в списке Base class выбрать имя CDialog, проверить наличие в свойстве Dialog ID идентификатора IDD_AKTPOISK, и затем щелкнуть на кнопке Finish.
3) Связывание элементов управления диалогового окна с
функциями-обработчиками сообщений
Связать кнопку Поиск.
- Открыть окно Class View и щелкнуть на имени класса CAktPoisk. Появится окно свойств Properties.
- Щелкнуть на кнопке Events и в появившемся списке идентификаторов раскрыть идентификатор IDC_AKT_POISK (щелкнуть на символе +). Появляется список сообщений
- Выбрать элемент BN_CLICKED, а в комбинированном списке справа щелкнуть на команде <Add> OnBnClickedAktPoisk(). Прототип новой функции-обработчика будет добавлен в файл AktPoisk.h, а ее текст – в файл AktPoisk.cpp.
- Аналогично связать кнопку Следующая (IDC_AKT_SLED) с функцией-обработчиком OnBnClickedAktSled().Прототип новой функции-обработчика будет добавлен в файл AktPoisk.h, а ее текст – в файл AktPoisk.cpp.
- Аналогично связать кнопку Замена/Удаление (идентификатор IDC_AKT_ZAM_UD) с функцией-обработчиком OnBnClicked-AktZamUd(). Прототип новой функции-обработчика будет добавлен в файл AktPoisk.h, а ее текст – в файл AktPoisk.cpp.
4) Связывание переменных класса с элементами окна
Связать с текстовым полем Таб. номер.
- Запустить мастер создания переменных класса Add Member Variable Wizard. Для этого открыть окно Class View и выделить имя класса CAktPoisk. Затем выполнить команду 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. Появляется содержимое файла AktPoisk.cpp с функциями класса CAktPoisk.
- Аналогично связать с текстовыми полями Разряд (IDC_ RAZRJAD), Вид работы (IDC_VIDRAB), Объем (IDC_OBJEM), Таб. номер-поиск (IDC_TABN_POISK) переменные класса m_strRazrjad, m_strVidrab, m_strObjem, m_strTabnPoisk.
- Аналогично связать с кнопкой Замена/Удаление (IDC_AKT_ZAM_UD) переменную класса m_ctrlZamUd, причем в списке Category должно быть значение control, а в списке Variable type – CButton.
5) Добавление функции-обработчика OnInitDialog().
Необходимо создать функцию CAktPoisk::OnIninDialog(), которая вызывается непосредственно перед отображением диалогового окна.
- Открыть окно Class View и щелкнуть на имени класса CAkt-Poisk. Появится окно свойств Properties.
- Щелкнуть на кнопке Overrides (с изображением зеленого ромба) и в списке функций выбрать элемент OnInitDialog(), а в комбинированном списке справа щелкнуть на команде <Add> OnInitDialog(). Прототип новой функции-обработчика будет добавлен в файл AktPoisk.h, а ее текст – в файл AktPoisk.cpp.
- Заменить текст функции:
BOOL CAktPoisk::OnInitDialog()
{
CDialog::OnInitDialog(); //GetDlgItem-возвр. указатель на элем.
GetDlgItem(IDC_TABN)->EnableWindow(FALSE);//блокир.
GetDlgItem(IDC_RAZRJAD)->EnableWindow(FALSE);//элем.
GetDlgItem(IDC_VIDRAB)->EnableWindow(FALSE);//управл.
GetDlgItem(IDC_OBJEM)->EnableWindow(FALSE);
GetDlgItem(IDC_AKT_SLED)->EnableWindow(FALSE);
if (AktMode==3) //замена названия кнопки Зам/Уд на Удаление
m_ctrlZamUd.SetWindowText("Удаление");//присваив. кнопке
if (AktMode==1) //строковую константу
GetDlgItem(IDC_AKT_ZAM_UD)->ShowWindow(FALSE);
if ((AktMode==2)||(AktMode==3)) //Show-отсут. отображ. кнопки
GetDlgItem(IDC_AKT_ZAM_UD)->EnableWindow(FALSE);
return TRUE; //Enable – блокировка
}
6) Добавление текстов вспомогательных функций и функций-обработчиков в файл AktPoisk.cpp.
- Добавить:...
extern int AktMode; //объявление перем.,определение – в MainFrm
...
m_str...=_T(“”);
{
base.Init(); //вызов Init в конструкторе класса CAktPoisk
ind=0; //инициализ. индекса массива и
nomer=0; //инициализ. номера записи
} //в конструкторе класса CAktPoisk
- Добавить вспомогательные функции Output(), Input(), ClearForm(), CheckInput():
void CAktPoisk::Output(CAkt &base) //вывод записи в диалог. окно
{
m_strTabn=base.Tabn; //присваивание полей записи переменным
m_strRazrjad=base.Razrjad; //m_str…
m_strVidrab=base.VidRab;
m_strObjem=base.Objem;
UpdateData(FALSE); //значения перем. m_str… - в текстовые поля
}
void CAktPoisk::Input(CAkt &base) //ввод из текст. полей в запись
{
UpdateData(TRUE); //значения текст. полей – в переменные m_str…
base.Tabn=m_strTabn; //присваивание полям записи
base.Razrjad=m_strRazrjad; // значения m_str…
base.VidRab=m_strVidrab;
base.Objem=m_strObjem;
}
void CAktPoisk::ClearForm() //очистка окна
{
m_strTabn=""; //обнуление переменных m_str…
m_strRazrjad="";
m_strVidrab="";
m_strObjem="";
m_strTabnPoisk="";
UpdateData(FALSE); //значения перем. m_str… - в текстовые поля
}
BOOL CAktPoisk::CheckInput() //проверка ввода данных
{
UpdateData(TRUE); //значения текстовых полей – в перем. m_str…
if(m_strTabn=="")
{
MessageBox("Введите Таб. номер","Ошибка ввода",
MB_ICONEXCLAMATION); //выводимое значение,
return FALSE; //заголовок, восклицат. знак
}
if (m_strRazrjad=="")
{
MessageBox("Введите Разряд","Ошибка ввода",
MB_ICONEXCLAMATION);
return FALSE;
}
if (m_strVidrab=="")
{
MessageBox("Введите код работы","Ошибка ввода",
MB_ICONEXCLAMATION);
return FALSE;
}
if (m_strObjem=="")
{
MessageBox("Введите Объем","Ошибка ввода",
MB_ICONEXCLAMATION);
return FALSE;
}
return TRUE;
}
- Добавить для кнопки Поиск текст функции-обработчика OnBnClickedAktPoisk().
void CAktPoisk::OnBnClickedAktPoisk()
{
ind=0; //индекс найденного элемента индексного массива
nomer=0; //номер найденной записи
UpdateData(TRUE); //значение текстового поля – в перем. m_str…
if(m_strTabnPoisk=="")
{
MessageBox("Введите Таб. номер-поиск","Ошибка ввода",
MB_ICONEXCLAMATION); //выводимое значение,
return; //заголовок, восклицат. знак
}
ind = base.poisk_ind(m_strTabnPoisk,ind,nomer); //поиск в инд.
if (ind!=-1) //массиве номера записи (nomer) и индекса (ind)
{ //запись найдена
base.ChtenieZap(nomer); //чтение найденной записи
Output(base); //вывод записи в диалоговое окно
ind++;
GetDlgItem(IDC_TABN)->EnableWindow(TRUE);//доступн.
GetDlgItem(IDC_RAZRJAD)->EnableWindow(TRUE);//элем.
GetDlgItem(IDC_VIDRAB)->EnableWindow(TRUE);//управл.
GetDlgItem(IDC_OBJEM)->EnableWindow(TRUE);
GetDlgItem(IDC_AKT_SLED)->EnableWindow(TRUE);
GetDlgItem(IDC_AKT_ZAM_UD)->EnableWindow(TRUE);
}
else //запись не найдена
{
MessageBox("Запись не найдена","Ошибка",
MB_ICONEXCLAMATION);
ind=0;
nomer=0;
ClearForm(); //очистка формы
return;
}
}
- Добавить для кнопки Следующая текст функции-обработчика OnBnClickedAktSled().
void CAktPoisk::OnBnClickedAktSled()
{
ind = base.poisk_ind(m_strTabnPoisk,ind,nomer); //поиск в инд.
if (ind!=-1) //массиве номера записи (nomer) и индекса (ind)
{ //запись найдена
base.ChtenieZap(nomer); //чтение найденной записи
Output(base); //вывод записи в диалоговое окно
ind++;
}
else//запись не найдена
{
MessageBox("Запись не найдена","Ошибка",
MB_ICONEXCLAMATION);
ind=0;
ClearForm();
GetDlgItem(IDC_AKT_SLED)->EnableWindow(FALSE);
GetDlgItem(IDC_AKT_ZAM_UD)->EnableWindow(FALSE);
return; //блокировка кнопок
}
- Добавить для кнопки Замена/Удаление текст функции-обработчика OnBnClickedAktZamUd().
void CAktPoisk::OnBnClickedAktZamUd()
{
if (AktMode==2) //замена
{
int rez;
rez=MessageBox("Корректировать запись?","Корректировка",
MB_OKCANCEL | MB_ICONQUESTION);
if (rez==IDCANCEL) //если нажата клавиша CANCEL, то return
return; //если – OK, то продолжение
Input(base); //ввод из текстовых полей в запись
if (!CheckInput()) //CheckInput()-проверка ввода
return;
base.Zamena(nomer); //запись замененной записи в файл
ClearForm(); //очисткаформы, EnableWindow-блокировка кнопок
GetDlgItem(IDC_AKT_SLED)->EnableWindow(FALSE);
GetDlgItem(IDC_AKT_ZAM_UD)->EnableWindow(FALSE);
ind=0;
nomer=0;
}
if (AktMode==3) //удаление
{
int rez;
rez=MessageBox("Удалить запись?","Удаление",
MB_OKCANCEL | MB_ICONQUESTION);
if (rez==IDCANCEL)
return;
base.Udalenie(nomer); //удаление записи и коррек. инд. массива
ClearForm();//очисткаформы, EnableWindow-блокировка кнопок
GetDlgItem(IDC_AKT_SLED)->EnableWindow(FALSE);
GetDlgItem(IDC_AKT_ZAM_UD)->EnableWindow(FALSE);
ind=0;
nomer=0;
}
}
7) Добавление прототипов вспомогательных функций в файл AktPosk.h.
#include “Akt.h”
class CAktPoisk : public CDialog
{
public:
CAkt base; //объявление объекта класса CAkt в классе CAktPoisk
int ind; //индекс элемента индексного массива
int nomer; //номер записи
void Output(CAkt &base); //вывод записи в диалоговое окно
void Input(CAkt &base); //ввод из текстовых полей в запись
void ClearForm(); //очистка формы
BOOL CheckInput(); //проверка ввода данных с клавиатуры
...
8) Добавление текстов функций вызова диалоговых окон в файл MainFrm.cpp.
#include “AktPoisk.h”
void CMainFrame::OnAktpoisk()
{
AktMode=1;
CAktPoisk dlg;
dlg.DoModal();
}
void CMainFrame::OnAktzam()
{
AktMode=2;
CAktPoisk dlg;
dlg.DoModal();
}
void CMainFrame::OnAktud()
{
AktMode=3;
CAktPoisk dlg;
dlg.DoModal();
}