Учебно-методическое пособие для студентов экономического факультета Ростов-на-Дону

Вид материалаУчебно-методическое пособие

Содержание


Описание предметной области
2. Моделирование данных
3. Представление данных
Идент. номер студента
Идент. номер спец.
4. Предварительные замечания
5. Постановка задачи
6. Структура проекта
7. Создание меню
8. Пользовательские модули
9. Работа с файлами
10. Ввод и редактирование данных
Надписи (тип Label)
Текстовые поля (тип TextBox)
Командные кнопки (тип Button)
Элементы управления DateTimePicker
Комбинированные поля (тип ComboBox)
Флажок (тип CheckBox)
10.2. Программное обеспечение формы для ввода и редактирования
11.2. Просмотр файла базы данных
...
Полное содержание
Подобный материал:
  1   2   3   4   5   6   7

Министерство образования и науки Российской федерации

Федеральное агентство по образованию




Федеральное государственное образовательное учреждение

высшего профессионального образования

«ЮЖНЫЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»




Л.А. Мачулина, В.А. Скороходов


Использование средств

Visual Basic .NET в создании

информационных систем


Учебно-методическое пособие

для студентов
экономического факультета


Ростов-на-Дону

2008

Решение об издании в электронном виде принято на заседании кафедры алгебры и дискретной математики, протокол № 2 от 26 сентября 2008 г.


Пособие содержит необходимые теоретические и практические материалы для разработки программного обеспечения информационных систем в среде программирования Visual Basic .NET в системе Visual Studio 2008 Express Edition. На примере информационной системы «Студенты» рассматриваются основные этапы проектирования и реализации информационных систем. Приводятся технические задания на проекты для самостоятельной разработки.

Авторы: Л.А. Мачулина, В.А. Скороходов.


© Л.А. Мачулина, В.А. Скороходов, 2008

Предисловие



Данное пособие содержит описание технологии разработки большого программного проекта и реализации его средствами традиционного процедурного и объектно-ориентированного программирования в среде визуального программирования.

В качестве объекта разработки и реализации выбран тип приложения, которое по существу является информационной системой. То есть это приложение, прежде всего, с хорошим графическим интерфейсом, которое содержит средства для создания и ведения базы данных, средства манипулирования данными, а также программы обработки данных для получения определенной информации.

Реализация информационной системы выполняется в среде визуального программирования Visual Basic 2008 Express Edition.

Первая часть пособия посвящена вопросам моделирования данных и проектированию программного обеспечения информационной системы.

Вторая часть содержит описание реализации информационной системы для анализа успеваемости в учебном заведении.

Третья часть пособия содержит варианты технических заданий на разработку информационных систем, которые должны выполняться студентами самостоятельно в рамках практикума.

Материалы, представленные в пособии, используются при проведении учебной практики студентов специальностей «Прикладная информатика в экономике» и «Математические методы исследования операций в экономике».


Часть I


Проектирование информационной системы

  1. Описание предметной области



На первом этапе проектирования информационной системы необходимо выполнить анализ предметной области, т.е. определить объекты предметной области и связи между объектами.

При выборе состава и структуры предметной области возможны два подхода: функциональный и предметный.

Функциональный подход реализует принцип движения «от задач» и применяется, когда определен комплекс задач, для обслуживания которых создается информационная система. В этом случае можно выделить минимальный необходимый набор объектов предметной области, которые должны быть описаны.

В предметном подходе объекты предметной области определяются с таким расчетом, чтобы их можно было использовать при решении множества разнообразных, заранее не определенных задач.

Чаще всего используется комбинация этих двух подходов.

Опишем предметную область, предлагаемую в качестве примера в проекте, реализация которого представлена в данном пособии.

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

В данном случае основным объектом предметной области является студент. Мы будем придерживаться функционального подхода, т.е. идти от задач, которые будут решаться. Поэтому ограничимся определенным набором свойств объекта «студент». Перечислим эти свойства:

– Номер зачетной книжки,

– Фамилия Имя и Отчество,

– Дата рождения,

– Пол,

– Курс,

– Номер учебной группы,

– Специальность,

– Количество сдаваемых в сессию экзаменов,

– Оценки, полученные на экзаменах.

