Шаг 5. Теперь займемся созданием класса, отвечающего за работу с записями. Снова обратимся к утилите для создания классов. Выберите меню Add-Ins/Class Builder Utility… В открывшемся мастере выберите меню File/New/Collection… В поле Name введите имя коллекции, в нашем случае - colDB. Справа в диалоговом окне выберите опцию New Class (т.е. коллекция будет основана на новом классе) и назовите класс clsDB. Подтвердите нажатием клавиши ОК. Не выходя из мастера, создадим и сам класс (меню File/New/Class…) и также нажмем кнопку ОК. Добавим свойства в класс clsDB: LastName, FirstName, Number, ID. Для добавления каждого свойства выбирается меню File/New/Property…, заносится имя и тип (в данном случае для первых трех – String, для последнего – Integer. После этого мастер можно закрыть. Когда он запросит сохранение введенной информации – подтвердите это. В автоматически созданном коде, необходимо провести небольшуюю корректировку – удалить все, что относится к свойству Key, созданному автоматически по-умолчанию. В итоге получим:
Класс clsDB, со следующим кодом
Option Explicit
'****************************************************
'Internal
variables
'****************************************************
Private mvarLastName As String
Private mvarFirstName As String
Private mvarNumber As String
Private mvarID As Integer
'****************************************************
'Properties
'****************************************************
Public Property Let ID(ByVal vData As Integer)
mvarID = vData
End Property
Public Property Get ID() As Integer
ID = mvarID
End Property
Public Property Let Number(ByVal vData As String)
mvarNumber = vData
End Property
Public Property Get Number() As String
Number = mvarNumber
End Property
Public Property Let FirstName(ByVal vData As String)
mvarFirstName = vData
End Property
Public Property Get FirstName() As String
FirstName = mvarFirstName
End Property
Public Property Let LastName(ByVal vData As String)
mvarLastName = vData
End Property
Public Property Get LastName() As String
LastName = mvarLastName
End Property
И коллекцию colDB
Option Explicit
'****************************************************
'Внутренние
переменные
'****************************************************
Private mCol As Collection
'****************************************************
'Методы
'****************************************************
Public
Function Add(LastName As String, FirstName As String, _
Number As String, ID As Integer) As clsDB
'создаем новый объект
Dim objNewMember As clsDB
Set objNewMember = New clsDB
'set the properties passed into the method
objNewMember.LastName = LastName
objNewMember.FirstName = FirstName
objNewMember.Number = Number
objNewMember.ID = ID
mCol.Add objNewMember
'возвращаем созданный объект
Set Add = objNewMember
'а теперь освобождаем память
Set objNewMember = Nothing
End Function
Public Sub Remove(vntIndexKey As Variant)
mCol.Remove vntIndexKey
End Sub
'****************************************************
'Свойства
'****************************************************
Public Property Get Item(vntIndexKey As Variant) As clsDB
Set Item = mCol(vntIndexKey)
End Property
Public Property Get Count() As Long
Count = mCol.Count
End Property
Public Property Get NewEnum() As IUnknown
Set NewEnum = mCol.[_NewEnum]
End Property
'****************************************************
'Инициализация
и закрытие
коллекции
'****************************************************
Private Sub Class_Initialize()
Set mCol = New Collection
End Sub
Private Sub Class_Terminate()
Set mCol = Nothing
End Sub
Шаг 6. Перейдем в форму. В разделе деклараций объявим новую переменную, опирающуся на только что созданную коллекцию colDB.
Private colTxtDB As colDB 'объектная модель БД
А в код добавим строку:
Set colTxtDB = New colDB
Вот, собственно говоря, и все для создания нового пустого файла для базы данных.
Шаг 7. Теперь напишем код пересылки данных из объектной модели БД в текстовые поля формы.
Private Sub DBInForm(Index As Integer)
txtLastName.Text = colTxtDB(Index).LastName
txtFirstName.Text = colTxtDB(Index).FirstName
txtNumber.Text = colTxtDB(Index).Number
lblID.Caption = "Номер записи: " & colTxtDB(Index).ID
End Sub
Шаг 8. Создадим код для кнопок редактирования.
Для кнопки "Добавить" запись: Увеличиваем счетчик общего количества записей на 1, текущую запись нумеруем последней, используем метод Add из коллекции colDB и пересылаем данные в форму.
CountEntries = CountEntries + 1
CurrentEntries = CountEntries
colTxtDB.Add txtLastName.Text, txtFirstName.Text, txtNumber.Text, CurrentEntries
DBInForm CurrentEntries
Для кнопки "Изменить" запись: присваиваем новые значения в БД из каждого поля и пересылаем данные в форму.
If CountEntries = 0 Then Exit Sub
colTxtDB(CurrentEntries).LastName = txtLastName.Text
colTxtDB(CurrentEntries).FirstName = txtFirstName.Text
colTxtDB(CurrentEntries).Number = txtNumber.Text
DBInForm CurrentEntries
Для кнопки "Удалить" запись: после подтверждения удаления из БД удаляем текущую запись. Если запись была последней, переходим к предпоследней, в противном случае она автоматически становится следующей. Уменьшаем счетчик общего количества записей на 1 и пересылаем текущую запись в форму.
If CountEntries = 0 Then Exit Sub
If
MsgBox("Удалить текущую
запись?",
vbYesNo + vbDefaultButton2 + vbQuestion, _
"Удаление
записи") = vbYes Then
colTxtDB.Remove CurrentEntries
If CurrentEntries = CountEntries Then
CurrentEntries = CurrentEntries - 1
End If
CountEntries = CountEntries - 1
DBInForm CurrentEntries
End If
Здесь же необходимо позаботиться об отслеживании изменений в БД. Для этого в разделе деклараций объявим переменную-флаг:
Private flagChange As Boolean
И в коде, после всех манипуляций с кнопками редактирования, этот флаг установим.
flagChange=True
К этой переменной мы будем обращаться при закрытии файла для сохранения измененных записей.
Шаг
9. Вернемся
к кнопкам cmdDB. Опишем
код для
открытия уже
существующего
файла.
Начальная
часть кода,
работа с
классом clsCommonDialog остается
той же самой,
а вот работа с
FSO – будет
отличаться.
Создаем
новую
коллекцию colTxtDB
Set colTxtDB = New colDB
Сначала откроем текстовый поток
Set tsOpen = fso.OpenTextFile(.FileName, ForReading)
Затем считаем первую строку из файла, которая будет содержать информацию о количестве записей в БД.
CountEntries = tsOpen.ReadLine
Далее в цикле For-Next считываем все записи и с помощью метода Add добавляем их (не забудте объявить внутренние переменные для этой манипуляции)
For i = 1 To CountEntries
strLastname = tsOpen.ReadLine
strFirstName = tsOpen.ReadLine
strNumber = tsOpen.ReadLine
intID = tsOpen.ReadLine
colTxtDB.Add strLastname, strFirstName, strNumber, intID
Next
После считывания информации не забудте закрыть файл
tsOpen.Close
Изменяем заголовок файла, текущую запись делаем первой и пересылаем ее в БД.
Caption = "Demo FSO as DB (" & .FileTitle & ")"
CurrentEntries = 1
DBInForm CurrentEntries
Шаг 10. Далее необходимо позаботиться о сохранении информации. Для этого создадим процедуру CloseFile. Для того, чтобы она заработала необходимо изменение flagChange и подтверждение сохранения пользователем. Работа с диалоговым окном та же самая, несколько изменится заголовок и используется метод ShowSave, вместо ShowOpen.
If flagChange Then 'если были произведены изменения в БД
If MsgBox("Сохранить
произведенные
изменения в
базе данных?",
_
vbYesNo + vbQuestion, "Закрытие
программы") = vbYes
Then
With dlgDb
.DialogTitle = "Сохранение текстовой БД"
.Filter = "Текстовые БД (*.tdb)|*.tdb"
.FilterIndex = 1
.ShowSave
Далее открываем текстовый поток для записи и записываем первую строку – количество записей.
Set tsSave = fso.OpenTextFile(.FileName, ForWriting)
tsSave.WriteLine CountEntries
Последовательно записываем все записи и закрываем файл. Флаг изменений устанавливаем в False.
For i = 1 To CountEntries
tsSave.WriteLine colTxtDB(i).LastName
tsSave.WriteLine colTxtDB(i).FirstName
tsSave.WriteLine colTxtDB(i).Number
tsSave.WriteLine colTxtDB(i).ID
Next
tsSave.Close
End With
End If
End If
flagChange = False
Шаг 11. В кодах для кнопок создания и открытия файлов внесем проверку на уже открытый файл. Если открыт – закрываем его и уничтожаем объект коллекции.
If Len(Caption) > 14 Then 'надпись длиннее чем "Demo FSO as DB"
CloseFile
Set colTxtDB = Nothing
End If
Шаг 12. При выходе из программы сохраняем файл и обнуляем все объекты
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
CloseFile
'очистка памяти
Set colTxtDB = Nothing
Set tsOpen = Nothing
Set tsSave = Nothing
Set tsNew = Nothing
Set fso = Nothing
End Sub
Шаг 13. Осталось совсем чуть-чуть написать код для передвижения по записям. Производим позиционирование текущей записи:
Переход к первой записи
CurrentEntries = 1
Переход к последней записи
CurrentEntries = CountEntries
Переход к предыдущей записи
CurrentEntries = CurrentEntries - 1
Переход к следующей записи
CurrentEntries = CurrentEntries + 1
Далее делаем проверку, чтобы номер записи не выходил за диапазон базы данных.
If CurrentEntries < 1 Then
CurrentEntries = 1
ElseIf CurrentEntries > CountEntries Then
CurrentEntries = CountEntries
End If
И наконец пересылаем текущую запись в форму.
DBInForm CurrentEntries
Сравните полученные у Вас записи с кодами
Поле для деятельности у Вас еще есть (можно, например, создать кнопку промежуточного сохранения БД или кнопку "Сохранить как…"), но основа для работы уже создана.
2000-2001 гг.