Создание диалоговых окон базы справочных

Класс CAktPoisk

Класс CAktProsm

Класс CaktDobDlg

Базы оперативных данных

Для ведения диалога с файлом оперативных данных создадим следующие классы диалоговых окон: класс CAktDobDlg для добавления записей, класс CAktProsm для просмотра записей, класс CAktPoisk для поиска, замены и удаления записей.

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

Протестировать команду Создание меню Акты БД.

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

Протестировать просмотр записей файла Акты.

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();

}


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



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