Мы выбрали минимальный набор свойств-характеристик студента. Естественно, что этот набор может быть расширен.

Необходимо предусмотреть следующие ограничения на информацию:
  1. Курсы имеют значения от 1 до 5.
  2. Номер учебной группы изменяется от 1 до 15.
  3. Количество сдаваемых в сессию экзаменов может изменяться от 2 до 5.

Предполагается, что с данной информационной системой будут работать сотрудники деканата, и они должны иметь возможность решать с её помощью следующие задачи:

1. Ввод и редактирование данных о студентах в удобной форме.

2. Просмотр данных о студентах в отсортированном виде.

3. Определение численности контингента в каждой учебной группе, на каждом курсе и в целом на факультете.

4. Подготовка к выводу на печать списков студентов.

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

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

7. Определение процента успеваемости в каждой учебной группе, на каждом курсе и в целом по факультету.

8. Просмотр и подготовка к выводу списков задолжников (с указанием количества задолженностей) по курсам и группам.

9. Просмотр и подготовка к выводу списков студентов, претендующих на получение стипендии, с отметкой о том, какая стипендия полагается: обычная или повышенная.

10. Организация поиска по фамилии или части фамилии.

2. Моделирование данных



Для проектирования концептуальной схемы (информационной структуры программного обеспечения информационной системы) можно использовать различные модели, в частности модель «сущность – связь».

Из моделей типа «сущность – связь» наиболее известна модель П.Чена, или ER – модель (Entity–Relationship). Общим для всех моделей этого типа является использование трех основных конструкций: сущность, связь и атрибут.

Сущность (Entity) – собирательное понятие, некоторая абстракция реально существующего объекта, процесса или явления, о котором необходимо хранить информацию.

Атрибут – поименованная характеристика сущности, которая принимает значение из некоторого множества значений. В модели атрибут выступает в качестве средства, с помощью которого моделируются свойства сущностей.

Связь (Relationship) – средство представления отношения между сущностями.

На первом этапе моделирования необходимо из описания предметной области извлечь информацию и выделить сущности.

Каждая сущность должна обладать уникальным идентификатором. Каждый экземпляр сущности должен однозначно идентифицироваться и отличаться от всех других экземпляров данного типа сущности. Каждая сущность должна обладать некоторыми свойствами:
  • каждая сущность должна иметь уникальное имя, и к одному и тому же имени должна всегда применяться одна и та же интерпретация. Одна и та же интерпретация не может применяться к различным именам, если только они не являются псевдонимами;
  • сущность обладает одним или несколькими атрибутами, которые либо принадлежат сущности, либо наследуются через связь;
  • сущность обладает одним или несколькими атрибутами, которые однозначно идентифицируют каждый экземпляр сущности;
  • каждая сущность может обладать любым количеством связей с другими сущностями модели.

Обращаясь к приведенному выше описанию предметной области, видно, что можно выделить следующие сущности: студент и специальность.

Следующим шагом моделирования является идентификация связей.

Связь – поименованная ассоциация между двумя сущностями, значимая для рассматриваемой предметной области. Связь – это ассоциация между сущностями, при которой, как правило, каждый экземпляр одной сущности, называемой родительской сущностью, ассоциирован с произвольным (в том числе нулевым) количеством экземпляров второй сущности, называемой сущностью-потомком, а каждый экземпляр сущности-потомка ассоциирован в точности с одним экземпляром сущности-родителя. Таким образом, экземпляр сущности-потомка может существовать только при существовании сущности родителя.

Связи может даваться имя, выражаемое грамматическим оборотом глагола и помещаемое возле линии связи. Имя каждой связи между двумя данными сущностями должно быть уникальным, но имена связей в модели не обязаны быть уникальными.

На языке ER - модели концептуальная схема может быть представлена ERD (ER - диаграммой), в которой множество сущностей обозначается прямоугольниками, множество связей – ромбами.

Взаимосвязь сущностей описанной выше предметной области можно изобразить ER-диаграммой на рисунке 1.




Рисунок 1. ER–диаграмма

Каждый студент обучается только на одной специальности, но одну и ту же специальность получает много студентов. Если предположить, что возможна ситуация, когда один и тот же студент обучается сразу на двух специальностях, то в этом случае будут существовать два экземпляра объекта с разными номерами зачетной книжки.

