Статьи

Текстовый файл, как база данных
(продолжение).

 

Шаг 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 гг.

Hosted by uCoz