Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование в среде Visual C++ 6. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
ктов меню выбираете исходя из удобства их запоминания. Мастер MFC AppWizard создаст им соответствующие ID адреса, которые можно прочесть спомощью окна Properties вменю View. Теперь этим пунктам нужно организовать об­рабатывающие программы. Это делается как обычно. Вы­зываем ClassWizard изменю View, Открываем класс пред­ставления … View. Выбираем вкладку MessageMaps, всписке Object IDs находим нужный нам ID адрес, в окне Messages активизируем пункт OMAND, а затем справа пункт Add Function исогласиться спредлагаемым именем этой функ­ции. Теперь достаточно раскрыть текст этой функции и на­писать операторы, изменяющие наши переменные, которые в рабочей программе нужно запоминать. В принципе эти изменения могут произойти в функции OnDraw. Для это­го необходимы некоторые дополнительные операторы. Так, если в этой функции используются идентификаторы клас­са документов, то необходимо из функции OnDraw пере­копировать оператор ASSERT_VALID (pDoc). Это будет первый оператор нашей функции. Затем следуют операторы обработка данных, затем соответствующим идентифика­торам класса документов присвоить значения переменных других классов. Это делается с помощью операторов типа GetDocument () ->mm=Xt, где mm— идентификатор класса документов, аXt— идентификатор переменной другого клас­са. Для переменных класса документов эти операторы ненуж­ны, так как в программе OnDraw подобный оператор уже имеется. И последним оператором является оператор флага изменения документа GetDocument () ->SetModiedFlag (). Этот оператор помечает класс документов, что произошли изменения переменных, которые следует запоминать. Иесли при закрытии нашей разработанной программы операции
— 91 —
запоминания непроизведены, наэкране монитора появится сообщение, что переменные несохранены ипоявится запрос, нужноли их запоминать. Это стандартная процедура вовсех программах Microso. И последним оператором является Invalidate (). Эта функция очищает окно монитора ипередаёт управление функции OnDraw ().
Всю остальную работу по сохранению ивосстановлению переменных берёт на себя функция Serialize. Её начальный текст очень простой:
void C… CDoc:: Serialize (CArchive& ar)
{
if (ar.IsStoring ())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
Здесь стоит условный оператор: если нужно сохранить данные, товместо первого комментария поместить оператор типа ar<<m1<<m2<<… mN, где m1, m2,… mN— идентифи­каторы переменных, которые следует сохранить. Аar— обо­значение архива. Знак << указывает направление движения информации: из оперативной памяти в архив. В качестве архива используется файл, имя которого запрашивает окно, появляющееся после активизирования пунктов меню типа Save—  или Save As—  .
Второй оператор выглядит также, только направление движения информации из архива в оперативную память
— 92 —
компьютера: ar>>m1>>m2>>… mN. Этот оператор будет вы­полняться после активизирования пункта меню типа Open— . Наименование файла выбираете сами изпредстав­ленного списка, который был сформирован при сохранении данных.
Недостатком метода Serialize является то, что здесь воз-
можен только последовательный доступ кфайлу. Кроме того, сохранению-восстановлению подлежат только простые иден­тификаторы или отдельные элементы массивов типа BYTE, WORD, Int, LONG, DWORD, oat иdouble. Список иденти­фикаторов воператорах функции void C… CDoc:: Serialize (CArchive& ar) достаточно короткий, поэтому этим методом можно сохранять-восстанавливать только небольшие масси­вы переменных. Если необходимо сохранять-восстанавли­вать большие объёмы информации, пригоден метод класса CFile, позволяющий работать сфайлами напрямую.
10.2. Работа сфайлами
В состав MFC AppWizard включён достаточно мощный
класс CFile, позволяющий напрямую выполнять различные операции сфайлами нажёстком диске компьютера, которые приведены втаблице 10.1.
Для работы сфайлами синтаксис конструктора имеет вид: CFile <Имя экземпляра> (“<Имя файла>”, Флаг1|Флаг2|…
ФлагN);
Для удобства и запоминания имени экземпляра класса
удобнее выбрать имя типа le, le1, le2 итак далее. Каждое имя экземпляра однозначно будет связано вданном проекте сименем файла иего полного пути. Поэтому каждому имени файла должно быть только одно имя экземпляра, иначе ком­пилятор выдаст ошибку независимо оттого, открыт или за-
— 93 —
крыт соответствующий файл. 1, 2 ит. д. определяют режим доступа кданному файлу. Возможные флаги режимов доступа приведены втаблице 10.2.
В аргументах экземпляра класса может быть несколько непротиворечащих друг другу флагов, разделённых знаком ИЛИ.
Примеры: Пусть имя файла будет Present впапке Visual. Вклассе документов описаны переменные: char s [40], int k [100] иdouble Y [3] [200]. Имя экземпляра пусть будет le.
1. Создать файл, а если он уже был создан ранее, то его
неусекать.
CFile:: le (“C:\\Visual\\Present.dat”, CFile:: modeCreate|
CFile:: modeNoTruncate);
le Close ();
 10.1
  CFile
Конструктор Создаёт экземпляр класса CFile. Если указать имя
файла, тооткрывается заданный файл
Деструктор Уничтожает экземпляр класса CFile, перед удалени-
ем закрывает файл
Abort Немедленно закрывает файл, если даже есть ошибка
Close () Закрывает файл
GetFileName () Считывает имя файла
GetFilePath () Считывает полный путь файла
GetFileTitle Считывает имя файла без расширения
GetLength () Считывает длину файла
GetPosition () Считывает текущую позицию вфайле
LockRange () Блокирует файл для доступа других процессов
Open Открывает файл
Read () Считывает данные изфайла
Remove () Стирает файл
— 94 —
  10.1
Rename () Переименовывает файл
Seek () Переставляет указатель текущей позиции
SeekToBegin () Переставляет указатель позиции наначало файла
SeekToEnd Переставляет указатель позиции наконец файла
SetFilePath () Устанавливает путь кфайлу
SetLength () Устанавливает длину файла
UnLockRange () Снимает блокировку файла
Write () Записывает данные вфайл
Последний оператор можно и неприменять, так как от­компилированная программа при завершении её работы сама закроет файл. Нодля страховки немешает этот оператор применить, чтобы избежать последствий, если вВашей про­грамме будут ошибки, которые компилятор не обнаружит или неприятности случатся ссамим компьютером, когда за­крытие файла может непроизойти. Тем более использование лишнего оператора насовременных компьютерах довольно некритично как для длины откомпилированной программы, так идля времени выполнения её.
 10.2
   
 
CFile:: modeCreate
CFile:: modeNoInharit
CFile:: modeNoTruncate
CFile:: modeRead Файл открыт только для чтения
CFile:: modeReadWrite Файл открыт только для чтения изаписи
Создаёт новый файл или усекает его длину донуля (стирает всё содержимое файла)
Запрещает наследование файла порождён­ным процессом
Если файл создан ранее, содержимое его неудаляется
— 95 —
  10.2
 
CFile:: modeWrite Файл открыт только для записи
CFile:: shareCombat Позволяет открывать файл другому процессу
CFile:: shareDenyNone Позволяет другому процессу читать иписать
CFile:: shareDenyRead Запрещает другому процессу читать
CFile:: shareDenyWrite Запрещает другому процессу писать
CFile:: shareExclusive Запрещает другому процессу доступ
CFile::: typeBinary Устанавливает двоичный режим
CFile::: typeText Устанавливает текстовый режим
2. Создать фрагмент программы для записи данных вно-
вый файл или обновить данные файла:
CFile:: le (“C:\\Visual\\Present.dat”, CFile:: modeCreate| CFile:: modeWrite|CFile:: tipeBinary); le.Write (s,40); le.Write (k,200); le.Write (Y,4800); le Close (); В операторах записи первым аргументом является иденти-
фикатор данных, авторой — объём записывающих данных вбайтах. Переменная s занимает 40 байт поодному наодин символ, переменная k занимает 200 байт по два на каждое число ипеременная Y занимает 8х3х200=4800 байт.
3. Изранее созданного файла прочитать все данные: CFile:: le (“C:\\Visual\\Present.dat”, CFile:: modeRead|CFile::
tipeBinary);
le.Read (s,40); le.Read (k,200); le.Read (Y,4800);
— 96 —
le Close ();
Заметьте, что порядок чтения файла должен абсолютно со­впадать спорядком записи данных вфайл.
4. Из ранее созданного файла прочитать данные только
переменных Y:
CFile:: le (“C:\\Visual\\Present.dat”, CFile:: modeRead|CFile:: tipeBinary);
le.Seek (240);
le.Write (Y,4800);
le Close ();
Здесь нужно сначала перемесить указатель текущей пози­ции вфайле навеличину объёма памяти для переменных s иk.
Также обратите внимание, что вуказании пути файла ис­пользуется двойной обратный слеш, так как простой обрат­ный слеш— специальный символ, он требует дополнитель­ного обратного слеша, см.таблицу 1.2.
10.3. Классы для работы современем
Мастером AppWizard в среду программирования Visual C++6 включены два специальных класса, позволяющих рабо-
тать сданными времени. Класс CTime представляет абсолют­ное время в структурированном виде: год, месяц, день, час, минуты, секунды. Втаблице 10.3 приведены методы класса, по­зволяющие получить теили иные сведения отекущем времени.
 10.3
   CTime
 
Format () Создаёт текстовую строку текущего времени
FormatGmt () Создаёт текущую строку времени поГринвичу
GetCurentTime () Заполняет объект класса CTime соотв. времени
— 97 —
  10.3
 
GetDay () Считывает текущий день
GetDayWeek () Считывает текущий день недели (1-воскресенье)
GetGmtTm () Заполняет структуру tm
GetHour () Считывает текущий час
GetLocalTm () Считывает объект класса вструктуру tm
GetMiuute () Считывает минуты
GetSecond () Считывает секунды
GetTime () Считывает время, преобразуя втип time_t
GetYear () Считывает год
Структура tm:
Struct tm { int tm_sec; //секунды после начала минуты int tm_min; //минуты после начала часа int tm_hour; //часы после полуночи int tm_mday; //день месяца int tm_year; //год, начиная с1900 int tm_wday; //день недели, начиная своскресенья int tm_yday; //день, начиная с1января int tm_isdst; //флаг половины суток
}
Для использования класса CTime, чтобы определить
текущее время, просто необходимо вызвать функцию
GetCurentTime ():
CTime time=CTime:: GetCurentTime (): Здесь time— имя экземпляра класса. Если нужно вывести отсчёт времени на экран монитора
или просто сохранить встроке символов, можно воспользо-
— 98 —
ваться функцией Format. Если аргумент Formatа будет как вследующем примере:
CString st=time.Format (%d.%m —%y%H:%M:%S);
то встроке st отразится время вформе: 24. 02–2014 16: 15: 34.
Все элементы формата приведены втаблице 10.4.
Наличие класса CTimeSpan позволяет определять проме­жуток времени между двумя моментами времени. Возможно­сти этого класса приведены втаблице 10.5.
Объект класса CTimeSpan есть нечто иное, как разность времени между текущим и начальным моментами времени. Адля измерения времени вэтих моменты времени использу­ют объект класса CTime. Ифрагмент программы может вы­глядеть как:
CTime startTime=CTime:: GetCurentTime ();
……
……
CTime endTime=cTime:: GetCurentTime ();
CTimeSpan. dt=endTime-startTime;
Здесь dt— результирующий объект класса CTimeSpan.
Кроме упомянутых классов работы со временем, вкласс представления встроена функция Sleep (), позволяющая за­держать процесс вычисления навремя, заданное аргументом этой функции. Этот интервал времени задаётся целым чис­лом миллисекунд.
   Format ()
 
%a Сокращённое наименование дня недели
%A Полное наименование дня недели
%b Сокращённое наименование месяца
— 99 —
 10.4
  10.4
 
%B Полное наименование месяца
%c Дата ивремя вформате США
%d День месяца как число (1…31)
%H Часы всутках (0…23)
%I Часы в12-часовом формате (0…12)
%j День вгоду как число (1…366)
%m Месяц как число (1…12)
%M Минуты (00…59)
%p Время в12-часовом формате (A.M./P.M.)
%S Секунды (00…59)
%U Неделя вгоду (00…51), начиная своскресенья
%w День недели как число (0…6) 0— воскресенье
%W Неделя вгоду (00…51), начиная спонедельника
%x Локализованное представление даты
%X Локализованное представление времени
%y Год без первых двух цифр (00…99)
%Y Год полностью (4 цифры)
%z Сокращённое имя временной зоны
%Z Полное имя временной зоны
%%
Знак процента
 10.5
  CTimeSpan
 
Format () Создаёт текстовую строку промежутка времени
GetDays () Считывает количество дней
GetHours () Считывает количество часов
GetMinutes () Считывает количество минут
— 100 —
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]