В предлагаемой модели сущность «Специальность» и сущность «Студент» связаны отношением «один – много».

Последним шагом моделирования является идентификация атрибутов.

Атрибут – любая характеристика сущности, значимая для рассматриваемой предметной области и предназначенная для квалификации, идентификации, классификации, количественной характеристики или выражения состояния сущности. Атрибут представляет тип характеристик или свойств, ассоциированных с множеством реальных или абстрактных объектов (людей, мест, событий, состояний, идей, пар предметов и т.д.). Экземпляр атрибута – это определенная характеристика отдельного элемента множества. Экземпляр атрибута определяется типом характеристики и ее значением, называемым значением атрибута. В ER-модели атрибуты ассоциируются с конкретными сущностями. Таким образом, экземпляр сущности должен обладать единственным определенным значением для ассоциированного атрибута.

Атрибут может быть либо обязательным, либо необязательным. Обязательность означает, что атрибут не может принимать неопределенных значений (null values). Атрибут может быть либо описательным (т.е. обычным дескриптором сущности), либо входить в состав уникального идентификатора (первичного ключа).

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

Каждый атрибут идентифицируется уникальным именем, выражаемым грамматическим оборотом существительного, описывающим представляемую атрибутом характеристику. Атрибуты изображаются в виде списка имен внутри блока ассоциированной сущности, причем каждый атрибут занимает отдельную строку. Атрибуты, определяющие первичный ключ, размещаются наверху списка и выделяются жирным шрифтом.

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

С учетом имеющейся информации дополним построенную ранее диаграмму (рисунок 2), определив для каждой сущности набор атрибутов. Следует отметить, что набор атрибутов для каждой из сущностей может быть расширен, например, в реальной ситуации для каждого студента должны выясняться и сохраняться такие атрибуты, как дата рождения, паспортные данные, адрес и другие. Также отметим, что некоторые из атрибутов могут иметь «пустые» значения, т.е. они могут быть необязательными.

В предлагаемом проекте будет рассмотрен именно тот набор атрибутов сущности «Студент», который помещен на диаграмме на рисунке 2.

Рисунок 2. ER-диаграмма с атрибутами

Обсудим значения атрибута «идентификационный номер специальности» сущности «Студент». Значения этого атрибута ассоциируют каждый экземпляр сущности «Студент» с одним из экземпляров сущности «Специальность».

Значение атрибута «идентификационный номер специальности» в сущности «Студент» обеспечивает связь сущности «Специальность» с сущностью «Студент» в отношении «один – много». Одну и ту же специальность могут получать много студентов, но информация о специальности заполняется только один раз, что позволяет избежать дублирования информации о специальности при её хранении.

3. Представление данных


Как правило, при использовании систем управления базами данных в информационных системах, после этапа моделирования данных выполняется преобразование ER–модели в реляционную модель, т.е. сущностям и связям ER–модели ставятся в соответствие отношения, или таблицы.

Однако особенностью описываемой реализации информационной системы является то, что она выполняется без использования систем управления базами данных, а создание, ведение и обработка данных выполняется средствами языка и системы программирования Visual Basic.

Для хранения данных будут использоваться файлы прямого доступа с записями пользовательского типа.

Выполним преобразование атрибутов сущностей «Студент» и «Специальность» в поля соответствующих пользовательских типов TStud (рисунок 3) и TSpec (рисунок 4).


Студент


Идент. номер студента

Курс

Номер учебной группы

Идент. номер спец.

Фамилия И.О.

Дата рождения

Пол

Кол-во экзаменов

Оценки на экзаменах

TStud


ID_Stud

Long

Длинное целое

Kurs

Byte

Байт

Group

Byte

Байт

Spec

Integer

Целое

FIO

String

Строка длины 20

DataR

Date

Дата

Pol

String

Строка длины 7

Kol

Byte

Байт

M (5)

Byte

Байт

.







Рисунок 3. Преобразование сущности «Студент» к типу TStud


Специальность


Идент. номер спец.

Код специальности

Название спец-ности

TSpec


Code

Integer

Целое

Number

String

Строка длины 6

