Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка ЛР по ОС.doc
Скачиваний:
3
Добавлен:
04.05.2019
Размер:
735.23 Кб
Скачать

4.2.8Отображение графического окна

В главном модуле создайте дополнительный элемент меню, который будет отображать только что созданное графическое окно.

    1. Обработчик отображения дочернего окна

// файл main.cpp, класс TMainForm

void __fastcall TMainForm::N4Click(TObject *Sender)

{

// Создание и выделение памяти для графического окна

TfmStudentTable *fmStudentTable = new TfmStudentTable(Application);

}

Обратите внимание, что принципы отображения дочерних окон и простых диалоговых окон (см. пример 4.8) – различаются.

На рисунке 4.5 представлен примерный вид построенного окна.

Рисунок 4.5 – Рабочий вид окна отображения содержимого таблицы

4.3Сохранение структур данных таблиц в файлы

В соответствии с пунктом 6 «Общих требований» при завершении приложения все структуры данных таблиц должны выгружаться из памяти и сохраняться в файлы формата .tbl на жёстком диске. Операцию сохранения структур оформим в виде отдельной функции с именем, например, SaveDatabase. Вызов этой функции будет осуществляться из главного модуля.

    1. Объявление функции SaveDatabase

// файл main.h, класс TMainForm

private:

...

// Сохраняет содержимое базы данных в файлы на жёстком диске

void SaveDatabase();

    1. Реализация функции SaveDatabase

// файл main.cpp, класс TMainForm

void TMainForm::SaveDatabase()

{

int i;

// Объявление указателя на поток для работы с файлом

TFileStream *fs;

// Открытие файла для записи таблицы "Студентов"

fs = new TFileStream(ExeDirectory + "\\Students.tbl", fmCreate | fmOpenWrite);

// Объявление указателя на строку в соответствии с типом текущей таблицы

TStudent *student;

// Сканирование полного списка текущей таблицы

for (i = 0; i<Students->Count; i++)

{

// Объявление структуры для записи в файл

stStudent student2;

// Получение i-ой строки таблицы текущей таблицы

student = (TStudent *)Students->Items[i];

// Заполнение значений полей структуры значениями из i-ой строки текущей таблицы

strcpy(student2.No, student->No.c_str());

strcpy(student2.Fio, student->Fio.c_str());

strcpy(student2.GroupNo, student->GroupNo.c_str());

student2.Birthday = (double)student->Birthday;

strcpy(student2.Address, student->Address.c_str());

// Объявление указателя на поток байт в памяти для записи на диск массива байт фотоизображения

TMemoryStream *ms = new TMemoryStream();

student->Photo->SaveToStream(ms);

// Получение размера фотоизображения в байтах

student2.PhotoLen = ms->Size;

// Запись в файл строки таблицы

fs->Write(&student2, sizeof(stStudent));

// Запись в файл потока байт, содержащего фотоизображение

fs->Write(ms->Memory, ms->Size);

// Освобождение памяти, занимаемой указателем на поток байт

delete ms;

}

// Освобождение памяти, занимаемой указателем на поток для работы с файлом

delete fs;

...

}

В рассмотренном примере, сохранение файлов базы данных производится в каталог исполняемого файла приложения. Переменная ExeDirectory содержит путь к каталогу, из которого было запущено приложение. Для определения пути к текущему каталогу приложения используйте одну из следующих функцй:

  • int getcurdir(int drive, char *directory) – функция из состава С

  • AnsiString __fastcall GetCurrentDir() – функция из состава VCL

  • DWORD GetCurrentDirectory(DWORD nBufferLength, LPTSTR lpBuffer) – функция из состава WinAPI