Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ch01.doc
Скачиваний:
15
Добавлен:
03.09.2019
Размер:
350.72 Кб
Скачать

Поле со списком и список

В этом разделе мы познакомимся с двумя элементами управления, достаточно близкими по функциональности. Это “Поле со списком” и “Список”. На панели элементов Active X (рис. 1.24) они располагаются в верхнем ряду.

Вначале мы рассмотрим ключевые свойства и методы элемента управления “Поле со списком”, а затем разберем практический пример, в котором будут продемонстрированы эти сведения. После этого отметим отличительные особенности элемента управления “Список” и перейдем к разбору нескольких практических ситуаций.

Итак, поле со списком (рис. 1.25) используется для работы со списком (набором) значений, и его особенность заключается в том, что в этом элементе управления до его активизации (что, производится щелчком мыши по стрелке) всегда отображается только одна строка. После активизации список значений раскрывается, и в нем с помощью мыши и автоматически появляющейся линейки прокрутки можно выбрать необходимый элемент.

ВНИМАНИЕ

Для каждой записи списка принято использовать термин элемент или элемент списка. Разумеется, элементы ActiveX относятся к другой категории и какой–то путаницы связанной с этим быть не должно.

Рис. 1.24. Панель элементов управления

Рис. 1.25. Элемент управления “Поле со списком”

Кроме свойства Name у элемента управления “Поле со списком” есть несколько характерных свойств.

Свойство ListIndex содержит номер текущего элемента списка (того, который подсвечен — на нем пользователь щелкнул мышкой). Нумерация элементов списка начинается с нуля. При этом если никакой элемент в списке не выделен, то значение свойства ListIndex равно –1, если выделен самый верхний элемент, то значение свойства равно нулю, следующий — единице и т.д.

Другое свойство ListCount содержит число элементов, внесенных в список, а свойство Text соответствует содержанию выделенного (выбранного) элемента.

Доступ к произвольному элементу списка может быть осуществлен с помощью свойства List(номер элемента).

Сами по себе названия перечисленных свойств ничего не говорят, поэтому дадим небольшое пояснение.

Будем считать, что список содержит четыре элемента (каким образом технически занести элементы в список мы далее рассмотрим на практическом примере). Если принять, что значение свойства Name рассматриваемого списка Spisok1, то доступ к самому верхнему элементу осуществляется с помощью конструкции — Spisok1.List(0). А если вы в процедуре хотите получить следующий элемент (второй сверху), то следует написать Spisok1.List(1).

Аналогично к последнему элементу списка можно получить доступ с помощью конструкции Spisok1.List(Spisok1.ListCount - 1).

Если же вам в программе необходимо просто получить содержимое выделенного элемента, то для этого можно написать — Spisok1.Text.

Теперь приведем наиболее используемые методы работы с элементом управления “Поле со списком”.

Метод Clear удаляет все элементы из списка и его синтаксис выглядит так: ИмяПоляСоСписком.Clear.

Другой метод AddItem добавляет элемент в список и его следует применять следующим образом:

ИмяПоляСоСписком.AddItem добавляемый элемент списка.

Противоположный ему по действию метод RemoveItem позволяет удалять элементы из списка:

RemoveItem номер удаляемого элемента.

После такой вводной информации перейдем к практической задаче. Дальнейшие действия лучше выполнять в новой книге Microsoft Excel. Если же вы решите продолжить работу в предыдущей (рис. 1.22), то в нее следует добавить еще один лист. Технически это выполняется с помощью контекстного меню, появляющегося при щелчке правой кнопкой мыши по ярлычку листа.

Для начала на рабочем листе необходимо создать фрагмент, представленный на рис. 1.26. Это элементы управления — кнопка, два поля со списком и два текстовых окна. Рядом с этими объектами в ячейках листа располагаются необходимые поясняющие подписи.

Рис. 1.26. Пример иллюстрирующий работу с элементом “Поле со списком”

