МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Практическая работа по теме 2. Технические и программные средства реализации информационных процессов Класс System.String: свойства и методы. Использование элементов управления для построения интерфейса пользователя. Способы взаимодействия с пользователем. Классы .NET для организации взаимодействия с пользователем. Практическая работа по теме 2. Технические и программные средства реализации информационных процессов ........................................................................................................1 Задание 1. Свойства и методы класса System.String ..............................................................1 Задание 2. Элементы управления...........................................................................................14 Задание 3. Способы взаимодействия с пользователем ........................................................19 Задание 4. Классы .NET для организации взаимодействия с пользователем ....................21 Задание 1. Свойства и методы класса System.String Задача Научиться работать со строками: объединять строки, извлекать подстроку, создавать строку из повторяющегося символа, изменять регистр символов, разбивать строки на слова и так далее, другими словами, изучить свойства и методы класса System.String. Решение Рассмотреть наиболее востребованные приемы по обработке строк и символов. Обсуждение Строки – один из главных компонентов большинства приложений. Обработка строк позволяет проверять вводимую пользователем информацию, искать специфические слова или шаблоны в блоках текста, инициировать диалог с пользователем. Для работы с символьными данными в Visual Basic .NET имеется два типа данных Char и String. Тип Char может хранить только один символ, переменные типа String могут хранить группу символов, в общей сложности до 2 Гбайт текста. Нумерация символов, из которых состоит строка, начинается с нуля. Последовательность символов, присваиваемая строковой или символьной переменной, МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE должна быть окружена двойными кавычками, а для переменной типа Char заканчиваться символом «с» после кавычек: Dim str As String = "Это строка" Dim c As Char = “A”c ’ символ «с» указывает на тип Char Dim ch As Char = ”*”c В VB .NET строки могут быть представлены как объекты одного из классов: System.Text.StringBuilder или System.String. Рассмотрим представление строк как экземпляров класса System .String. Класс System .String – это не просто массив символов, класс располагает множеством свойств и методов для поиска, замены и анализа текста, реализующих наиболее востребованные приемы обработки строк. Самостоятельно Операция конкатенации применяется для объединения нескольких строк в одну. Оператор конкатенации обозначается символом “&”. При применении оператора к двум строкам вторая из этих строк добавляется непосредственно в конец первой строки (сцепляется). В результате получается более длинная строка, содержащая целиком обе исходные строки. Например, при выполнении оператора str2 = "Visual " & "Basic.NET" в переменную str2 будет записана строка "Visual Basic .NET". Для выполнения операции конкатенация можно использовать также оператор &= и метод класса String.Concat. Оператор &= позволяет присвоить результат конкатенации строк первой участвующей в операции переменной str2 &= " – новая платформа". Метод Concat – это метод класса String, выполняющий те же операции, что и оператор &. Метод Concat возвращает строку символов, которая является конкатенацией всех его параметров. str3 = String.Concat("Visual ", "Basic", ".NET") Самостоятельно создайте консольное приложение для исследования конкатенации строк. МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Sub Main() Dim str2, str3, str4 As String str2 = "Visual " & "Basic.NET" str3 = String.Concat("Visual ", "Basic", ".NET") str4 = "2*5=" str4 &= 2 * 5 Console.WriteLine(str2) Console.WriteLine(str3) Console.WriteLine(str4) Console.ReadLine() End Sub Для объединения строк вместо оператора & можно использовать оператор +, но это не рекомендуется, так как если при конкатенации строк оператором + одно из значений не будет являться строкой, VB .NET попытается привести оба значения к типу Double и выполнить численное сложение. Продемонстрируйте верность последнего утверждения. Самостоятельно Сконструируйте консольное приложение для изучения следующего вопроса. При работе со строками и символами часто возникает проблема «кавычек». Как ввести в строку кавычки? Для того чтобы вставить в строку кавычки, можно использовать две двойные кавычки подряд: Sub Main() Dim str As String str = "Языки программирования-это тоже ""языки"", но формальные" Console.WriteLine(str) Console.ReadLine() End Sub Добавление перед кавычкой еще одной, информирует компилятор о том, что очередная кавычка не выполняет функцию символа окончания строки, а является лишь очередным символом. Можно чередовать разные кавычки: двойные и одинарные, но, так как одинарная кавычка является указателем комментария к коду программы, то начинать строку следует с двойной кавычки: Sub Main() Dim str As String str = "Языки программирования - это тоже 'языки', но формальные" Console.WriteLine(str) Console.ReadLine() МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE End Sub Другим способом размещения в строке кавычки является конкатенация со строкой свойства Quote класса ControlChars. Sub Main() Dim str As String str = "Языки программирования - это тоже" & ControlChars.Quote & "языки" & ControlChars.Quote & ", но формальные" Console.WriteLine(str) Console.ReadLine() End Sub Сформируйте и организуйте вывод в консоль собственные фразы, требующие применения кавычек. Самостоятельно Разработайте консольное приложение для перебора всех символов строки. Задача обработки всех символов строки по отдельности имеет более одного решения. Один из вариантов решения – использовать цикл For Each..Next Sub Main() Dim str As String str = "VISUAL BASIC.NET" Dim ch As Char For Each ch In str Console.WriteLine(ch) Next Console.WriteLine(str) Console.ReadLine() End Sub Можно перебрать все символы строки другим способом, используя индексированное свойство класса String.Chars(i): МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Sub Main() Dim str As String str = "MS VB.NET" Dim i As Integer For i = 0 To str.Length - 1 Console.WriteLine(str.Chars(i)) Next Console.WriteLine(str) Console.ReadLine() End Sub В коде программы использованы свойства Chars и Length класса String. Свойство Chars возвращает символ, стоящий в указанной позиции. Причем первому символу в строке соответствует нулевое значение индекса. Свойство только для чтения. Свойство Length – свойство только для чтения, возвращает длину строки как целое число. Обратите внимание на способ организации цикла при переборе символов строки. Так как нумерация символов строки начинается с 0, цикл For Next организован с нуля до значения длины строки без 1. Самостоятельно Извлекая из строки символ, вы имеете не полный объект String, а объект типа Char. Char – это простой размерный тип, представляющий единственный символ. Класс Char имеет методы, позволяющие получить информацию о конкретном символе: IsDigit (возвращает True, если символ – цифра от 0 до 9), IsNumber, IsLetter, IsLetterOrDigit, IsLower и IsUpper, IsPunctuation, IsSymbol IsWhiteSpace. Эти методы удобно использовать для анализа отдельных символов или символов строки. Сконструируйте консоль, позволяющую подсчитывать количество букв, цифр и знаков пунктуации в строке. Sub Main() Dim str As String Dim ch As Char str = "MS VB.NET 123" Dim letter, digit, punctuation As Byte For Each ch In str МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE If Char.IsLetter(ch) = True Then letter += 1 If Char.IsDigit(ch) = True Then digit += 1 If Char.IsPunctuation(ch) = True Then punctuation += 1 Next Console.WriteLine(str) Console.WriteLine("В строке " & letter & " букв") Console.WriteLine("В строке " & digit & " цифр") Console.WriteLine("В строке " & punctuation & " знаков пунктуации") Console.ReadLine() End Sub Внесите изменения в программу: 1. Организуйте ввод строки пользователем непосредственно из консоли. 2. Подсчитайте количество пробелов, строчных букв, прописных букв в строке. 3. Создайте Windows-приложение с текстовым окном и командной кнопкой для выполнения подсчета введенных в текстовом окне символов. У текстового окна включите режим MultiLine=True. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim str As String = TextBox1.Text Dim ch As Char Dim letter, digit, punctuation As Byte For Each ch In str If Char.IsLetter(ch) = True Then letter += 1 If Char.IsDigit(ch) = True Then digit += 1 If Char.IsPunctuation(ch) = True Then punctuation += 1 Next MsgBox("В строке " & letter & " букв") MsgBox("В строке " & digit & " цифр") MsgBox("В строке " & punctuation & " знаков пунктуации") End Sub МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Самостоятельно Реализуйте исследование метода Equals класса String, выполняющего сравнение строк. Исследование можно сделать как в консоли, так и в Windows форме. Сравнение двух строк можно выполнить одной из реализаций перегруженного метода Equals класса String. String. Equals(a,b) – сравнивает строки a и b; строка1.Equals(строка2) – сравнивают указанную строку строка2 с текущей строкой1; строка1. Equals(объект) – сравнивает объект с текущей строкой1. Следующий код демонстрирует результат работы метода Equals. Sub Main() Dim str1 As String = "Привет" Dim str2 As String = "привет" Dim str3 As String = "Привет" If String.Equals(str1, str2) Then Console.WriteLine("равны") Else Console.WriteLine("не равны") End If If str1.Equals(str3) Then Console.WriteLine("равны") Else Console.WriteLine("не равны") End If Console.ReadLine() End Sub End Module Самостоятельно Используя New, перегруженный конструктор класса String, принимающий единственный символ и число его повторов, можно повторить многократно любой символ: Dim Dashes As New String(“-“c, 100) Спроектируйте любой интерфейс для работы с перегруженным конструктором класса String. МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Самостоятельно Для работы с частью строк можно использовать метод Substring (подстрока) класса String, который возвращает символы, начинающиеся с определенной позиции в строке. Чтобы использовать метод Substring, нужно передать ему номер (индекс) позиции, с которой начинается подстрока, и количество извлекаемых символов. Если второй из этих аргументов пропущен, то Substring возвратит все символы строки, начиная от указанного индекса и до конца строки: Строка. Substring (startIndex, [length]) Например, при исполнении следующего кода, который вы самостоятельно оформите в виде консольного приложения, последовательно выводятся две строки ”Программирование” и “Visual Basic.Net” Module Module1 Sub Main() Dim str As String = "Программирование в Visual Basic.Net" Console.WriteLine(str.Substring(0, 15)) Console.WriteLine(str.Substring(19)) Console.ReadLine() End Sub End Module Самостоятельно создайте Windows приложение с двумя текстовыми окнами и командной кнопкой, щелчок по которой выполняет перезапись части строки из одного текстового окна в другое. Самостоятельно Для поиска в тексте слов можно использовать метод IndexOf (индекс для…): Строка.IndexOf(СтрокаПоиска, [НачИндекс], [КонИндекс]) Метод имеет несколько параметров, но в самой простой форме IndexOf принимает строку поиска и возвращает индекс того места в строке, где начинается эта подстрока (первое включение). Второй параметр указывает индекс, с которого нужно начинать поиск, третий параметр указывает, где заканчивается поиск. Второй и третий параметры не являются обязательными. Если метод IndexOf не может найти нужную строку, то он возвращает значение -1. Следует помнить, что методы строкового поиска чувствительны к регистру символов. МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Module Module1 Sub Main() Dim str As String = "В среду состоится лекция по программированию. " Dim str1 As String, i As Integer, k As Integer, m As Integer i = str.IndexOf("лекция") k = str.IndexOf("с", 3) m = str.IndexOf("прог", 5, 12) Console.WriteLine(i) Console.WriteLine(k) Console.WriteLine(m) Console.ReadLine() End Sub End Module В нашем примере i должно получить значение 18, k получит значение 8 , хотя в строке буква с первый раз встречается в позиции 2, но сам поиск начинается с позиции 3. Самостоятельно докажите и дайте объяснение, что поиск символов прог при указанных параметрах метода будет безуспешным. Как изменить ситуацию, чтобы поиск был успешным? Организуйте ввод исходной строки, и подстроки для поиска с консоли. Вывод результатов поиска должен быть организован с необходимыми пояснениями пользователю. Самостоятельно Метод Insert класса String вставляет указанную строку value в данную строку, начиная с указанной позиции startIndex: Строка. Insert (startIndex, value) Module Module1 Sub Main() Dim str As String = "Это дело житейское. " Dim res As String Dim value As String = "пустяки," res = str.Insert(4, value) Console.WriteLine(res) Console.ReadLine() End Sub End Module Убедитесь, что после выполнения этого фрагмента переменной res будет присвоено значение “Это пустяки, дело житейское.”. МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Самостоятельно Метод Replace класса String используется для замены всех вхождений указанного символа или подстроки на другой символ или подстроку: Строка. Replace(oldValue, newValue) Module Module1 Sub Main() Dim str As String = "Ближе к делу. " Dim res, s As String res = str.Replace("делу", "телу") s = "dingdong".Replace("d", "k") Console.WriteLine(res) Console.WriteLine(s) Console.ReadLine() End Sub End Module Измените, строки поиска и замены на собственные и продемонстрируйте работу консольного приложения и функции Replace. Самостоятельно Метод Remove позволяет удалить из строки указанное число символов count, начиная с позиции startIndex : Строка.Remove (startIndex, count) Например, в следующем коде переменной res присваивается значение “Это дело житейское”. Module Module1 Sub Main() Dim str As String = "Это пустяки, дело житейское" Dim res As String res = str.Remove(4, 9) Console.WriteLine(res) Console.ReadLine() End Sub End Module Измените тип приложения для тестирования функциональности метода Remove. МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Самостоятельно Методы StartsWith и EndsWith проверяют, начинается или заканчивается данная строка с указанной подстроки value. Результатом выполнения метода является логическое значение. Module Module1 Sub Main() Dim str As String = "Оценка – 5 (отл.)" If str.StartsWith("Оц") Then Console.WriteLine("Правильное начало") End If If str.EndsWith("(отл.)") Then Console.WriteLine("Замечательный конец") End If Console.ReadLine() End Sub End Module Продемонстрируйте работу методов StartsWith собственных примерах строковых данных. и EndsWith на Самостоятельно Методы ToLower и ToUpper возвращают копии исходной строки, в которой все буквы являются прописными и строчными, соответственно. Исследуйте методы самостоятельно в любом из приложений. Пример консоли приведен ниже. Sub Main() Dim str As String = "Привет" Console.WriteLine(str.ToLower) ' выводится: привет Console.WriteLine(str.ToUpper) ' выводится: ПРИВЕТ Console.ReadLine() End Sub Самостоятельно Первая реализация перегруженного метода Trim удаляет все пробелы из начала и конца строки, а вторая – все вхождения специфицированных в массиве trimChars символов: Строка. Trim() Строка. Trim(trimChars) Методы TrimStart и TrimEnd удаляют все вхождения специфицированных в массиве trimChars символов из начала и конца строки, соответственно: Строка. TrimStart (trimChars) МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Строка. TrimEnd (trimChars) В следующем примере показаны примеры работы методов усечения строки. Sub Main() Dim str1 As String = " Привет " Dim str2 As String = "####Привет&&&&###" Console.WriteLine(str1.Trim()) ' выводится: Привет Console.WriteLine(str2.Trim("#")) ' выводится: Привет&&&& Console.WriteLine(str2.Trim("#", "&")) ' выводится: Привет Console.WriteLine(str2.TrimStart("#")) ' выводится: Привет&&&&###” Console.WriteLine(str2.TrimEnd("#", "&")) ' выводится: ####Привет Console.ReadLine() End Sub Самостоятельно выполните сравнение двух строк, отличающихся наличием пробелов, до их устранения в строке и после. Самостоятельно Первая реализация перегруженного метода Split разбивает строки на подстроки посредством символов, заданных в массиве separators. Во второй реализации метода, кроме того, указано максимальное число возвращаемых подстрок count: Строка. Split(separator()) Строка. Split(separator(),count) Построим консольное приложение для исследования функции Split. Module Module1 Sub Main() Dim separators() As Char = {" "c, ","c} 'В качестве разделителей возьмем символ пробела и запятую Dim Mystr As String = " Это пустяки, дело житейское" Dim i As Integer Dim results() As String ' Объявляется массив для хранения строк results = Mystr.Split(separators) For i = 0 To results.GetUpperBound(0) ' Счет выполняется до верхней границы массива. Обратите внимание на функцию GetUpperBound(0), возвращающую, верхнюю границу массива: функция имеет входной параметр, указывающий размерность массива, в нашем случае массив-строка. МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE If results(i) <> "" Then Console.WriteLine(results(i)) Next i Console.ReadLine() End Sub End Module К сожалению, в случае использования массива разделителей, включающего пробел, в итоговом массиве строк появятся пустые строки, которые следует удалять, например, способом, предложенным в упражнении, выполненном ранее. Измените, символ разделителя, попробуйте использовать перегруженный метод Split с указанием количества подстрок. Самостоятельно Функция Join делает работу, обратную той, что выполняет функция Split: она объединяет элементы массива в строку, добавляя при этом разделители. В качестве разделителя можно использовать любой символ, например, пробел. String.Join(разделитель, strArray) Module Module1 Sub Main() Dim Mystr() As String = {"студенты", "3", "курса", " группы", "143"} Dim results As String results = String.Join("/"с, Mystr) Console.WriteLine(results) Console.ReadLine() End Sub End Module Исследуйте метод Join, он имеет две перегруженные версии, в нашем примере рассмотрена первая версия метода. Вторую версию метода изучите самостоятельно. МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Задание 2. Элементы управления Задача Научиться разрабатывать интерфейс пользователя для Windows или Web приложений с использованием стандартных элементов управления, представленных на панелях Toolbox. Решение Рассмотреть практические примеры построения интерфейса пользователя для работы со строковыми данными. Использовать элементы панели Toolbox, изменяя их свойства динамически (программным образом). Обсуждение Окно Toolbox предоставляет в распоряжение разработчика несколько наборов элементов управления (для каждого типа приложения – свой набор), которые можно располагать в форме во время ее конструирования. Свойства элементов управления можно устанавливать статическим способом при конструировании формы или изменять динамически – в ходе программы. Рассмотрим несколько конкретных примеров, позволяющих, с одной стороны, получить навыки использования элементов в Windows формах, с другой стороны, применить изученные методы класса String в практических задачах. Самостоятельно Создайте Windows форму и расположите на ней следующие элементы управления (рис. 1): Label (метку), TextBox (текстовое окно), Button (командную кнопку), CheckBox (флажок), GroupBox (рамку), два элемента RadioButton (переключатели). Рамка (GroupBox) является контейнером для других элементов. Элемент управления Переключатель (RadioButton) позволяет пользователю выбор из двух альтернатив Да/Нет (True/False), причем, в выбранном состоянии может находиться только один из переключателей в группе (внутри GroupBox). Свойство Checked возвращает состояние переключателя. Элемент управления Флажок (CheckBox) позволяет делать выбор из двух альтернатив, при этом, любое количество флажков может быть одновременно включено или выключено. Основным, анализируемым в программном коде свойством, также является свойство Checked. С элементами: Метка, Текстовое поле и Командная кнопка вы уже знакомы. МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Рис. 1. Интерфейс Windows формы с элементами управления В код, созданный мастером проекта, добавьте инструкции из листинга. Обратите внимание, что имеется три процедуры – обработчика событий: для формы, для командной кнопки и для элемента CheckBox (событие изменения его состояния). Обработчик события загрузки формы. Private Sub Form10_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load GroupBox1.Visible = False End Sub Обработчик события изменения состояния элемента управления Флажок. Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged GroupBox1.Visible = Not GroupBox1.Visible End Sub Обработчик события щелчка по командной кнопке. МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim s As String s = "Имя: " & TextBox1.Text & ControlChars.Cr If GroupBox1.Visible Then If RadioButton1.Checked Then s += "Пол: Муж" ElseIf RadioButton2.Checked Then s += "Пол: Жен" End If MsgBox(s) End If End Sub Измените код программы для выполнения следующего алгоритма: 1. Пользователь представляется, вводит свое имя и указывает пол. 2. В окне MsgBox в зависимости от указанного пользователем пола появляется одно из приветствий: «Добрый день, уважаемый Имя» или «Добрый день, уважаемая Имя». Самостоятельно Рассмотрим использование элемента управления Список (ListBox). Список позволяет выводить массив значений, из которых пользователь может выбрать одно или несколько (свойство SelectionMode). Свойство Items предоставляет доступ к свойствам отдельных элементов списка, их можно добавлять (Add), вставлять в указанную позицию списка (Insert), удалять (Remove), очищать полностью весь список (Clear). Добавьте в вашу форму два элемента Список и измените алгоритм программы (рис. 2). МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Private Sub Form10_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load GroupBox1.Visible = False End Sub Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged GroupBox1.Visible = Not GroupBox1.Visible End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If GroupBox1.Visible Then If RadioButton1.Checked Then ListBox1.Items.Add(TextBox1.Text) Textbox1.clear() ElseIf RadioButton2.Checked Then ListBox2.Items.Add(TextBox1.Text) Textbox1.clear() End If End If End Sub Рис. 2. Использование элементов управления Список для построения интерфейса Самостоятельно Продолжим изучение свойств и методов элемента ListBox (Список). Свойства SelectedItem и SelectedIndex возвращают значение выбранного элемента списка и его индекс в списке. ListBox поддерживает событие Click, происходящее при щелчке мышью по МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE строке списка. Предположим, что нам необходимо обеспечить пользователю возможность редактирования списков, то есть переписывать выбранную строку в текстовое окно, удаляя выбранную строку из списка. Напишем процедуру обработки события Click. Private Sub ListBox1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.Click Dim i As Integer TextBox1.Text = ListBox1.SelectedItem i = ListBox1.SelectedIndex ListBox1.Items.RemoveAt(i) ListBox1.SelectedIndex = -1 End Sub Private Sub ListBox2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.Click Dim i As Integer TextBox1.Text = ListBox2.SelectedItem i = ListBox2.SelectedIndex ListBox2.Items.RemoveAt(i) ListBox2.SelectedIndex = -1 End Sub Обратите внимание на строчку программного кода, в которой происходит присвоение -1 текущему индексу списка (то есть никакая строка списка не выбрана). Самостоятельно Тестируя элемент управления ListBox (Список) вы можете сделать вывод, что компонент имеет некоторые особенности в использовании. Недостатками компонента ListBox можно считать: невозможность ввода пользователем собственного значения непосредственно в список; компонент ListBox занимает слишком много места в форме. Всех этих недостатков лишен компонент ComboBox (комбинированный список). Он представляет собой комбинацию элементов TextBox и ListBox. Работа с ComboBox практически не отличается от работы с ListBox. Но есть некоторые отличия. У компонента ComboBox имеется дополнительное свойство Text, которое отсутствует у компонента ListBox. Данное свойство аналогично свойству Text компонента TextBox. Пользователь может ввести произвольную строку текста, если такая отсутствует в списке. Измените в вашей форме элементы ListBox на ComboBox. Попробуйте написать обработчик события для элементов ComboBox, который фиксировал бы введенную пользователем строку в списке строк МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Combox. В качестве примера, ниже приведены два обработчика событий нажатия клавиши Enter и потери фокуса элемента. Private Sub ComboBox2_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox2.Enter ComboBox1.Items.Add(ComboBox2.Text) ComboBox1.Text = "" ComboBox1.SelectedIndex = -1 End Sub Значение -1 присваивается свойству SelectedIndex для того, чтобы не был выбран ни один из элементов ComboBox. Private Sub ComboBox2_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox2.LostFocus ComboBox2.Items.Add(ComboBox2.Text) ComboBox2.Text = "" ComboBox2.SelectedIndex = -1 End Sub Задание 3. Способы взаимодействия с пользователем Задача Рассмотреть стандартные способы создания диалога с пользователем приложения (диалоговые окна), реализованные в VB.NET. Решение Для организации диалогового режима с пользователем использовать стандартные диалоги: окно сообщения – MsgBox и окно ввода – InputBox. Обсуждение Иногда, по ходу выполнения программы, возникает необходимость сообщить пользователю текущую информацию. Для этой цели удобно использовать стандартное окно сообщений MsgBox. Выполняя задания, вы имели возможность познакомиться с этим окном. Окно MsgBox имеет очень простой синтаксис: MsgBox(“текст сообщения”, [кнопки], [заголовок окна]) МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Параметры, отмеченные квадратными скобками, являются необязательными, ранее мы с вами их и не использовали. Рассмотрим варианты использования MsgBox с различными наборами входных параметров. MsgBox("Дополнительные параметры скрыты") MsgBox("Дополнительные параметры скрыты", , "Предупреждение") MsgBox("Дополнительные параметры скрыты", MsgBoxStyle.Information Or MsgBoxStyle.OKCancel, "Предупреждение") Все возможные значения параметра кнопки в методе MsgBox указываются в контекстной справке, возникающей сразу, как только вы поставите запятую после строки сообщения. Можно выбрать несколько параметров, но тогда их следует перечислять с помощью оператора OR. Функция MsgBox может возвращать значение (код нажатой кнопки), тогда это код можно анализировать в ходе программы. If MsgBox("Дополнительные параметры скрыты", MsgBoxStyle.Information Or MsgBoxStyle.OKCancel, "Предупреждение") = MsgBoxResult.Cancel Then Exit Sub Самостоятельно 1. Примените окно сообщения MsgBox с расширенным составом входных параметров. 2. Выполните анализ нажатых кнопок в вашем проекте. С помощью рассмотренного окна сообщений MsgBox можно выводить односложные сообщения типа Ok, Cancel. Если же необходимо получить от пользователя незначительную по объему, но символьную (текст, цифры) информацию, то удобнее использовать стандартное окно InputBox. Синтаксис функции следующий: InputBox(“текст запроса”, [заголовок окна], [значение по умолчанию]) МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Функция InputBox возвращает строковое значение, которое всегда надо присваивать строковой переменной (в отличие от MsgBox). Приведем пример вызова этой функции: Dim str As String str = InputBox("Введите ваше имя", "Вопрос", "Иванов Иван Иванович") Даже, если пользователь должен вводить и вводит числовые значения или дату, эти значения возвращаются как строка. Самостоятельно Измените полностью алгоритм работы вашего приложения «Символы и строки». 1. Пусть пользователь вводит всю необходимую информацию с помощью диалоговых окон. 2. Введенная информация, тем не менее, должна помещаться в разные элементы управления, либо в одно из двух ListBox, либо в одно из двух ComboBox (используйте любой элемент по вашему усмотрению), в зависимости от значения дополнительного параметра (в предыдущем варианте таким параметром был параметр «пол»). Задание 4. Классы .NET для организации взаимодействия с пользователем Задача Рассмотреть класс System.Windows.Forms.MessageBox организации диалога с пользователем приложения. для Решение Для организации диалогового режима с пользователем использовать окно сообщений MessageBox. Обсуждение Класс MessageBox входит в пространство имен System.Windows.Forms. Он обеспечивает отображение на экране только стандартных окон стандартных сообщений Windows. Поскольку МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE класс MessageBox является общим, создавать новый экземпляр класса с помощью конструктора New не обязательно. Для того чтобы вывести на экран окно сообщения, следует вызвать общий метод Show класса MessageBox, как это показано ниже: MessageBox.Show("Вы будете считать на калькуляторе?") Метод Show перегружается для того, чтобы при необходимости можно было отобразить пиктограмму MessageBox или заголовок, изменить кнопки, появляющиеся в этой форме, задать кнопку, используемую по умолчанию, либо указать, перед какой формой будет появляться окно. Единственный обязательный параметр – это текст сообщения, которое отображается в окне. Окно MessageBox, которое выводится на экран в рассмотренном выше коде, изображено на рис. 3. Следующий код вызывает метод Show, для выполнения которого требуются все возможные параметры. Окно MessageBox, выводимое при помощи этого кода, показано на рис. 4. Дополнительные сведения о различных параметрах окна MessageBox читайте в тексте подсказки при вызове метода Show. MessageBox.Show(Me, "Вы будете считать на калькуляторе?", "Калькулятор", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2, MessageBoxOptions.RightAlign) Рис. 4. Окно MessageBox с полным набором компонентов Самостоятельно Создайте собственное диалоговое окно. В приложение добавьте еще одну Windows форму, разместите на ней необходимые элементы управления, установите параметры (цвет, размер, заголовок, бордюр) (рис. 5). МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Чтобы определить, на какой кнопке щелкнул пользователь, свойству DialogResult кнопок присвойте соответствующие значения, принадлежащие перечислению DialogResult. После щелчка по кнопке значение DialogResulr возвращается родительской форме. Анализ этого значения может быть выполнен, например, с помощью оператора ветвления If..Then..Else..End if, с которым вы еще не знакомы. Можно воспользоваться программным кодом, приведенным далее, а можно, пока не программировать ответ пользователя, ограничиться только созданием собственного диалогового окна. Рис. 5. Диалоговое окно пользователя Ниже представлен код загрузки родительской формы (Form10), в котором создается объект класса Form11 (это ваша диалоговая форма, которую вы должны создать заранее). Для хранения кода нажатой пользователем кнопки в диалоговом окне необходимо объявить переменную типа DialogResult (перечисление всех возможных вариантов кнопок). Обратите внимание, что для диалоговой формы f вызывается функция ShowDialog, в отличие от вызываемого ранее метода Show. Функция ShowDialog возвращает код нажатой пользователем кнопки. Private Sub Form10_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim f As New Form11 Dim result As DialogResult result = f.ShowDialog If result=DialogResult.OK Then MessageBox.Show("Вы будете считать на калькуляторе?") Else MessageBox.Show("Вы не будете считать на калькуляторе?") End If f.Dispose()’ Это очень важная строка кода: форма не видна, но не закрыта. Метод Dispose уничтожает объект f. End Sub Ниже представлен код загрузки созданного вами диалогового окна в Windows форме (Form11). Для формы установлены параметры: цвет, бордюр, текст на форме (установите любые). МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Private Sub Form11_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.BackColor = Color.YellowGreen Me.FormBorderStyle = FormBorderStyle.Fixed3D Me.Text = "Продолжим диалог?" End Sub