Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Проект KeyList




Индексирование с помощью элемента ListBox

Ключевым свойством элемента ListBox является свойство ItemData - массив, подобный массиву List. Однако вместо строк, появляющихся в элементе, он содержит числа. Каждый пункт, отображаемый элементом ListBox. состоит из двух частей: строки задаваемой свойством List(i) и числа, задаваемого свойством ItemData(i) (здесь i- индекс пункта списка).

Свойство ItemData - это значение типа Long, которое может сохранять, числовую информацию любого типа, относящуюся к пункту списка, но не отображаемую в списке. Так в массиве List() можно сохранять список имен сотрудников, а в массиве ItemData() – данные об их зарплате. Доступ к записям о каждом сотруднике можно получать по имени, а зарплату отображать в элементе TextBox, помещенном на ту же форму.

Однако истинная ценность свойства ItemData состоит не в хранении дополнительной информации, относящейся к пункту. Действительно, единственного числа явно недостаточно для хранения существенной дополнительной информации. Предположим, необходимо поддерживать список имен и адресов. Хранить все эти записи в элементе ListBох непрактично: элемент должен быть слишком широким, чтобы вместить всю строку с именем, адресом, городом, номером телефона и т.д.

Практичнее хранить в элементе ListBox имена, используя их как ключи для доступа к элементам массива, в котором хранится остальная информация. Каждая запись хранится в элементе массива, соответствующем одному из пунктов элемента ListBox. Если установить значение свойства ItemData равным индексу соответствующего элемента массива данных, то при необходимости можно получить немедленный доступ к записям массива.

Этот подход применим и к файлам с произвольным доступом (значение свойства ItemData равно числу совпадающих записей). Такой подход демонстрируется в приложении KeyList.

Приложение KeyList (рис. 5.4.4) предназначено для поддержки списка книг, индексированных по значению ISBN. Это приложение, конечно, примитивно и не соответствует требованиям, предъявляемым к базам данных. Для экономии места и времени информация хранится в массиве, а между сеансами сохраняется в файле на диске.

Рис.5.4.4. В приложении KeyList для поддержки индексированной информации используется элемент ListBox

Массив - удобная форма хранения нескольких сотен записей, но их сортировка - дело нелегкое. Вставка каждого пункта в соответствующий элемент массива требует копирования больших объемов данных. Чтобы вставить новый пункт в первый элемент массива, необходимо скопировать все пункты в следующую позицию массива. Поэтому следует, по возможности, избегать сортировки (особенно во время работы).

В приложении KeyList для поддержки отсортированных пунктов списка используется элемент ListBox В принципе, в этом элементе можно сохранить всю информацию (хотя это непрактично). Список следует использовать для хранения ключей, т е ISBN книг. Остальные поля можно сохранить в массиве.

 
 

На рис. 5.4.5 показан способ хранения ключей в элементе ListBox, а соответствующих данных - в массиве. Элементы массива ItemData указывают на соответствующие им элементы в массиве данных, который может содержать множество полей.

Рис. 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. Это происходит после добавления пользователем новой записи и щелчка на кнопке ОК. Можно отказаться от ввода новой записи, щелкнув на пункте списка.




Поделиться с друзьями:


Дата добавления: 2014-12-23; Просмотров: 321; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.017 сек.