Поясним функциональность листа Microsoft Excel представленного на рис. 1.26. Так, по кнопке с подписью Заполнить списки (это значение свойства Caption) заполняются информацией два поля со списком справа от нее. На рабочем листе над полями со списком расположены поясняющие фразы — Список менеджеров и Список контрагентов. При выборе (щелчком мыши) из списка конкретного менеджера он должен отражаться в соответствующем текстовом окне. Аналогичные действия производятся и с контрагентами — после выбора из списка контрагент отображается в соответствующем текстовом окне.

Для последующих программных процедур нам требуется определить значения свойства Name объектов на листе Microsoft Excel:

  • кнопка — ЗаполнитьСписки;

  • поле со списком менеджеров — Менеджеры;

  • поле со списком контрагентов — Контрагенты;

  • текстовое окно для отражения выбранного менеджера — Менеджер;

  • текстовое окно для отражения выбранного контрагента — Контрагент.

После задания имен объектов перейдем к реализации необходимой функциональности. Для заполнения полей со списками необходимо оформить процедуру обработки щелчка по кнопке Заполнить списки в виде представленном на листинге 1.2.

Листинг 1.2. Обработка щелчка по кнопке Заполнить списки

Private Sub ЗаполнитьСписки_Click()

Менеджеры.Clear

Менеджеры.AddItem "Иванов И.Д."

Менеджеры.AddItem "Петров В.Д."

Менеджеры.AddItem "Сидоров А.А."

Контрагенты.Clear

Контрагенты.AddItem "АО Стиль"

Контрагенты.AddItem "ООО Меда"

Контрагенты.AddItem "АО Мир"

End Sub

Теперь если перейти из редактора программного кода в Microsoft Excel, выйти из режима конструктора и щелкнуть по созданной кнопке на рабочем листе, то поля со списками будут заполнены, соответственно, фамилиями менеджеров и названиями контрагентов. Далее необходимо оформить процедуру Менеджеры_Click() для внесения информации в текстовое окно Менеджер при щелчке по элементу в поле со списком (листинг 1.3). В строке программного кода мы воспользовались свойством Text и для текстового окна, и для поля со списком. При этом для текстового окна это свойство определяет текст в окне, а для поля со списком содержание выбранного элемента списка.

Листинг 1.3. Обработка щелчка по полю со списком менеджеров

Private Sub Менеджеры_Click()

Менеджер.Text = Менеджеры.Text

End Sub

Аналогичным образом необходимо оформить процедуру обработки щелчка по полю со списком контрагентов (листинг 1.4).

Листинг 1.4. Обработка щелчка по полю со списком контрагентов

Private Sub Контрагенты_Click()

Контрагент.Text = Контрагенты.Text

End Sub

Итак, теперь разработка готова — мы разместили необходимые элементы управления и написали программный код. Далее следует вернуться в среду Microsoft Excel, выйти из режима конструктора и поработать с созданными элементами (рис. 1.27).

Рис. 1.27. Пример использования элемента управления “Поле со списком”

Похожим на элемент управления “Поле со списком” является другой элемент управления, который называется просто “Список”. На рис. 1.24 пиктограмма этого элемента расположена несколько правее пиктограммы поля со списком.

ПРИМЕЧАНИЕ

Элемент управления “Список” отличает то, что он занимает фиксированный размер на экране.

В качестве практического примера разберем следующую задачу. В плане алгоритма она будет заметно сложнее предыдущей разработки. Итак, создадим новую книгу Microsoft Excel и начнем выполнять в ней практические действия. На рабочем листе (рис. 1.28) расположим три элемента управления типа “Список”. Значения свойства Name у этих списков выберем (слева направо) следующие — List1, List2, List3. Левые два списка отводятся для перечней, соответственно, наборов продуктов и напитков. Правый список — это список заказов и он будет содержать выбранные пользователем продукты и напитки (из первых двух списков). На листе над всеми тремя списками располагаются поясняющие подписи (элементы управления типа “Надпись”). Понятно, что списки продуктов и напитков нужно как-то заполнить. Для этого расположим кнопку с подписью на ней — Заполнить списки. В этом и будет заключаться назначение кнопки. Значение свойства Name у кнопки менять не будем — оставим присвоенное средой по умолчанию.