Name

String

Строка длины 100









Рисунок 4. Преобразование сущности «Специальность» к типу TSpec

Часть II

Реализация информационной системы «Студенты»

4. Предварительные замечания

Рассмотрим все этапы разработки и создания информационной системы на примере ИС «Студенты». Разработка выполняется в среде программирования Visual Basic 2008 Express Edition (платформа .NET), для хранения данных используются файлы прямого доступа, диалог пользователя с информационной системой для ведения и обработки данных организован с использованием средств графического интерфейса.

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


5. Постановка задачи

Описание предметной области было сделано выше, в данном разделе сформулируем техническое задание на создание информационной системы для заданной предметной области.

Требуется разработать информационную систему, позволяющую обрабатывать данные о студентах и их успеваемости, представленные в определенном формате. Информационная система должна содержать средства для ввода и редактирования данных, обеспечивать сортировку по одному или нескольким полям данных, обеспечивать возможность поиска по одному или нескольким критериям, выполнять обработку данных и выдавать результаты обработки.

Информация о студентах представлена следующими данными:
  • фамилия, имя и отчество;
  • дата рождения;
  • пол;
  • специальность;
  • курс;
  • группа;
  • количество экзаменов;
  • оценки, полученные на экзамене.

Для хранения и обработки этой информации создать базу данных в виде набора файлов прямого доступа.

Необходимо предусмотреть возможность упорядочения данных (сортировку) по следующим полям:
  • по ФИО;
  • по курсу;
  • по группе.

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

Во избежание дублирования данных и экономии памяти для поля «специальность» создать отдельный файл-справочник (файл прямого доступа), используемый для заполнения и просмотра этого поля данных.

Критериями поиска для данной информационной системы являются: ФИО, курс, группа.

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

Для каждой из перечисленных задач предусмотреть возможность просмотра результатов на экране и возможность сохранения их в текстовых файлах для последующего использования.

Заметим, что при описании предметной области было определено больше функций информационной системы и, соответственно, задач, которые могут быть решены для выделенных данных. Однако в представляемой конкретной реализации будут решены задачи, перечисленные в техническом задании.

6. Структура проекта

ИС «Студенты» реализуется в среде программирования Visual Basic .Net и представляет собой приложение с графическим интерфейсом, состоящее из экранных форм, диалоговых окон и других элементов управления.

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

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

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

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

7. Создание меню

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

Меню позволяет представить функции приложения в четком и, как правило, удобном для пользователя виде.

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

Каждый заголовок меню и каждая строка меню представляет собой объект, обладающий своим набором свойств и событий, включая нужное нам событие Click.

Перечислим некоторые, наиболее важные, свойства элементов меню:
  • Свойство Text определяет текст, отображаемый в меню (заголовок меню или команда меню). Текст может содержать символ «амперсенд» (&) перед символом, который используется в комбинации с клавишей Alt для быстрого вызова.
  • Свойство Name является обязательным, рекомендуется в имени пункта использовать префикс mnu, а для команд меню использовать окончание Item. Например, для заголовка меню Файл зададим имя mnuFile, а для пункта Выход в меню Файл, т.е. команды Файл / Выход, зададим имя mnuFileExitItem.
  • Свойство Checked помещает (или удаляет) маркер-галочку рядом с командой. Задавая значение свойства Checked, можно «включать» или «выключать» команды меню во время выполнения программы.
  • Свойство Enabled по умолчанию имеет значение True. Если заголовок меню или команду необходимо сделать недоступной, заблокировать, то для такой команды нужно сбросить флажок в свойстве Enabled, что будет соответствовать значению False для этого свойства.
  • Свойство Visible по умолчанию имеет значение True. Это свойство позволяет скрыть элемент меню (однако стоит задуматься о целесообразности этого действия, не лучше ли заблокировать элемент меню до нужного момента).
  • Свойство Shortcut определяет клавиатурную комбинацию для вызова команды с клавиатуры, обычно используются служебные клавиши Ctrl и Alt в сочетании с другими клавишами (например, F1).

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



Рисунок 5. Макет главной формы в режиме конструктора

