ЛАБОРАТОРНАЯ РАБОТА №5"Окно списков и списки данных"
Цели: 1) Изучить элемент "окно списков".
2) Изучить элемент "список данных".
Занятие #1.
~~~~~~~~~~~
Поговорим о списках. В Visual Basic реализованы два элеме-
нта, работающих со списками. Один - List Box (окно со спи-
ском), второй - ComboBox (комбинироанное окно со списком).
Посмотрите на рисунки ниже.
Видно, что "окно со списком" располагает какие-то элементы
в каком-то порядке, причем, эти элементы можно "отмечать",
ставя галочку около названия элемента. Если список не пом-
ещается в окне, то его можно прокручивать вверх, вниз.
Видно, что "комбинированное окно со списком" выводит в ок-
но один элемент, а остальные элементы можно выбрать из
"вываливающегося" (раскрывающегося) списка.
ListBox (окно со списком) - СВОЙСТВА.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Name - имя окна списка.
2. Columns - число столбцов в окне.
3. IntegralHeight - разрешение/запрещение частичного пока-
за элементов в окне (лог. свойство).
4. MultiSelect - правило выбора элементов пользователем:
0 - пользователь может выбрать только один элемент, 1 -
более одного элемента, 2 - более одного элемента с исп-
ользованием клавиш Shift, Ctrl.
5. Sorted - наличие/отсутствие сортировки элементов по ал-
фавиту (лог. свойство).
6. Style - формат окна: с "квадратиками" или без (лог. св-
ойство).
ListBox (окно со списком) - МЕТОДЫ.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1) .AddItem - добавить элемент в список.
2) .Clear - удалить все элементы из списка.
3) .RemoveItem - удаляет текущий элемент из списка.
4) .List(n) - выдает значение n-го элемента списка.
5) .ListIndex - индекс текущего элемента.
6) .Text - значение текущего элемента.
7) .NewIndex - индекс последнего выбранного элемента спис-
ка. Имеет смысл в том случае, когда пользователь выбрал
в списке более одного элемента.
8) .ItemData(Index) - присваивает элементу с указанным ин-
дексом число, которое становится связанным с этим элем-
ентом.
9) .ListCount - число элементов в списке.
10) .Selected - выбрал/не выбрал пользователь элемент
из списка (лог. метод)
Умная мысль.
~~~~~~~~~~~~
Почему свойств и методов у элемента ListBox (окно со спис-
ком) так много и чем они отличаются? Ну, тут все не так
просто. Свойства - это то, что у элемента есть; а методы -
это то, чем мы у элемента пользуемся. Например, у "окна со
списком" есть свойство columns (число столбцов) - мы можем
его задать, т.е. установить равным 1, 2, 3,... И у того же
элемента "окна со списком" есть метод .RemoveItem (удален-
ие одного элемента из списка) - мы можем его применить, т.
е. удалить из списка один из его элементов.
Различие между свойствами и методами настолько тонкое, что
его никто не сможет описать. (Поверьте мне, я пытался;-)))
Чисто визуально отличить свойство от метода можно так:
свойство метод
элемент.свойство=значение элемент.метод
Пример 1.
~~~~~~~~~
Допустим, что требуется создать программу для туристическ-
ого агентства, в которой клиенту предлагается список горо-
дов. Отмечая один или несколько городов пользователь (кли-
ент) должен сразу же видеть цену своего вояжа. Для придан-
ия программе универсальности необходимо предусмотреть воз-
можность добавления к списку новых городов с ценами их по-
сещения. Вот такая сильная программа...
На форме присутствуют следующие элементы: List1 (окно
со списком); Label1, Label2, Label3 (метки для вывода всп-
омогательной информации "Город", "Цена", "Стоимость турис-
тического тура"); txtCity, txtManyCity (текстовые окна для
ввода названия города и цены его посещения); cmdAddCity,
cmdExit (командные кнопки для добавления города в список и
выхода из программы).
Будете проверять пример - не перепутате...
Итак, теперь приступаем к самому главному - рассуждениям о
том, как запрограммировать все вышеупомянутые условия зад-
ачи. Во-первых, видно, что при загрузке формы в окне со
списком уже есть несколько городов. Это т. н. "неизменный
туристический набор", т. е. список городов, которые всегда
должны быть выведены в окно при старте программы.
Чтобы реализовать это, необходимо вставить код заполне-
ния списка в процедуру загрузки формы - Form_Load(). Мы
будем использовать методы окна со списком: .AddItem (доба-
вить элемент) и .ItemData(n) (связать число с элементом
списка).
Rem При загрузке формы
Private Sub Form_Load()
List1.AddItem "Берлин"
List1.ItemData(0) = 11
List1.AddItem "Берн"
List1.ItemData(1) = 22
List1.AddItem "Париж"
List1.ItemData(2) = 33
List1.AddItem "Марсель"
List1.ItemData(3) = 44
List1.AddItem "Копенгаген"
List1.ItemData(4) = 55
List1.AddItem "Осло"
List1.ItemData(5) = 66
List1.AddItem "Лондон"
List1.ItemData(6) = 77
List1.AddItem "Ливерпуль"
List1.ItemData(7) = 88
m = 0
End Sub
Во-вторых, надо разобраться с процедурой добавления нового
города (и его ценой посещения) в список. Процедура, отвеч-
ающая за это, будет называтся cmdAddCity_Click(). В ней
должны происходить два действия: 1) к списку элементов на-
до добавить новый город, название которого находится в те-
кстовом окне txtCity; 2) с этим элементом надо связать чи-
сло, расположенное в текстовом окне txtManyCity. Вот эта
процедура:
Rem Добавление нового города
Private Sub cmdAddCity_Click()
List1.AddItem txtCity
List1.ItemData(List1.ListCount - 1) = Val(txtManyCity)
End Sub
В-третьих, осталась самая сложная процедура - выбор город-
ов для туристического вояжа. Тут есть две проблемы: 1) где
хранить стоимость путешествия; 2) что делать, если пользо-
ватель сначала выберет город (ометит его), а потом переду-
мает (т.е. снимет галочку напротив него)?
Первая проблема решается просто. Необходимо завести перем-
енную (пусть, m типа double), обнулить ее в процедуре заг-
рузки формы в память и использовать для хранения стоимости
вояжа. Со второй проблемой несколько сложнее: каждый раз
при выборе элемента списка надо смотреть на факт "его выб-
рали отметив или сняв галочку". В первом случае к перемен-
ной m надо добавить число, связанное с этим элементом,
а во втором - отнять. Ой, перечитаете все еще разок... Ну,
прошу вас...
Option Explicit
Const s = "Ваше путешествие будет стоить вам ($) - "
Dim m As Double
Rem Выбор элемента
Private Sub List1_ItemCheck(Item As Integer)
If List1.Selected(Item) = True Then
m = m + List1.ItemData(Item)
Else
m = m - List1.ItemData(Item)
End If
Label3 = s & m
End Sub
Вот если вы не перечитали текст, изложенный выше, еще раз,
то вы нипочем не поймете, что первые три строки в коде -
относятся не к процедуре, а к области General Declaration,
в которой определяются переменные, общие для всех проце-
дур.
Последняя процедура, - cmdExit_Click(), - самая простая. В
ней происходит закрытие приложения. Отметим, что при
этом стоимость туристического тура, накопленная пользоват-
елем в переменной m, теряется.
Rem Выход из программы
Private Sub cmdExit_Click()
End
End Sub
Задания к лабораторной работе №5
занятие #1
1. Прочитать, законспектировать работу.
2. Проверить пример.
Занятие #2.
~~~~~~~~~~~
ComboBox (комбинированный список) - СВОЙСТВА.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Да, практически такие же, как у ListBox...
ComboBox (комбинированный список) - МЕТОДЫ.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Да, практически такие же, как у ListBox...
Естественно, что отличия между этими элементами все же ес-
ть. Иначе, зачем их два? Так, свойство Style (стиль) для
элемента ComboBox предполагает три вида окон:
1. 0 (DropDown Combo) - поле с раскрывающимся списком.
2. 1 (Simple Combo) - простое поле ввода со списком.
3. 2 (DrowDown List) - поле ввода со списком, превращающ-
ееся в раскрывающийся список, кот-
орый остается закрытым до тех пор,
пока пользователь не раскроет спи-
сок. Не бойтесь показаться глу-
пой(ым), эту фразу вообще никто не
понимает...
Смотрите на примеры.
Пример #2.
~~~~~~~~~~
Допустим, что необходимо организовать список из 10 элемен-
тов - птиц, которые обитают в нашем регионе, - причем семь
птиц в списке уже есть, а пользователю надо только ввес-
ти недостающие три птицы. По условию задачи на форме не
должно быть других элементов управления, кроме списков
и меток.
Да, пример надуман и его условие более чем странно, но как
правило именно такие нестандартные задачи и приходится ре-
шать программисту. Следите за моей мыслью...
Итак, на форме есть два элемента управления: 1) Label1 -
метка, в которую выведен текст "Введите название птицы и
нажмите enter" и 2) ComboBox1 (комбинированное окно) со
свойством Style=1 (простое поле ввода со списком). Чтобы
приложение имело вид как на рисунке выше, необходимо зане-
сти в список несколько элементов при загрузке формы.
Option Explicit
Dim i As Integer
Rem При загрузке формы
Private Sub Form_Load()
Combo1.AddItem "Соловей"
Combo1.AddItem "Зяблик"
Combo1.AddItem "Малиновка"
Combo1.AddItem "Сорока"
Combo1.AddItem "Ворона"
Combo1.AddItem "Воробей"
Combo1.AddItem "Синица"
i = 7
End Sub
Умная мысль.
~~~~~~~~~~~~
Понятно, что переменная i нужна для того, чтобы считать
число птиц. При каждом новом вводе i должна увеличиватся
на единицу и как только она станет равной 10 условие зада-
чи считается выполненым. Также, кстати, при каждом новом
вводе надо добавлять "новую" птицу к списку "старых". Пос-
мотрите сначала на процедуру и попытайтесь разобратся в
ней самостоятельно...
Private Sub Combo1_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
1 Combo1.AddItem Combo1.Text
2 Combo1.Text = ""
3 i = i + 1
4 If i = 10 Then Combo1.Enabled = False
End If
End Sub
Не получилось? Не отчаивайтесь... Давайте попытаемся разо-
браться. Итак, выше приведена процедура обработки нажа-
тия клавиши в окне ComboBox1. В процедуру приходит код на-
жатой клавиши - параметр KeyAscii. В процедуре мы проверя-
ем его на равенство числу 13 (коду enter): если KeyAscii
равен 13, то происходит четыре действия; если нет, то про-
цедура заканчивается.
Специально для вас (на что только не пойдешь!) четыре дей-
ствия, которые делает процедура, выделены красным цве-
том. Числа 1, 2, 3, 4 не являются частью кода - они в
нем только для вашего удобства. Итак, если пользователь
нажал enter, то мы:
1) Добавляем к списку элементов новый элемент, равный стр-
оке, введенной в поле ввода списка элементов.
Combo1.AddItem Combo1.Text
2) Cтираем элемент, который только что ввели в список
из поля ввода для того, чтобы пользователь мог ввести
новый элемент.
Сombo1.Text = ""
3) Накапливаем счетчик элементов.
i = i + 1
4) Проверяем счетчик. Как только он достигнет 10, то необ-
ходимо прекратить ввод новых элементов списка. Для это-
го можно заблокировать элемент ComboBox.
If i = 10 Then Combo1.Enabled = False
Задания к лабораторной работе №5
занятие #2
1. Прочитать, законспектировать работу.
2. Проверить пример.