Уточним требования к функциональности программной разработки. Для включения позиции в список заказов необходимо сделать двойной щелчок мышкой по любому из продуктов или напитков в одном из левых двух списков. Это будет приводить к переносу выбранного элемента списка в список заказов, а из списка продуктов (либо напитков) указанный элемент должен исчезнуть.

Сделаем одно ограничение для разработки — количество элементов в списке заказа не должно превышать трех. В этом случае, если мы добавляем новый элемент к трем уже присутствующим, то самый верхний (старый) автоматически должен удаляться из списка заказов. Соответственно новый элемент добавляется вниз списка.

Перейдем к рассмотрению первых процедур, которые потребуются. Учитывая описанные выше методы работы со списком, процедуру, выполняемую при щелчке по кнопке, следует оформить в виде, представленном на листинге 1.5.

Рис. 1.28. Пример демонстрирующий использование элемента управления “Список”

Листинг 1.5. Процедура заполнения списков щелчком по кнопке Заполнить списки

Private Sub CommandButton1_Click()

List1.Clear

List2.Clear

List3.Clear

List1.AddItem "Сыр"

List1.AddItem "Ветчина"

List1.AddItem "Колбаса"

List1.AddItem "Творог"

List1.AddItem "Сосиски"

List2.AddItem "Минеральная вода"

List2.AddItem "Ряженка"

List2.AddItem "Пепси-кола"

List2.AddItem "Лимонад"

List2.AddItem "Пиво"

End Sub

В соответствии с программным кодом данной процедуры все списки (List1, List2 и List3) сначала очищаются, а затем заполняются элементами. Если начальной очистки списков не делать, то при последующих щелчках по кнопке Заполнить списки они будут пополняться копиями уже присутствующих там элементов.

По условию задачи необходимо с помощью двойного щелчка по элементу списка продуктов выбранный таким образом элемент переносить в список заказов. В связи с этим в окне редактора кода в списке объектов следует выбрать List1, а затем в соседнем списке DblClick. В результате перед нами открывается процедура, которая автоматически выполняется при двойном щелчке по элементу списка. И ее следует оформить так, как представлено на листинге 1.6.

Листинг 1.6. Обработка двойного щелчка по списку продуктов

Private Sub List1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

If List3.ListCount < 3 Then

List3.AddItem List1.Text

List1.RemoveItem List1.ListIndex

Else

List3.RemoveItem 0

List3.AddItem List1.Text

List1.RemoveItem List1.ListIndex

End If

End Sub

В данном тексте присутствует ряд новых моментов. Так, здесь мы в первый раз встретились с оператором условия. Само условие записывается после ключевого слова If, а после конструкции условия необходимо поместить ключевое слово Then. Если указанное условие выполняется, то выполняются все строки между If и Else, а затем управление передается на первую строку процедуры после End If (в данном случае это окончание процедуры). Если же условие не выполняется, то выполняются строки процедуры между Else и End If.

Прокомментируем использование данного оператора в нашей процедуре. При условии, что количество элементов в списке заказов меньше трех, добавление следующего элемента в заказ достаточно очевидно. А именно, в третий список добавляется элемент, на котором производится двойной щелчок в списке продуктов. Технически это реализуется с помощью следующей строки программы:

List3.AddItem List1.Text

По условию задания переносимый элемент должен удаляться из списка продуктов, что реализуется следующим образом:

List1.RemoveItem List1.ListIndex

Здесь учитывается, что свойство ListIndex как раз и определяет номер выделенного элемента списка List1.

В случае если количество элементов в списке заказов достигает трех, то выполняется блок, начинающийся с ключевого слова Else (т.к. условие в операторе If в этом случае не выполняется). В этом фрагменте сначала удаляется начальный элемент из третьего списка (с индексом ноль). Затем производится перенос выбранного элемента из первого списка в третий список. Аналогичная процедура выполняется и при двойном щелчке по второму списку (листинг 1.7).

Листинг 1.7. Обработка двойного щелчка по списку напитков

Private Sub List2_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

If List3.ListCount < 3 Then

List3.AddItem List2.Text

List2.RemoveItem List2.ListIndex

Else

List3.RemoveItem 0

List3.AddItem List2.Text

List2.RemoveItem List2.ListIndex

End If

End Sub

