среда, 2 октября 2013 г.

Создание элемента формы с помощью VBA на примере ListBox (списка)

Задача:  Создать поле «Популярные маршруты» (программа), добавить в него маршруты из созданной БД, пользующиеся наибольшим спросом.
      Реализацию проведем на предыдущем примере.

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


Пояснения
1. Не так сложно что-то создать на форме, как потом это использовать. Поэтому нам нужно имя элемента, к которому мы потом будем взывать. Собственно, для этого пишем Dim MyList As String. Имя моего листбокса - MyList. Открываем форму в режиме Конструктора(Дезигнера). «Форма», то как называется форма, ее имя.
2. Добавлением любого элемента на форму заведует CreateControl, т.е. создать управляющий элемент с параметрами (где, что, как). Где – на какой форме, что – какой элемент (это мог быть и список, и надпись, и текстовое поле), в деталях обычно – позиции по х и у.
3. Далее переменной j, которая содержит в себе указатель на мой ListBox, я присваиваю имя MyList, сохраняю и закрываю форму. А потом снова ее открываю уже для пользователя, т.е. сам пользователь лишен возможности наблюдать как моя форма в режиме конструктора лепит себе ListBox, а видит уже только результат.

4. Следующий пункт – заполнение ListBox данными. Данное событие я привяжу к загрузке формы. Т.е. чтобы создать ListBox на форме – вызываю модуль, а само заполнение всегда присутствует на форме автоматически. Чтобы это сделать открываю форму в режиме конструктора, выбираем обработка событий – программа и, собственно, код.
Код выполняется на загрузку формы. Уже известная нам история с рекордсетами. Чтобы что-то из таблицы взять, нам нужно получить к ней доступ. Объявляю и заполняю рекордсет rs инфой из «Маршрутов», перемещаюсь на первую запись.
5.  Для заполнения MyList необходимо обязательно указать какие там данные будут содержаться, за это отвечает функция RowSourceType, ее значения могу быть 1) список значений 2) таблица/запрос 3) поля. В данном случае, мне хватит просто списка значений, поэтому указываю "Value List".
6. Еще одно заклинание для MyList - MyList.RowSource = values – что я буду хранить – заголовки или значения? – выбираю значения.
7.  Организация цикла без счетчика i. Иногда цикл удобно организовывать от первой до последней записи с помощью EOF – end of file, т.е. конец.
8.        Цикл : пока не достигнут конец рекордсета (т.е. последней записи)
Условие: Поле [Процент_спроса] из рекордсета rs больше 0,1 (в данном случаем это означает больше 10%. Можно выставить, что угодно, но десятичное, потому как у нас процентный формат). Если условие выполняется добавляю Наименование маршрута в список и перехожу к следующей записи.
9.        И еще один вариант закрытия рекордсета. Можно Close, а можно очищать, присваивая Nothing.

 Результат:

Кст, если много раз вызывать модуль создания поля, они будут накладываться друг на друга. Возможно, это приведет к ошибке при загрузке формы, потому что все они будут иметь одно и тоже заданное нами имя. Поэтому при проверке своей работы, желательно в режиме Конструктора удалять эти поля, перед запуском модуля.




Комментариев нет:

Отправить комментарий