- •Содержание
- •1. Понятие о стандартных элементах управления
- •Добавление элементов управления в форму
- •Выбор имен для элементов управления
- •2. Основные свойства элементов управления
- •Позиция
- •Свойства BackColor, ForeColor, FillColor
- •Параметры шрифта
- •Доступность и видимость элемента управления
- •Свойство Enabled
- •Свойство Visible
- •Свойство Name
- •Внешний вид
- •3. Основные события Windows
- •4. Работа с текстом
- •4.1. Отображение текста в полях типа Label
- •4.2. Ввод текста в текстовые поля (TextBox)
- •Проверка введенных данных
- •5. Элементы управления для принятия решения
- •5.1. Кнопка (Элемент CommandButton)
- •5.2. Флажок (элемент Check Boxes)
- •5.3. Переключатель (элемент Option Button)
- •5.4. Список (Элемент ListBox)
- •Основные свойства, устанавливаемые в режиме проектирования
- •Методы элемента ListBox
- •Основные свойства, устанавливаемые в режиме разработки программы
- •Индексирование с помощью элемента ListBox
- •Локализация пункта элемента ListBox
- •5.5. Поле со списком (элемент ComboBox)
- •Установка начального значения
- •6. Элементы управления специального назначения
- •6.1. Полосы прокрутки (VscrollBar и HscrollBar)
- •Создание полосы прокрутки
- •Изменение величины перемещения
- •Отображение значения свойства Value на экране
- •6.2. Таймер (элемент управления Timer)
- •Работа с таймером
- •6.3. Рамка (элемент Frame)
- •7. Массив элементов управления
- •Преимущества массивов элементов управления
- •Создание массива элементов управления
- •Написание кода для массива элементов управления
- •8. Использование графики
- •Элемент ImageBox (Изображение)
- •Элемент PictureBox
- •Использование объекта Picture для вывода текста и графических элементов
- •Линии и контуры
- •9. Элементы управления файлами
- •Литература
Индексирование с помощью элемента ListBox
Ключевым свойством элемента ListBox является свойство ItemData - массив, подобный массиву List. Однако вместо строк, появляющихся в элементе, он содержит числа. Каждый пункт, отображаемый элементом ListBox. состоит из двух частей: строки задаваемой свойством List(i) и числа, задаваемого свойством ItemData(i) (здесь i- индекс пункта списка).
Свойство ItemData - это значение типа Long, которое может сохранять, числовую информацию любого типа, относящуюся к пункту списка, но не отображаемую в списке. Так в массиве List() можно сохранять список имен сотрудников, а в массиве ItemData() – данные об их зарплате. Доступ к записям о каждом сотруднике можно получать по имени, а зарплату отображать в элементе TextBox, помещенном на ту же форму.
Однако истинная ценность свойства ItemData состоит не в хранении дополнительной информации, относящейся к пункту. Действительно, единственного числа явно недостаточно для хранения существенной дополнительной информации. Предположим, необходимо поддерживать список имен и адресов. Хранить все эти записи в элементе ListBох непрактично: элемент должен быть слишком широким, чтобы вместить всю строку с именем, адресом, городом, номером телефона и т.д.
Практичнее хранить в элементе ListBox имена, используя их как ключи для доступа к элементам массива, в котором хранится остальная информация. Каждая запись хранится в элементе массива, соответствующем одному из пунктов элемента ListBox. Если установить значение свойства ItemData равным индексу соответствующего элемента массива данных, то при необходимости можно получить немедленный доступ к записям массива.
Этот подход применим и к файлам с произвольным доступом (значение свойства ItemData равно числу совпадающих записей). Такой подход демонстрируется в приложении KeyList.
Проект 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. Это происходит после добавления пользователем новой записи и щелчка на кнопке ОК. Можно отказаться от ввода новой записи, щелкнув на пункте списка.
