ЛАБОРАТОРНАЯ РАБОТА №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. Проверить пример.