Таким образом, программная разработка готова, и вы можете попробовать с ней поработать. На рис. 1.29 показан один из вариантов работы с данным листом.

Рис. 1.29. Вариант заполнения списка заказов

Теперь усложним задачу. Необходимо сделать так, чтобы из списка заказов (List3) при двойном щелчке по элементу списка он возвращался в список либо продуктов, либо напитков (в зависимости от того к какой категории он относится). Для решения данной задачи возможно несколько вариантов. Рассмотрим один из них — связанный с созданием на листе еще одного элемента управления “Список”, в который параллельно с внесением информации в список заказов будут записываться еще и признаки того, чем является очередной элемент — продуктом или напитком.

Фактически при переносе элемента в список заказов мы должны зафиксировать — откуда он пришел (из списка продуктов или из списка напитков). Поэтому к трем спискам на листе добавим еще один, в который при переносе элемента в список заказов будем программно синхронно записывать индикатор либо продукта, либо напитка (в зависимости от того, чем является элемент списка). Например, один из вариантов — в качестве индикатора для продуктов выбрать единицу, а в качестве индикатора напитков двойку. Этот четвертый список сделаем невидимым (для свойства Visible установим значение False) — его назначение чисто внутреннее (для программной процедуры). На рис. 1.30 показан модернизированный рабочий лист с четвертым списком. В связи с тем, что в приложении Microsoft Excel выбран режим конструктора, этот четвертый список виден на экране (если же выйти из режима конструктора, то пользователя он не будет отвлекать).

Приведем теперь программные процедуры, которые обеспечивают данный вариант функциональности листа. На листинге 1.8 представлена процедура, выполняемая при открытии книги (здесь мы добавили строку для очистки четвертого списка). Основная функциональность книги заключена в процедурах, выполняемых при двойных щелчках мышкой по спискам продуктов и напитков. На листинге 1.9 приведена процедура, выполняемая при двойном щелчке по списку продуктов. Здесь дополнительные операторы обеспечивают параллельное заполнение четвертого списка.

Рис. 1.30. Добавление дополнительного списка в разработку

Листинг 1.8. Заполнение данных в разработке, представленной на рис. 1.30

Private Sub CommandButton1_Click()

List1.Clear

List2.Clear

List3.Clear

List4.Clear

List1.AddItem "Сыр"

List1.AddItem "Ветчина"

List1.AddItem "Колбаса"

List1.AddItem "Творог"

List1.AddItem "Сосиски"

List2.AddItem "Минеральная вода"

List2.AddItem "Ряженка"

List2.AddItem "Пепси-кола"

List2.AddItem "Лимонад"

List2.AddItem "Пиво"

End Sub

Листинг 1.9. Обработка двойного щелчка по списку продуктов на рис. 1.30

Private Sub List1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

If List3.ListCount < 3 Then

List3.AddItem List1.Text

List1.RemoveItem List1.ListIndex

List4.AddItem "1"

Else

List3.RemoveItem 0

List3.AddItem List1.Text

List4.RemoveItem 0

List4.AddItem "1"

List1.RemoveItem List1.ListIndex

End If

End Sub

На листинге 1.10 представлена процедура, которая выполняется при двойном щелчке по списку напитков. В этом случае дополнительно в четвертый (невидимый) список заносится цифра 2.

Листинг 1.10. Обработка двойного щелчка по списку напитков на рис. 1.30

Private Sub List2_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

If List3.ListCount < 3 Then

List3.AddItem List2.Text

List2.RemoveItem List2.ListIndex

List4.AddItem "2"

Else

List3.RemoveItem 0

List3.AddItem List2.Text

List4.RemoveItem 0

List4.AddItem "2"

List2.RemoveItem List2.ListIndex

End If

End Sub

Таким образом, мы обеспечили новый вариант внесения информации в список заказов. Осталось привести процедуру (листинг 1.11) для возврата элемента из списка заказов (выполняется при двойном щелчке по необходимому элементу в списке заказов).

Листинг 1.11. Обработка двойного щелчка по списку заказов на рис. 1.30

Private Sub List3_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

If List4.List(List3.ListIndex) = "1" Then

List1.AddItem List3.Text

