Читайте также:
|
|
Приложение KeyList (рис. 5.4.4) предназначено для поддержки списка книг, индексированных по значению ISBN. Это приложение, конечно, примитивно и не соответствует требованиям, предъявляемым к базам данных. Для экономии места и времени информация хранится в массиве, а между сеансами сохраняется в файле на диске.
Рис.5.4.4. В приложении KeyList для поддержки индексированной информации используется элемент ListBox
Массив - удобная форма хранения нескольких сотен записей, но их сортировка - дело нелегкое. Вставка каждого пункта в соответствующий элемент массива требует копирования больших объемов данных. Чтобы вставить новый пункт в первый элемент массива, необходимо скопировать все пункты в следующую позицию массива. Поэтому следует, по возможности, избегать сортировки (особенно во время работы).
В приложении KeyList для поддержки отсортированных пунктов списка используется элемент ListBox В принципе, в этом элементе можно сохранить всю информацию (хотя это непрактично). Список следует использовать для хранения ключей, т е ISBN книг. Остальные поля можно сохранить в массиве.
Рис. 5.4.5. Массив ItemData связывает пункты списка элемента ListBox с элементами массива DataArray или записями файла с произвольным доступом
Единственное, что теперь необходимо, - связать номера ISBN с соответствующей информацией в массиве. В элементе ListBox эта связь обеспечивается с помощью свойства ItemData, представляющего собой массив чисел по одному на каждый пункт списка. Каждый пункт списка имеет значение (отображаемое в списке), к которому можно обратиться с помощью свойства List, и связанное с ним значение, не отображаемое в списке List, но к нему можно получить доступ с помощью свойства ItemData.
Первым элементом в списке является List1.List(0), а связанная с ним информация хранится в четвертом элементе массива. Этот индекс предоставляется свойством List1.ItemData(0) Свойство Sorted списка равно True, поэтому пользователь увидит ключи отсортированными, что позволит ему легко найти любой пункт списка List. Программисту же нет необходимости заботиться о поддержании порядка среди элементов массива, поскок доступ к ним осуществляется с помощью ключей в списке List элемента ListBox. Поэтому можно считать, что массив также отсортирован.
Программа позволяет вводить данные в различные поля. По завершении работы пользователь должен щелкнуть на кнопке ОК для подтверждения изменений (на рис 5.4.4 эта кнопка не видна, поскольку она появляется только во время ввода пользователем новой записи). Новая запись добавляется к массиву DataArray(), объявленному таким образом:
Dim DataArray(999,3) As String
Элемент DataArray(i, 0) хранит ISBN книги, элемент DataArray(i, 1)-список издателей DataArray(i, 2)-список авторов книги, DataArray(i, 3)-названия книг. Параметр i является индексом, хранящимся в свойстве ItemData списка. Ниже приведен код, исполняемый при щелчке на кнопке ОК.
Фрагмент программы. Кнопка ОК
Private Sub OKButton_Click()
Key = Trim(txtISBN.Text)
If Key = "" Then
MsgBox "Key field must be non-mepty"
‘(Ключевое поле не может быть пустым)
Exit Sub
End If
position = Search(Trim(txtISBN.Text))
If position >=0 Then
reply = MsgBox("Key exists. Replace existing record?", vbYesNo)
‘(Ключ существует. Заменить существующую запись?)
If reply = vbYes Then
List1.RemoveItem position
Else
txtISBN.SetFocus
Exit Sub
End If
End If
ArrayIndex = ArrayIndex + 1
List1.AddItem Key
List1.ItemData(List1.NewIndex) = ArrayIndex
DataArray(ArrayIndex, 1) = txtPublisher.Text
DataArray(ArrayIndex, 2) = txtAuthor.Text
DataArray(ArrayIndex, 3) = txtTitle.Text
List1.ListIndex = List1.NewIndex
ShowRecord
ShowButtons
End Sub
Программа читает данные, введенные пользователем в различные поля, производит поиск в списке с помощью функции Search() и определяет, существует ли запись с таким ключом. Далее она вставляет ключ в элемент ListBox сохраняет остальные поля в массиве DataArray(). Поскольку свойство Sorted списка List равно True, введенный пункт автоматически вставляется в соответствующую позицию списка. Переменная ArrayIndex является глобальной и указывает на последний элемент массива. При добавлении каждого нового элемента значение переменной ArrayIndex увеличивается на 1. Значение свойства ArraIndex сохраняется в массиве ItemData в позиции, соответствующей новому добавленному элементу. Следующее выражение является индексом нового добавленного в список элемента:
List1.NewIndex
Оно используется в операторе для выборки элемента массива ItemData, соответствующего новому пункту списка.
List1.ItemData(List1.NewIndex) = ArrayIndex
Массив ItemData списка List содержит ключи массива данных, поэтому при наличии ключа ISBN можно легко осуществить выборку названия книги или ее авторов. Каждый раз при щелчке на пункте списка элемента ListBox программа извлекает свойство ItemData этого пункта и использует его в качестве индекса для доступа к полю названия книги в массиве DataArray(). Ниже представлен код, осуществляющий выборку полей записи при выборе нового пункта списка.
Фрагмент программы. Отображение записи
Private Sub List1_MouseUp(Button As Integer,_
Shift As Integer, X As Single, Y As Single)
ShowRecord
End Sub
Sub ShowRecord()
If List1.ListIndex < 0 Then
txtISBN.Text = ""
txtPublisher.Text = ""
txtAuthor.Text = ""
txtTitle.Text = ""
Exit Sub
End If
ItemIndex = List1.ItemData(List1.ListIndex)
txtISBN.Text = List1.List(List1.ListIndex)
txtPublisher.Text = DataArray(ItemIndex, 1)
txtAuthor.Text = DataArray(ItemIndex, 2)
txtTitle.Text = DataArray(ItemIndex, 3)
End Sub
Если в списке не был выбран ни один пункт, то программа очищает содержимое всех полей. При выборе пункта программа отображает поля записи в соответствующих текстовых полях, вызывая для этого подпрограмму ShowRecords(), которая скрывает кнопки ОК и Cancel, а затем отображает кнопки Delete и Add New. Это происходит после добавления пользователем новой записи и щелчка на кнопке ОК. Можно отказаться от ввода новой записи, щелкнув на пункте списка.
Дата добавления: 2015-10-26; просмотров: 117 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Пример ListDemo | | | Рамка (элемент Frame) |