- •Кафедра вычислительных систем и программирования высокоуровневые методы информатики и программирования
- •Санкт-Петербург
- •1.Общие положения по организации
- •2. Программирование информационной мини-системы управления методом процедурно-ориентированного программирования (тема 2).
- •2.1. Постановка задачи и проектирование программы
- •2.2. Реализация программы
- •Vyvod(cout, client);
- •Vyvod(outprintf, client);
- •Void dobzap(fstream &dobf)
- •Int tabn;
- •Int operator!(); //элемент-функция класса
- •Int akt::operator!()
- •4. Блоки лабораторных работ по разделу «Объектно-
- •4.1. Блок по теме «Создание Windows-приложений»
- •4.2. Блоки по теме «Управление многооконными
- •4.2.1. Блок «Ввод/вывод информации»
- •Int k;//номер текущей вводимой строки
- •Invalidate();
- •If (!cursor)//если курсор еще не создан, надо создать.
- •Int X,y;//объявить переменные для хранения координат мыши
- •4.2.2. Меню, акселераторы, кнопки
- •Invalidate();
- •Invalidate(); }
- •4.2.3. Диалоговые окна
- •Invalidate();
- •4.2.4. Управление файловой обработкой
- •Invalidate(); //при вводе символа вид объявл. Не действительным
- •Void AddText(uint text) {data.AppendChar(text);} //доб. В конец стр.
- •Invalidate(); //при вводе символа вид объявл. Не действительным
- •Void Serialize(cArchive& archive);//прототип переопред. Функции
- •Void cData::Serialize(cArchive& archive)
- •If (archive.IsStoring())
- •Implement_serial(cData, cObject, 0)//класс,баз. Класс,номер
- •Invalidate();
- •Invalidate();
- •5.2. Блок по теме «Поддержка баз данных»
- •If (m_Add) //если true, то добавление записи
- •5.3. Блок по теме «Программирование для Internet»
- •If (!pIs) //2 проверка подключения компъютера к Internet
- •If (!pIs) //3 проверка подключения
- •If (!pFc) //5 проверка соединения с ftp-узлом
- •6. Рекомендуемая литература
- •7. Содержание
Implement_serial(cData, cObject, 0)//класс,баз. Класс,номер
//...
Вызов Serialize() нового класса внутри Serialize() документа
void Lab4_2Doc::Serialize(CArchive& ar)
{
DataObject.Serialize(ar);
}
Скомпилировать, запустить и протестировать приложение.
lab4_3 «Файловая обработка с классом CFile»
Цель работы - использование класса CFile для диалоговых приложений и для файлов любых типов.
Приложения на базе диалогового окна не имеют класса документа и встроенного меню File с командами Save As, Open, New. Часто необходимы нестандартные операции файловой обработки, не соответствующие технологии сохранения и восстановления данных.
Класс CFile имеет все функции, необходимые для обработки файлов любых типов с последовательным или прямым доступом.
Создадим приложение на базе диалогового окна.
Начальное состояние окна – два текстовых поля и кнопка с надписью Запись и чтение файла. В первом верхнем текстовом поле имеется строка с результатами олимпиады: “1 Иванов 20 2 Петров 19 3 Сидоров 18”, второе нижнее текстовое поле – пустое.
При щелчке на кнопке Запись и чтение файла строка записывается в файл spisok.dat, затем читается из файла и выводится во второе текстовое поле.
Для создания приложения lab4_3 выполнить следующие этапы.
Создание проекта
Создать проект lab4_3 (Диалоговое приложение).
Объявление переменных для хранения данных
Спроектируем содержимое файла данных spisok.dat с фиксированной длиной записи 20 байтов:
Номер записи Место Фио Баллы
0 1 Иванов 20
1 2 Петров 19
2 3 Сидоров 18
Объявим для хранения данных в ОП массив char OutString[3][20], а для вывода - временный массив char InString[20].
// lab4_3Dlg.h
protected:
HICON m_hicon;
char OutString[3][20];
char InString[20];
Добавление элементов управления в диалоговое окно
- Открыть диалоговое окно при его отсутствии. Для этого щелкнуть на вкладке Resource View, открыть папки lab4_3, lab4_3.rc, Dialog и дважды щелкнуть на идентификаторе IDD_LAB4_3_Dialog. Появляется диалоговое окно. Убрать надпись “TODO: Place dialog controls here”, щелкнув на ней и нажав клавишу Delete.
- Установить русский язык. Щелкнуть правой кнопкой на идентификаторе IDD_LAB4_3_DIALOG и в окне свойств Properties выбрать свойство Language. В появившемся комбинированном списке справа щелкнуть на значении Русский.
- Добавить в диалоговое окно элементы управления: два текстовых поля и кнопку. Щелкнуть сначала на инструменте Edit Control (текстовое поле) панели инструментов Toolbox, а затем - в выбранной области диалогового окна. Появляется текстовое поле с надписью Sample edit box. Изменить размеры текстового поля, щелкнув в текстовом поле и пользуясь появившимися маркерами размеров (рамка с квадратами). Аналогично добавить второе текстовое поле и кнопку.
- Изменить надписи элементов управления. Требуется изменить надпись кнопки Button1 на Запись и чтение файла. Щелкнуть правой кнопкой на кнопке, затем – на Properties, и ввести в качестве свойства Caption текст «Запись и чтение файла». Новая надпись вводится в кнопку.
Связывание элементов управления диалогового окна с
функциями-обработчиками сообщений
Требуется связать сообщение кнопки Запись и чтение файла с функцией – обработчиком.
- Открыть окно Class View и щелкнуть на имени класса Clab4_3Dlg. Появится окно свойств Properties.
- Щелкнуть на кнопке желтая молния Event (События) и в появившемся списке идентификаторов раскрыть узел IDC_BUTTON1 (щелкнуть на символе +). Появляется список сообщений
- Выбрать элемент BN_CLICKED, а в комбинированном списке справа от идентификатора щелкнуть на команде <Add> OnBnClickedButton1. Прототип новой функции-обработчика OnBnClickedButton1() будет добавлен в файл Dlg.h, а ее текст – в файл Dlg.cpp.
Связывание переменных класса с элементами окна
Требуется связать переменную m_text1 с первым текстовым полем, а переменную m_text2 – со вторым полем.
- Запустить мастер Add Member Variable Wizard. Для этого открыть окно Class View и выделить имя класса Clab4_3Dlg. Затем щелкнуть правой кнопкой мыши на имени класса CDlg и выполнить команду контекстного меню Add->Add Variable.
- Связать переменную m_text1 с первым текстовым полем. В появившемся окне Add Member Variable Wizard-lab 4_3 выполнить следующее: установить флажок Control variable; в списке Control ID выбрать идентификатор текстового поля IDC_EDIT1; в списке Category выбрать значение value; в списке Variable type появится CString; ввести в поле Variable name строку m_text1; в списке Access проверить наличие элемента public; и наконец, щелкнуть на кнопке Finish. Аналогично связать переменную m_text со вторым полем.
- Вывести строку в верхнем текстовом поле. Для размещения исходных данных в массиве OutString воспользуемся функцией OnInitDialog(). Соединим 3 записи в одну строку m_text1 для вывода строки в верхнем текстовом поле.
//файл lab4_3Dlg.cpp
#include <string>
BOOL Clab4_3Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
strcpy(OutString[0], "1 Иванов 20 ");
strcpy(OutString[1], "2 Петров 19 ");
strcpy(OutString[2], "3 Сидоров 18 ");
m_text1=CString(OutString[0])+CString(OutString[1])+\
CString(OutString[2]);
UpdateData(false); }
Запись в файл
Создать в функции-обработчике сообщения о нажатии кнопки объект OutFile класса CFile с режимом записи и записать на диск три записи файла (3 элемента массива):
void Clab4_3Dlg::OnBnClickedButton1()
{
char s[11]=”spisok.dat”;
CFile OutFile ((CString)s, CFile::modeCreate|CFile::modeWrite);
for (int i=0; i<3;i++)
{
OutFile.Write(OutString[i],20);
}
OutFile.Close();
}
Чтение файла
Создать еще в функции-обработчике сообщения о нажатии кнопки объект InFile класса CFile с режимом чтение и прочитать с диска 3 записи файла. Каждая запись сначала попадает в InString[]. Затем записи соединяются в одну строку m_text2.
void Clab4_3Dlg::OnBnClickedButton1()
{//...
OutFile.Close();
CFile InFile((CString)s, CFile::modeRead);
for(int i=0;i<3;i++)
{
InFile.Seek(20*i,CFile::begin);//используется условно (в уч. целях)
int N=InFile.Read(InString,20);
m_text2 +=CString(InString);
}
UpdateData(false);
InFile.Close();}
Скомпилировать, запустить и протестировать приложение.
5. Блоки лабораторных работ по разделу
«Прогрессивные технологии программирования»
5.1. Блок по теме «Технология ActiveX»
labCont «Создание приложения-контейнера»
Цель работы - создание приложения в виде контейнера ActiveX. В качестве задачи возьмем приложение lab3_2, посвященное созданию диалогового окна с кнопкой и текстовым полем.
Алгоритм работы данного приложения labCont - следующий:
Щелкнуть на включенной заранее в меню новой команде Dialog. Появляется диалоговое окно со стандартными кнопками OK и Cancel, с добавленной кнопкой с именем Выход и с добавленным пустым текстовым полем.
Щелкнуть на кнопке Выход. В текстовом поле появляется строка “Диалоговое окно”.
Щелкнуть на кнопке OK. Диалоговое окно исчезает, появляется главное окно приложения, в котором выводится содержимое текстового поля “Диалоговое окно”.
Для создания приложения–контейнера ActiveX необходимо выполнить следующие этапы.
Создание проекта
Создать новый проект: задать имя проекта labCont, на 1-ом этапе выбрать MDI-приложение, на 2-ом этапе выбрать Container, остальные – без изменений по умолчанию, щелкнув на Finish.
Сравнить меню приложения labCont с приложением lab3_2:
- Вызвать окно View->Resource и открыть папку labCont.rc, затем - Menu. Появились два новых меню. Первое меню - IDR_labContTYPE_CNTR_IP (CNTR – это согласные от слова container, IP – (in place) редактирование на месте). Это означает, что объект, содержащийся в контейнере, может быть отредактирован на месте. Для редактирования объединяются меню контейнера и сервера.
- Щелкнуть дважды на этом меню. Появляется окно с командами нового меню. Это окно будет выводиться во время редактирования объекта на месте, т.е. в окне контейнера.
- Щелкнуть дважды на втором меню IDR_labContTYPE. Выводится окно с командами меню. Открыть меню Edit. Появились новые 4 команды: Paste Special – пересылка объекта в контейнер из буфера обмена Clipboard; Insert New Object – помещение объекта в контейнер с помощью диалогового окна Insert Object; Links – определение метода обновления связанного объекта с помощью диалогового окна Links; <<OLE VERBS GO HERE>> - вывод в меню Edit всплывающего меню с командами, специфичными для выбранного типа объекта.
Включение новой команды Dialog в меню
- Открыть редактор меню, щелкнув на команде View->Resource View и открыв папку labCont.rc, затем – Menu. Дважды щелкнуть на строке IDR_labContTYPE. Выводятся команды нового меню.
- Добавить новую команду Dialog. Новая команда должна быть между командами View и Windows. Щелкнуть на пустой команде Type Here, ввести строку Dialog и нажать Enter. Перетащить с помощью мыши команду меню Dialog в позицию после View. Открыть окно Properties для новой команды меню Dialog, щелкнув сначала правой кнопкой на команде Dialog, а затем - на пункте Properties. Проверить наличие в свойстве Caption значения Dialog. Установить свойству Popup значение false и проверить идентификатор ID_Dialog.
- Подключить команду Dialog к приложению. Для этого открыть редактор меню, затем - папку labCont.rc, затем – Menu. Дважды щелкнуть на строке IDR_labContTYPE. Выводятся команды меню. Щелкнуть правой кнопкой на команде Dialog и в открывшемся контекстном меню выбрать команду Add Event Handler (добавить обработчик события). Откроется окно Event Handler Wizard – labCont. Выбрать в списке Message Type сообщение Command, а в списке Class list – ClabContView. В поле Function handler name появится имя функции-обработчика OnDialog(). Щелкнуть на кнопке Add and Edit, и в окне редактора кода откроется шаблон созданной функции.
Создание ресурса диалогового окна
- Создать шаблон диалогового окна. Для этого выполнить команду Project-> Add Resource и в появившемся окне Add Resource дважды щелкнуть на элементе Dialog в списке Resource Type (или выбрать Dialog и щелкнуть на New). Появляется шаблон диалогового окна с именем IDD_DIALOG1 и панели инструментов Dialog Editor и Toolbox. В окне имеются 2 кнопки: OK и Сancel.
- Установить язык Русский. Для этого в окне Resource View открыть папку Dialog и щелкнуть на идентификаторе IDD_DIALOG1. В появившемся окне свойств Properties щелкнуть на свойстве Language и в списке справа выбрать значение Русский.
- Добавить в диалоговое окно элементы управления: текстовое поле и кнопку. Щелкнуть сначала на инструменте Edit Control (текстовое поле) панели инструментов Toolbox, а затем - в выбранной области диалогового окна. Появляется текстовое поле с надписью Sample edit box. Изменить размеры текстового поля, щелкнув в текстовом поле и пользуясь появившимися маркерами размеров (рамка с квадратами). Аналогично добавить кнопку, щелкнув на инструменте Button , а затем в области диалогового окна. Появляется кнопка с надписью Button1.
- Изменить надписи элементов управления. Требуется изменить надпись кнопки Button1 на Выход. Для изменения свойств диалогового окна открыть окно Properties (свойства), щелкнув правой кнопкой в свободной области окна, затем – на пункте Properties. Щелкнуть на кнопке и ввести в качестве свойства Caption текст Выход. Новая надпись вводится в кнопку.
- Проверить в свойстве ID идентификатор IDC_BUTTON1, присвоенный кнопке редактором диалоговых окон. Аналогично проверить идентификатор IDC_EDIT1, присвоенный текстовому полю.
Создание класса диалогового окна
- Открыть шаблон диалогового окна при отсутствии его. Для этого щелкнуть на вкладке Resource View или выполнить команду View->Resource View и в появившемся окне Resource View открыть папку labCont.rc, затем – Dialog и дважды щелкнуть на идентификаторе IDD_DIALOG1.
- Щелкнуть правой кнопкой мыши на пустом месте диалогового окна и выполнить команду контекстного меню Add Class. Откроется окно мастера MFC Class Wizard.
- Ввести в поле Class name имя нового класса CDlg, в списке Base class выбрать имя базового класса диалоговых окон CDialog, проверить наличие в поле Dialog ID идентификатора IDD_DIALOG1, и затем щелкнуть на кнопке Finish.
Связывание элементов управления диалогового окна с
функциями-обработчиками сообщений
Требуется связать сообщение кнопки Output с функцией – обработчиком.
- Открыть окно Class View и щелкнуть правой кнопкой на имени класса CDlg. Появится окно свойств Properties.
- Щелкнуть на кнопке Event (с изображением желтой молнии) и в появившемся списке идентификаторов раскрыть узел IDC_ BUTTON1 (щелкнуть на символе +). Появляется список сообщений
- Выбрать элемент BN_CLICKED, а в комбинированном списке справа от идентификатора щелкнуть на команде <Add> OnBnClickedButton1. Прототип новой функции-обработчика OnBnClickedButton1() будет добавлен в файл Dlg.h, а ее текст – в файл Dlg.cpp. Функция OnBnClickedButton1() будет вызываться при нажатии кнопки Output.
Связывание переменных класса с элементами окна
- Запустить мастер создания переменных класса Add Member Variable Wizard. Для этого открыть окно Class View и выделить имя класса CDlg. Затем выполнить команду Project->Add Variable, либо щелкнуть правой кнопкой на имени класса CDlg и выполнить команду Add->Add Variable.
- В появившемся окне Add Member Variable Wizard-labCont выполнить следующее: установить флажок Control variable; в списке Control ID выбрать идентификатор текстового поля IDC_EDIT1; в списке Category выбрать значение value; в списке Variable type появится CString; ввести в поле Variable name строку m_text; в списке Access проверить наличие элемента public; и наконец, щелкнуть на кнопке Finish. Появляется содержимое файла Dlg.cpp с функциями класса CDlg.
- Задать содержимое текстового поля в функции-обработчике OnBnClickedButton1():
void CDlg :: OnBnClickedButton1 ()
{
m_text = “Диалоговое окно”;
}
- Обновить текстовое поле. Для чтения или записи содержимого элемента используется вызов функции UpdateData ():
void CDlg :: OnBnClickedButton1 ()
{
m_text = “Диалоговое окно”;
UpdateData (false);
}
Вызов функции UpdateData(false) с параметром false заносит в текстовое поле значение переменной m_text, вызов с параметром true присваивает переменной m_text содержимое текстового поля. Итак, строка перенесена в текстовое поле.
Переопределение функции для кнопки ОК
- Связать сообщение кнопки ОК с функцией-обработчиком.
Для этого открыть окно Class View и щелкнуть на имени класса CDlg. В окне свойств Properties щелкнуть на кнопке желтая молния Event (События) и в появившемся списке идентификаторов раскрыть узел IDOK (щелкнуть на символе +). Появляется список сообщений. Выбрать элемент BN_CLICKED, а в комбинированном списке справа от идентификатора щелкнуть на команде <Add> OnBnClickedOk. Прототип новой функции-обработчика OnBnClickedOk() будет добавлен в файл Dlg.h, а ее текст – в файл Dlg.cpp. Функция OnBnClickedOk() будет вызываться при нажатии кнопки OK. На экране появится текст функции-обработчика OnBnClickedOk ().
- Занести в переменную m_text содержимое текстового поля. Для этого вызывается функция UpdateData (true):
void CDlg :: OnBnClickedOk ()
{//
UpdateData (true);
OnOK ();
}
Отображение диалогового окна
- Сообщить классу вида о существовании класса диалогового окна. Для этого включить в него файл заголовков класса CDlg - Dlg.h:
// labContView.cpp
# include “labContView.h”
# include “Dlg.h”
- Создать объект класса Dlg в классе вида:
void ClabContView :: OnDialog ()
{
CDlg dlg;
}
- Отобразить диалоговое окно на экране. Для этого вызвать функцию DoModal():
void ClabContView :: OnDialog ()
{//
CDlg dlg;
int result = dlg. DoModal(); //вызов диалогового окна и возврат
}//IDOK
- Проверить нажатие кнопки ОК:
void ClabContView :: OnDialog ()
{
CDlg dlg;
int result = dlg. DoModal();
if (result = = IDOK)
{ }
}
- Получить указатель на документ:
void ClabContView :: OnDialog ()
{//...
if (result == IDOK)
{
ClabContDoc* pDoc = GetDocument();
ASSERT_VALID (pDoc);
}
}
- Создать в документе объект класса c именем StringData:
// labContDoc.h
class ClabContDoc :: public CDocument
{ ...
public:
CString StringData;
}
- Поместить текст из переменной m_text в объект StringData:
void ClabContView :: OnDialog ()
{
if (result == IDOK)
{//...
ASSERT_VALID (pDoc);
pDoc -> StringData = dlg. m_text;
}
}
- Предусмотреть вызов Invalidate(). Вывод данных – в функции OnDraw (). Но сначала надо предусмотреть стирание прежней строки перед перерисовкой новой. Для этого – вызов функции класса вида Invalidate(). Эта функция и вызывает OnDraw ().
void ClabContView :: OnDialog ()
{//
if (
result == IDOK)
{//...
pDoc -> StringData = dlg. m_text;