Теперь опишем начало процесса создания приложения и создание макета главной формы. Для этого необходимо выполнить следующие действия:
  1. Запустить Visual Basic.
  2. Создать новый проект типа Windows Application, в него сразу загружается форма со стандартным именем Form1. Новый проект имеет имя WindowsApplication1, однако, рекомендуется при создании дать проекту содержательное имя.

Переименовать форму, изменив в окне свойств формы свойство Name (в нашем приложении главная форма будет иметь имя frmMenu). Здесь же можно сменить заголовок формы, используя свойство Text (Text = ИС «Студенты»).
  1. Сохранить проект в новом каталоге, предназначенном для хранения файлов данного проекта.
  2. Для продолжения работы с проектом запустить файл проекта – файл с расширением .sln. Затем, поместить на форму элемент MenuStrip (это будет главное меню формы), а после этого создать все элементы главного меню, вид которого представлен в таблице 1.
  3. Сохранить форму в каталоге проекта.
  4. В макете формы выбрать пункты и команды меню. Двойной щелчок на команде меню открывает окно кода формы и в нем процедуру-заготовку для обработки события Click.
  5. Сохранить проект.


Таблица 1 определяет значения свойств Text, Name и Enabled соответствующих пунктов меню (см. рис. 5).

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

Таблица 1



Text

Name

Enabled

&Файл

mnuFile

True

Создать

mnuFileNewItem

True

Открыть

mnuFileOpenItem

True

-

mnuFileSep1

True

Сохранить

mnuFileSaveItem

False

Сохранить как…

mnuFileSaveAsItem

False

-

mnuFileSep2

True

Закрыть

mnuFileCloseItem

False

Удалить

mnuFileDeleteItem

False

-

mnuFileSep3

True

Выход

mnuFileExitItem

True

Прос&мотр

mnuView

False

Форма

mnuViewFormItem

True

Таблица

mnuViewTableItem

True

&Сортировка

mnuSort

False

По курсу

mnuSortKursItem

True

По группе

mnuSortGroupItem

True

По ФИО

mnuSortFIOItem

True

Исходный порядок

mnuSortUnsorted

True

&Поиск

mnuSearch

False

&Отчеты

mnuQuery

False

Список по группе

mnuQueryListItem

True

Все группы

mnuQueryListAllItem

True

Одна группа

mnuQueryListOneItem

True

Вычисление среднего балла

mnuQueryBallItem

True

Кол-во и средний балл в группе

mnuQueryKolItem

True

&?

mnuHelp

True

Для продолжения работы с проектом необходимо из каталога, в котором сохранен проект, запустить файл проекта – файл с расширением .sln. Он будет загружен в среду разработки Visual Basic. Попытаемся запустить проект в режиме выполнения. Однако перед этим опишем процедуру обработки события выхода из главной формы разрабатываемой информационной системы. Это команда «Выход» в меню «Файл». Будем обозначать такой выбор следующим образом «Файл  Выход».

При выборе пункта меню «Файл  Выход» приложение должно завершить свою работу, но по правилам хорошего тона приложение обязано сделать запрос на подтверждение закрытия приложения. Для ввода кода необходимо на макете формы в меню «Файл» выбрать команду «Выход» и дважды щелкнуть левой кнопкой мыши, появится заготовка процедуры обработки события Click, состоящая из операторов заголовка и конца процедуры. Остается ввести операторы, являющиеся телом процедуры. Код процедуры, реализующий функцию выбора команды меню «Файл  Выход», приведен ниже.


