4-5 лаба / Лаб.4 Лебедев А.В / Labrab4_15
.doc
Лабораторная работа №4
Работа с последовательным и произвольным файлами
При последовательном доступе файл рассматривается как последовательность строк произвольной длины, разделенных специальными знаками. Чтение из файла и запись в файл производится построчно. Создадим простейший текстовый редактор, в который можно загрузить из файла уже существующий текст, отредактировать его и записать измененный текст в файл. Имя открываемого файла вводится в переменную ИмяФайла. Свободный номер для файла получается при помощи функции FreeFile и записывается в переменную Number.
UserForm_Initialize |
|
ToggleButton1_Click |
При установке переключателя отображается поле, в которое выводится текст из файла, а также отображается кнопка сохранить изменения? При снятии переключателя, поле и кнопка скрываются. |
Нажатие кнопки Сохранить изменения? запускает на выполнение процедуру CommandButton1_Click |
Записывает содержимое поля в файл |
Открытие и запись |
Процедуры считывают содержимое файла в поле и записывают содержимое поля в файл соответственно. |
Option Explicit
Dim imfile As String
Dim number As Integer
Private Sub CommandButton1_Click()
zapis
End Sub
Private Sub ToggleButton1_Click()
number = FreeFile
imfile = "d:\test.txt"
If ToggleButton1.Value = True Then
TextBox1.Visible = True
CommandButton1.Visible = True
otkr
End If
If ToggleButton1.Value = False Then
TextBox1.Visible = False
CommandButton1.Visible = True
End If
End Sub
Private Sub UserForm_Initialize()
With TextBox1
.MultiLine = True
.ScrollBars = fmScrollBarsBoth
.Visible = False
End With
ToggleButton1.TripleState = False
With CommandButton1
.WordWrap = True
.Visible = False
End With
UserForm1.Caption = "Файл последовательного доступа"
End Sub
Sub zapis()
Open imfile For Output As number
Print #number, TextBox1.Text
Close number
End Sub
Sub otkr()
Open imfile For Input As number
TextBox1.Text = Input(LOF(number), number)
Close number
End Sub
Произвольный доступ
При произвольном доступе файл рассматривается как последовательность строк фиксированной длины, причем при открытии указывается длина строки. Благодаря этому становится возможным переход на любую запись по номеру.
Реализуем простейшую базу данных, предназначенную для хранения информации о студентах: фамилии, имени и группе. Диалоговое окно Информация о студентах, а при выводе информации о текущем студенте – его имя и фамилия. При активизации диалогового окна доступными для пользователя являются только поле со списком и кнопка открытие файла. В поле со списком отображаются все файлы текущей папки с расширением dat. Пользователь может выбрать файл из этого списка или ввести в поле имя нового файла. После ввода имени файла поле со списком и кнопка открытие файла становятся недоступными для пользователя, а все остальные элементы управления, наоборот становятся доступными. На стандартном листе модуля описан пользовательский тип StudentType, который используется в модуле UserForm1 для объявления переменной данного типа. Эта переменная задает структуру в файле произвольного доступа. Имя открываемого или вновь создаваемого файла вводится в переменную imfile. Свободный номер для файла получается при помощи FreeFile и записывается в переменную Number.
UserForm_Initialize |
|
Нажатие кнопки Открытие файла запускает на выполнение процедуру CommandButton4_Click |
|
SpinButton1 |
|
Нажатие кнопки Новая запись запускает на выполнение процедуру CommandButton1_Click |
Создает новую запись в конце файла. |
Нажатие кнопки Записать изменения запускает на выполнение процедуру CommandButton2_Click |
Считывает из диалогового окна в текущую запись файла информацию при помощи процедуры ЗаписатьЗапись. |
Нажатие кнопки Закрыть запускает на выполнение процедуру CommandButton3_Click |
Закрывает открытый файл и диалоговое окно. |
Нажатие кнопки запускает на выполнение процедуру CommandButton5_Click |
Осуществляет переход на последнюю запись. |
Нажатие кнопки запускает на выполнение процедуру CommandButton6_Click |
Осуществляет переход на первую запись. |
ПоказатьЗапись |
Выводит в поля диалогового окна запись с номером, указанным в переменной ТекущаяЗапись |
ЗаписатьЗапись |
Записывает в файл из полей диалогового окна запись с номером, указанным в переменной Текущая Запись |
Option Explicit
Dim student As studtype
Dim dlfile As Long
Dim dlzapis As Long
Dim tekzap As Long
Dim endrec As Long
Dim imfile As String
Dim number As Integer
Sub Pokaz()
Get #number, tekzap, student
With student
TextBox1.Text = Trim(.fam)
TextBox2.Text = Trim(.imja)
TextBox3.Text = Trim(.gruppa)
TextBox4.Text = tekzap
'UserForm2.Caption = TextBox1.Text & " " & TextBox2.Text
End With
End Sub
Sub zapis()
With student
.fam = TextBox1.Text
.imja = TextBox2.Text
.gruppa = TextBox3.Text
End With
Put #number, tekzap, student
End Sub
Private Sub CommandButton1_Click()
UserForm2.Caption = "Информация о студентах"
endrec = endrec + 1
tekzap = endrec
With student
.fam = ""
.imja = ""
.gruppa = ""
End With
TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = CStr(endrec)
End Sub
Private Sub CommandButton2_Click()
zapis
Label4.Caption = "Номер записи из " & endrec
End Sub
Private Sub CommandButton3_Click()
Close #number
UserForm2.Hide
End Sub
Private Sub CommandButton4_Click()
Dim nach As Boolean
If ComboBox1.Text <> "" Then
upravlenie zap:=True, fil:=False
imfile = Trim(ComboBox1.Text)
dlzapis = Len(student)
number = FreeFile
Open imfile For Random As number Len = dlzapis
tekzap = 1
endrec = FileLen(imfile) / dlzapis
nach = True
If endrec = 0 Then
UserForm2.Caption = "Информация о студентах"
endrec = 1
nach = False
End If
Pokaz
If nach = False Then
UserForm2.Caption = " Информация о студентах "
End If
TextBox1.SetFocus
Label4.Caption = " Номер записи из " & endrec
Else
MsgBox "dfg", vbOKOnly, "Error"
End If
End Sub
Private Sub CommandButton5_Click()
tekzap = endrec
SpinButton1.Value = endrec
Pokaz
End Sub
Private Sub CommandButton6_Click()
SpinButton1.Value = 1
tekzap = 1
Pokaz
End Sub
Private Sub SpinButton1_Change()
SpinButton1.Min = 1
SpinButton1.Max = endrec
tekzap = SpinButton1.Value
Pokaz
End Sub
Private Sub UserForm_Initialize()
Dim papka, imfile As String
Dim dlputi, i As Integer
upravlenie zap:=False, fil:=True
UserForm2.Caption = " Информация о студентах "
Label4.Caption = " Номер записи "
ComboBox1.Clear
papka = CurDir
dlputi = Len(papka)
With Application.FileSearch
.FileName = "*.dat"
.SearchSubFolders = False
If .Execute(SortBy:=msoSortByFileName, sortorder:=msoSortOrderAscending) > 0 Then
For i = 1 To .FoundFiles.Count
imfile = Right(.FoundFiles(i), Len(.FoundFiles(i)) - dlputi - 1)
ComboBox1.AddItem imfile
Next i
End If
ComboBox1.ListIndex = 0
End With
End Sub
Sub upravlenie(zap As Boolean, fil As Boolean)
Dim element As Object
For Each element In Controls
element.Enabled = zap
Next element
CommandButton4.Enabled = fil
ComboBox1.Enabled = fil
End Sub
Самостоятельное задание
-
В рассмотренном приложении последовательно считывалась каждая запись из файла. Исправьте программу таким образом, чтобы записи обрабатывались как элементы массива и передавались на рабочий лист.
-
Обработайте все возможные ошибки при работе программы.