Num = List3.ListIndex

List3.RemoveItem Num

List4.RemoveItem Num

ElseIf List4.List(List3.ListIndex) = "2" Then

List2.AddItem List3.Text

Num = List3.ListIndex

List3.RemoveItem Num

List4.RemoveItem Num

End If

End Sub

Разработка готова (рис. 1.31) и теперь из списка заказов элементы при двойном щелчке мышкой возвращаются обратно (туда откуда пришли).

Рис. 1.31. Результат использования удаления элементов заказа

Рассмотрим еще один пример, связанный с добавлением и исключением элементов из списка. Мы разберем работу с элементами списка с использованием их индексов. Итак, создадим новую рабочую книгу и в левой части листа (рис. 1.32) разместим:

  • текстовое окно (ниже поясняющей подписи Название располагающейся в ячейке листа), значение свойства Name – Text1;

  • текстовое окно (ниже поясняющей подписи Номер в ячейке листа), значение свойства Name – Text2;

  • кнопка Включить в список, значение свойства Name – Com1;

  • список, значение свойства Name – List1.

Функциональность разработки связана с внесением в список названий блюд под определенным номером (какое–то блюдо на первое, какое–то на второе и т.д.). Пользователь должен набрать в соответствующих текстовых окнах название блюда и номер, под которым оно будет занесено в список заказов. Нумерация в элементе управления “Список” начинается с нуля, и при внесении первого элемента, его номер должен быть равен нулю. Следующий элемент может быть внесен выше (в этом случае следует указать 0 в качестве его номера) либо ниже предыдущего (номер равен 1). На листинге 1.12 представлена процедура, которая осуществляет данное действие. Здесь с помощью свойства ListCount элемента управления “Список” мы получаем число имеющихся названий блюд в списке. Оператор условия

If NumList > Num Then

позволяет выдать информационное сообщение в случае, если индекс для вводимого элемента списка является недопустимым.

Рис. 1.32. Пример с использованием индексов элементов списка

Листинг 1.12. Процедура обработки щелчка по кнопке Включить

Private Sub Com1_Click()

Num = List1.ListCount

NumList = CInt(Text2.Text)

If NumList > Num Then

MsgBox "Под таким номером включить элемент в список нельзя"

Else

List1.AddItem Text1.Text, NumList

End If

End Sub

На рис. 1.33 показан результат работы по внесению в список — описанными действиями сформирован перечень блюд в необходимом порядке. В данном случае использование индексов элементов списка позволило расположить записи о блюдах в определенных местах списка.

ПРИМЕЧАНИЕ

В тексте на листинге 1.12 мы встретились со стандартной функцией Visual Basic CInt(). Она позволяет преобразовать входное выражение в число целого типа. В этом случае выходное значение должно располагаться в интервале от -32768 до 32767. Также мы воспользовались функцией MsgBox, которая выводит на экран окно диалога. В данном случае мы использовали функцию без указания имеющихся у нее необязательных входных параметров. Поэтому вместо окна диалога на экран было выведено окно сообщения о невозможности включения элемента в список под указанным номером.

Рис. 1.33. Результат добавления (и исключения) элементов в списке

Теперь перейдем к правой стороне листа (рис. 1.33), которая предназначена для исключения блюд из списка. Данная часть листа выделена темным оттенком и снабжена дополнительным пояснением — Удаление из списка. Здесь размещены:

  • текстовое окно (ниже поясняющей подписи Номер в ячейке листа), значение свойства Name – Text3;

  • кнопка Удалить, значение свойства Name – Com2.

В процессе работы пользователю необходимо в данном текстовом окне указать индекс (номер) удаляемого элемента. На листинге 1.13 приведена процедура выполняемая по щелчку по кнопке Удалить. В результате мы получаем возможность исключения из списка определенных заказов под указанным номером.

Листинг 1.13. Процедура обработки щелчка по кнопке Удалить

Private Sub Com2_Click()

Num = List1.ListCount

NumList = CInt(Text3.Text)

If NumList >= Num Then

MsgBox "Под таким номером элемента в списке нет"

Else

List1.RemoveItem NumList

End If

End Sub

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]