На этом шаге мы рассмотрим основные моменты создания приложения, демонстрирующего работу с файлом произвольного доступа.
При последовательном доступе файл рассматривается как последовательность строк фиксированной длины, причем при открытии указывается длина строки. Благодаря этому становится возможным переход на любую запись по ее номеру.
Приведенная ниже программа реализует простейшую базу данных с помощью файла произвольного доступа. Данный файл предназначен для хранения информации о студентах: фамилии, имени и группе. Диалоговое окно информация о студентах позволяет перемещаться от записи к записи, редактировать существующие и создавать новые записи. Переход от записи к записи производится при помощи счетчика. Отметим, что заголовок диалогового окна является переменным: при создании нового файла или записи в заголовок выводится информация о студентах, а при выводе информации о текущем студенте — его имя и фамилия. При активизации диалогового окна доступными для пользователя являются только поле со списком и кнопка Открытие файла. В поле со списком отображаются все файлы текущей папки с расширением dat. Пользователь может выбрать файл из этого списка или ввести в поле имя нового файла. После ввода имени файла поле со списком и кнопка Открытие файла становятся недоступными для пользователя, а все остальные элементы управления, наоборот, становятся доступными. На стандартном листе модуля описан пользовательский тип СтудентType, который используется в модуле UserForm1 для объявления переменной данного типа. Эта переменная задает структуру в файле произвольного доступа. Имя открываемого или вновь создаваемого файла вводится в переменную ИмяФайла. Свободный номер для файла получается при помощи функции FreeFile и записывается в переменную Номер.
Итак, в редакторе форм создадим диалоговое окно для работы с файлом произвольного доступа (рисунок 1).
Рис.1. Диалоговое окно для работы с файлом произвольного доступа
Обсудим, как приведенная ниже программа решает описанную задачу и что в ней происходит.
Приведем полный текст приложения.
Option Explicit ' Переменные уровня модуля Dim Студент As СтудентType Dim ДлинаФайла As Long Dim ДлинаЗаписи As Long Dim ИмяФайла As String Dim ТекущаяЗапись As Long Dim ПоследняяЗапись As Long Dim Номер As Integer Sub ПоказатьЗапись() Get #Номер, ТекущаяЗапись, Студент With Студент TextBox1.Text = Trim(.Фамилия) TextBox2.Text = Trim(.Имя) TextBox3.Text = Trim(.Группа) TextBox4.Text = ТекущаяЗапись UserForm1.Caption = TextBox1.Text & " " & TextBox2.Text End With End Sub Sub ЗаписатьЗапись() With Студент .Фамилия = TextBox1.Text .Имя = TextBox2.Text .Группа = TextBox3.Text End With Put Номер, ТекущаяЗапись, Студент End Sub Private Sub CommandButton1_Click() ' Кнопка Новая запись UserForm1.Caption = "Информация о студентах" 'ЗаписатьЗапись ПоследняяЗапись = ПоследняяЗапись + 1 With Студент .Фамилия = "" .Имя = "" .Группа = "" End With TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = CStr(ПоследняяЗапись) Put #Номер, ПоследняяЗапись, Студент ТекущаяЗапись = ПоследняяЗапись End Sub Private Sub CommandButton2_Click() ' Кнопка Записать изменения ЗаписатьЗапись End Sub Private Sub CommandButton3_Click() ' Кнопка Закрыть Close #Номер UserForm1.Hide End Sub Private Sub CommandButton4_Click() ' Открытие файла Dim Начало As Boolean Управление СЗаписями:=True, СФайлом:=False ИмяФайла = Trim(ComboBox1.Text) ДлинаЗаписи = Len(Студент) Номер = FreeFile Open ИмяФайла For Random As Номер Len = ДлинаЗаписи ТекущаяЗапись = 1 ПоследняяЗапись = FileLen(ИмяФайла) / ДлинаЗаписи Начало = True If ПоследняяЗапись = 0 Then UserForm1.Caption = "Информация о студентах" ПоследняяЗапись = 1 Начало = False End If ПоказатьЗапись If Начало = False Then UserForm1.Caption = "Информация о студентах" End If TextBox1.SetFocus Label4.Caption = "Номер записи из " & ПоследняяЗапись End Sub Private Sub CommandButton5_Click() ' Переход на последнюю запись ТекущаяЗапись = ПоследняяЗапись SpinButton1.Value = ПоследняяЗапись ПоказатьЗапись End Sub Private Sub CommandButton6_Click() ' Переход на первую запись SpinButton1.Value = 1 ТекущаяЗапись = 1 ПоказатьЗапись End Sub Private Sub SpinButton1_Change() SpinButton1.Min = 1 SpinButton1.Max = ПоследняяЗапись ТекущаяЗапись = SpinButton1.Value ПоказатьЗапись End Sub Private Sub UserForm_Initialize() Dim ИмяПапки As String Dim ИмяФайла As String Dim ДлинаПути As Integer Dim i As Integer Управление СЗаписями:=False, СФайлом:=True UserForm1.Caption = "Информация о студентах" With CommandButton5 .Picture = LoadPicture("vba17f.bmp") .PicturePosition = fmPicturePositionCenter End With With CommandButton6 .Picture = LoadPicture("vba17b.bmp") .PicturePosition = fmPicturePositionCenter End With Label4.Caption = "Номер записи" ComboBox1.Clear ИмяПапки = CurDir("C:") ДлинаПути = Len(ИмяПапки) With Application.FileSearch .Filename = "*.dat" .SearchSubFolders = False If .Execute(SortBy:=msoSortByFileName, _ SortOrder:=msoSortOrderAscending) > 0 Then For i = 1 To .FoundFiles.Count ИмяФайла = Right(.FoundFiles(i), Len(.FoundFiles(i)) _ - ДлинаПути - 1) ComboBox1.AddItem ИмяФайла Next i End If ComboBox1.ListIndex = 0 End With End Sub Sub Управление(СЗаписями As Boolean, СФайлом As Boolean) Dim ЭлементУправления As Object For Each ЭлементУправления In Controls ЭлементУправления.Enabled = СЗаписями Next ЭлементУправления CommandButton4.Enabled = СФайлом ComboBox1.Enabled = СФайлом End Sub
На следующем шаге мы закончим изучение этого вопроса.