Private Sub mnuFileExitItem_Click(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles mnuFileExitItem.Click

If (vbYes =MsgBox("Действительно хотите выйти?",vbYesNo)) Then

End

End If

End Sub

Таким образом, при выборе команды меню «Файл  Выход» пользователю будет предложено подтвердить выход из приложения и при утвердительном ответе приложение завершит свою работу.

Для запуска проекта на выполнение необходимо выбрать в строке меню среды разработки пункт «Debug» и команду «Start Debugging» или нажать клавишу F5. В меню появившейся формы выбрать пункт «Файл», а затем команду «Выход».

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


8. Пользовательские модули

В проекте используется два стандартных модуля, не связанных ни с какими формами. Один из них, с именем Declar, используется для объявления пользовательских типов, констант и переменных. Другой, с именем Sorting, содержит пользовательские процедуры сортировки данных различных типов.

Сначала в проект нужно добавить новый стандартный модуль командой Project / Add Module и дать ему имя, затем ввести программный код.

Приведем программный код модуля Decl.

‘ Подключение библиотек ввода и вывода для работы с файлами

Imports System.IO

Imports System.Text


‘ создание нового пространства имен для

‘ возможности подключения модуля к формам проекта

Namespace Decl


Module Declar

‘ Объявление пользовательского типа,

‘ описывающего структуру записи для

‘ входных данных – информации о студенте

Public Class TStud

Public Kurs As Byte ' курс

Public Group As Byte ' номер группы

Public FIO As String ' фамилия, имя и отчество

Public Spec As Integer' учетный номер специальности

Public DataR As Date ' дата рождения

Public Pol As Byte ' пол

Public Kol As Byte ' количество экзаменов

Public M(4) As Byte ' полученные оценки

Public len As Integer = 1 + 1 + 40 + 4 + 20 + 1 + 1 + 5

' размер переменной


Public Sub writeToFile(ByVal ff As FileStream)

Dim writer As BinaryWriter = New BinaryWriter(ff)

Dim tempstr As String

If FIO.Length > 20 Then

FIO = Left(FIO, 20)

Else

tempstr = New String(" ", 20 - FIO.Length)

FIO = FIO + tempstr

End If


writer.Write(Kurs)

writer.Write(Group)


Dim temp() As Byte = _

UnicodeEncoding.Unicode.GetBytes(FIO)

writer.Write(temp)

writer.Write(Spec)


temp = _

UnicodeEncoding.Unicode.GetBytes(DataR.ToString("dd.MM.yyyy"))

writer.Write(temp)


writer.Write(Pol)

writer.Write(Kol)

writer.Write(M)

End Sub


Public Sub writeToFile(ByVal ff As FileStream, _

ByVal i As Integer)

ff.Seek((i - 1) * len, SeekOrigin.Begin)

writeToFile(ff)

End Sub


Public Sub ReadFromFile(ByVal ff As FileStream, _

ByVal i As Integer)

ff.Seek((i - 1) * len, SeekOrigin.Begin)


Dim reader As BinaryReader = New BinaryReader(ff)

Dim temp() As Byte


Kurs = reader.ReadByte()

Group = reader.ReadByte()


temp = reader.ReadBytes(40)

FIO = UnicodeEncoding.Unicode.GetString(temp, 0, 40)


Spec = reader.ReadInt32()


temp = reader.ReadBytes(20)

DataR = _

CType(UnicodeEncoding.Unicode.GetString(temp, 0, 20), Date)


Pol = reader.ReadByte()

Kol = reader.ReadByte()

M = reader.ReadBytes(5)

End Sub

End Class


' Объявление пользовательского типа,

' описывающего структуру записи для

' входных данных справочника – информации о специальности

Public Class TSpec

Public Code As Integer ' учетный номер специальности

Public Number As String = New String(" ", 6)

' шестизначный код специальности

Public Name As String = New String(" ", 100)

' наименование специальности

Public len As Integer = 4 + 7 + 200 ' размер переменной


Public Sub writeToFile(ByVal ff As FileStream)

Dim writer As BinaryWriter = New BinaryWriter(ff)

Dim tempstr As String


If Number.Length > 6 Then

Number = Left(Number, 6)

Else

tempstr = New String(" ", 6 - Number.Length)

Number = Number + tempstr

End If


If Name.Length > 100 Then

Name = Left(Name, 100)

Else

tempstr = New String(" ", 100 - Name.Length)

Name = Name + tempstr

End If


Dim temp() As Byte = _

UnicodeEncoding.Unicode.GetBytes(Number)


writer.Write(Code)

writer.Write(temp)

temp = UnicodeEncoding.Unicode.GetBytes(Name)

writer.Write(temp)

End Sub


Public Sub writeToFile(ByVal ff As FileStream, _

ByVal i As Integer)

ff.Seek((i - 1) * len, SeekOrigin.Begin)


writeToFile(ff)


End Sub


Public Sub ReadFromFile(ByVal ff As FileStream, _

ByVal i As Integer)

ff.Seek((i - 1) * len, SeekOrigin.Begin)


Dim reader As BinaryReader = New BinaryReader(ff)

Dim temp() As Byte


Code = reader.ReadInt32()

temp = reader.ReadBytes(12)

Number = UnicodeEncoding.Unicode.GetString(temp, 0, 12)


temp = reader.ReadBytes(200)

Name = UnicodeEncoding.Unicode.GetString(temp, 0, 200)

End Sub

End Class


' Объявление пользовательского типа,

' описывающего структуру записи

' для вычисления среднего балла студента

Public Class TBall

Public Kurs As Byte ' курс

Public Group As Byte ' номер группы

Public FIO As String = New String(" ", 20)

Public Sb As Single ' средний балл

Public len As Integer = 1 + 1 + 40 + 4 ' размер

‘ переменной


Public Sub writeToFile(ByVal ff As FileStream)

Dim writer As BinaryWriter = New BinaryWriter(ff)

Dim tempstr As String


If FIO.Length > 20 Then

FIO = Left(FIO, 20)

Else

tempstr = New String(" ", 20 - FIO.Length)

FIO = FIO + tempstr

End If


Dim temp() As Byte = _

UnicodeEncoding.Unicode.GetBytes(FIO)


writer.Write(Kurs)

writer.Write(Group)

writer.Write(temp)

writer.Write(Sb)

End Sub


Public Sub writeToFile(ByVal ff As FileStream, _

ByVal i As Integer)

ff.Seek((i - 1) * len, SeekOrigin.Begin)


writeToFile(ff)


End Sub

Public Sub ReadFromFile(ByVal ff As FileStream, _

ByVal i As Integer)

ff.Seek((i - 1) * len, SeekOrigin.Begin)


Dim reader As BinaryReader = New BinaryReader(ff)


Kurs = reader.ReadByte()

Group = reader.ReadByte()

Dim temp() As Byte = reader.ReadBytes(40)

FIO = UnicodeEncoding.Unicode.GetString(temp, 0, 40)

Sb = reader.ReadSingle()

End Sub

End Class


' Объявление констант и переменных,

' используемых в модулях форм,

' пользовательских процедурах и функциях

Public Const Nmax As Integer = 100

Public Const PathUntitled As String = "с:\untitled.dan"

Public Const PathTemp As String = "c:\$$$$.tmp"


Public Path As String

Public PathSpec As String

Public Path1 As String

Public Path2 As String

Public FName As String

Public richName As String


Public f1 As FileStream

Public F2 As FileStream

Public F3 As FileStream

Public F4 As Integer

Public F1_sp As FileStream


Public N As Integer

Public NSpec As Integer

Public Pos As Integer


Public Ind(Nmax) As Integer

Public Del(Nmax) As Integer


Public Button As MsgBoxResult


‘ функция, которая закрывает все открытые рабочие файлы

Public Sub CloseAllFiles()

If Not (f1 Is Nothing) Then f1.Close()

If Not (F1_sp Is Nothing) Then F1_sp.Close()

If Not (F2 Is Nothing) Then F2.Close()

If Not (F3 Is Nothing) Then F3.Close()

End Sub

End Module

End Namespace


После описания пользовательского модуля Declar необходимо изменить функцию обработки события выбора пункта меню «Выход». Измененная функция имеет вид:


Private Sub mnuFileExitItem_Click(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles mnuFileExitItem.Click

If (vbYes =MsgBox("Действительно хотите выйти?",vbYesNo)) Then

Decl.CloseAllFiles()

End

End If

End Sub


9. Работа с файлами

9.1. Использование диалогового окна Windows

Для открытия и сохранения файлов в проекте используется стандартное диалоговое окно Windows, которое создается с использованием элементов управления соответственно OpenFileDialog и SaveFileDialog. Нанесем на главную форму с меню (frmMenu) объекты для работы с диалоговыми окнами для открытия и сохранения файлов, можно оставить им те имена, которые им присвоит система (OpenFileDialog1 и SaveFileDialog1), а можем дать другие имена. Заметим, что во время выполнения приложения данные элементы управления не видны.

Окна диалога имеют определенные свойства и методы. Используемые нами в данной реализации свойства и методы для обоих типов объектов совершенно одинаковы, поэтому остановимся на свойствах только одного элемента управления при пояснении кодов процедур обработки событий для открытия и сохранения файлов. Что касается методов, то для обоих элементов будет использован метод ShowDialog() для получения имен диска, папки и файла соответственно для существующего файла и нового, сохраняемого файла.

Приведем фрагмент кода для вызова диалогового окна Windows для открытия и сохранения файлов.

‘ запрос имени файла базы данных

With OpenFileDialog1

.filename = ""

.Filter = "Все файлы (*.*)|*.*|" + _

"текстовые файлы(*.txt)|*.txt|" + _

"файлы исх. данных(*.dan)|*.dan|" + _

"файлы результата (*.rez)|*.rez"

.FilterIndex = 3

‘ метод, используемый для открытия файла

.ShowDalog()

Decl.Path = .filename

End With


В приведенном выше коде используются следующие свойства окна диалога: Filter – для списка возможных типов файлов, показываемых в поле ввода со списком для типа файла; FilterIndex – для вывода в окне для типа файла того типа, который в списке Filter имеет номер, задаваемый свойством FilterIndex. Имя выбранного файла помещается в окно для имени файла, а полное имя файла становится значением свойства FileName. Чтобы не использовать длинные имена, полное имя файла записывается в переменную Path модуля Declar.

При открытии файла появится диалоговое окно (рисунок 6), в котором необходимо выбрать файл, который нужно открыть.



Рисунок 6. Диалоговое окно открытия файла

9.2. Создание файлов базы данных

Создание файлов базы данных выполняется при выборе команды меню «Файл  Создать». Данной команде соответствует процедура обработки события mnuFileNewItem_Click, которая с помощью метода Show должна выводить на экран ту форму, при помощи которой будет производиться ввод новых и редактирование существующих записей данных.

Вначале, для простоты работы с загрузкой новых записей базы данных, основной рабочий файл с данными будем создавать в корневом каталоге какого-либо диска, например, диска «c:» с полным именем «c:\untitled.dan», а после выхода из формы для ввода и редактирования пользователю будет предложено сохранить данные в некотором файле. Для этих целей используем элемент управления «SaveFileDialog1» главной формы frmMenu. При этом фактически будет происходить переименование файла «c:\untitled.dan» и присвоение ему имени, введенного пользователем в окне диалога.

Запишем процедуру обработки события выбора команды меню «Файл  Создать».

Private Sub mnuFileNewItem_Click(ByVal sender As System.Object,_

ByVal e As System.EventArgs) Handles mnuFileNewItem.Click

Dim i As Integer


‘ закрываются все открытые до этого времени файлы

Decl.CloseAllFiles()

' открывается основной файл "c:\untitled.dan"

Decl.Path = PathUntitled

f1 = New FileStream(Decl.Path, FileMode.Create)


' и файл-справочник "c:\untitled.spe"

PathSpec = Mid(Decl.Path, 1, Len(Decl.Path) - 4) +".spe"

F1_sp = New FileStream(Decl.PathSpec, FileMode.Create)


' количество записей в основной таблице базы данных

' равно нулю

N = 0


' инициализация индексного массива Ind, который будет

' использоваться для сортировки данных, и массива Del

' для пометки удаляемых записей

For i = 1 To Nmax

Ind(i) = i

Del(i) = 0

Next i


' основная форма становится неактивной

Me.Enabled = False


' загрузка формы для ввода записей файла frmInputEdit

frmInputEdit.Text = "Файл: " + Decl.Path

frmInputEdit.Show()

frmInputEdit.ShowNewZap() ' пользовательская процедура

' ввода новой записи

End Sub


Поскольку, в данном коде программы участвует новая форма для ввода и редактирования данных, то необходимо добавить ее в проект, выполнив команду «Project/Add Windows Form», и дать новой форме имя frmInputEdit.

Теперь наш проект содержит две формы и нужно указать, какая из них является главной, т.е. запускается первой. Для этого нужно выполнить команду «Project/*имя проекта* Properties…» и в открывшемся диалоговом окне в поле ввода со списком StartUp Form выбрать в качестве стартового объекта форму frmMenu.

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