Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование в среде Visual C++ 6. Учебное пособие
.pdf
ктов меню выбираете исходя из удобства их запоминания.
Мастер 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 () ->SetModiedFlag ().
Этот оператор помечает класс документов, что произошли
изменения переменных, которые следует запоминать. Иесли
при закрытии нашей разработанной программы операции
— 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 —
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
