Transcript

3

В.В. Балабошкин, О.П. Кныш

ОСНОВЫ ПРОГРАММИРОВАНИЯ: MICROSOFT VISUAL BASIC

Учебное пособие

Омск - 2010

4

Федеральное агентство по образованию ГОУ ВПО «Сибирская государственная автомобильно-дорожная

академия (СибАДИ)»

В.В. Балабошкин, О.П. Кныш

ОСНОВЫ ПРОГРАММИРОВАНИЯ: MICROSOFT VISUAL BASIC

Учебное пособие

Омск СибАДИ

2010

5

УДК 004.43 ББК 32.973.2-018 Б 20

Рецензенты: Канд.физ.-мат.наук, доц., В.В. Благонравов

(Институт математики и информационных технологий ОмГУ); Канд.физ.-мат.наук, доц., И.В. Ашаев

(Институт математики и информационных технологий ОмГУ)

Работа одобрена редакционно-издательским советом академии в качестве учебного пособия для специальности 080801 «Прикладная информатика в экономике»

Балабошкин В.В., Кныш О.П. Б 20 Основы программирования: Microsoft Visual Basic: учебное пособие. –

Омск: СибАДИ, 2010. – 164 с.

Пособие предназначено для обучения студентов специальности 080801 «Прикладная информатика в экономике». Пособие содержит практические примеры по основным прикладным направлениям программирования: обработка числовых данных, обработка строк, работа с каталогами и файлами, построение графиков и диаграмм, работа с базой данных и др. Табл. 37. Ил. 23. Библиогр.: 3 назв.

ГОУ «СиБАДИ», 2010

3

ОГЛАВЛЕНИЕ

Введение ……………………………………………………………………. 7

1. Язык программирования Visual Basic ………………………………. 9 1.1. Основы языка ………………………………….…….…….…….……. 9

Структура программы ………………………………….…….…….…. 9 Элементы программирования уровня файла ………………………… 10 Элементы программирования уровня пространства имен …….……. 11 Элементы программирования уровня модуля ……………………….. 11 Элементы программирования уровня процедуры …….…….………. 11 Процедура Main ………………………………….…….…….…….……. 11 Объявление переменных ………………………………….…….…….. 12 Арифметические операции ………………………………….…….…… 13 Условный оператор ………………………………….…….…….…….. 13 Цикл со счетчиком ………………………………….…….…….……… 15

1.2. Создание консольного приложения …………………………………. 17 Алгоритм программы - примера ………………………………….……. 19 Пример программы ………………………………….…….…….…….. 19

1.3. Задания на тему «Создание консольного приложения» …….……… 20 Порядок выполнения лабораторной работы ………………………… 21

1.4. Обработка исключительных ситуаций ……………………………… 21 Синтаксические ошибки ………………………………….…….……… 21 Ошибки времени выполнения ………………………………….……… 21 Логические ошибки ………………………………….…….…….…….. 22 Класс Exception ………………………………….…….…….…….……. 22 Блок обработки исключений ………………………………….……… 23 Пример программы …………………………………….…….…….…… 25

1.5. Задание на тему «Обработка исключительных ситуаций» …….…… 27 Порядок выполнения лабораторной работы ………………………… 27

2. Ввод и вывод в текстовый файл ………………………………….… 28 2.1. Создание текстового файла ………………………………….………. 28

Пример программы ………………………………….…….…….……… 29 2.2. Задание на тему «Создание текстового файла» …….…….…….…… 30

Порядок выполнения лабораторной работы ………………………… 30 2.3. Чтение информации из текстового файла …………………………… 31

Цикл с предусловием ………………………………….…….…….……. 31 Пример программы ………………………………….…….…….…….. 32

2.4. Задание на тему «Чтение информации из текстового файла» …….. 34 Порядок выполнения лабораторной работы ………………………… 34

3. Обработка данных ………………..……………….…….…….………. 35 3.1. Формирование массива ………………………………….…….……… 35

Пример программы ………………………………….…….…….…….. 36 3.2. Задания на тему «Формирование массива» ………………………… 37

Порядок выполнения лабораторной работы ………………………… 37

4

3.3. Обработка массивов ………………………………….…….…….……. 37 Опрос элементов коллекции ………………………………….…….… 39 Пример программы ………………………………….…….…….……… 39

3.4. Задания на тему «Обработка массивов»……………………………… 41 Порядок выполнения лабораторной работы ………………………… 42

4. Бинарные файлы ………………………………….…….…….…….… 43 4.1. Запись данных в бинарный файл …………………………………… 43

Пример программы ………………………………….…….…….…….. 44 4.2. Задание на тему «Запись данных в бинарный файл» …….….….… 45

Порядок выполнения лабораторной работы ………………………… 46 4.3. Чтение данных из бинарного файла …………………………………. 46

Пример программы ………………………………….…….…….…….. 47 4.4. Задания на тему «Чтение данных из бинарного файла» …….…….. 49

Порядок выполнения лабораторной работы ………………………… 49

5. Визуальные компоненты ………………………………….…….…… 50 5.1. Примеры визуальных компонентов …………………………………. 50

Пример программы ………………………………….…….…….…….. 53 5.2. Задание на тему «Визуальные компоненты» ……………………….. 54

Порядок выполнения лабораторной работы …………………………. 55 5.3. Управляющие визуальные компоненты …………………………….. 55

Примеры работы со свойствами компонентов ………………………. 56 5.4. Задание на тему «Управляющие визуальные компоненты» ……… 57

Порядок выполнения лабораторной работы ………………………… 57 5.5. Использование визуальных компонентов …………………………… 57 5.6. Задания на тему «Использование визуальных компонентов» ….… 59

Порядок выполнения лабораторной работы ………………………… 62

6. Просмотр каталогов и файлов ………………………………….…… 63 6.1. Просмотр и выбор в дереве каталогов ……………………………… 63

Пример программы ………………………………….…….…….…….. 65 6.2. Задание на тему «Просмотр и выбор в дереве каталогов» ….……. 65

Порядок выполнения лабораторной работы ………………………… 65 6.3. Выбор файла в каталоге ………………………………….…….…….. 66

Пример программы ………………………………….…….…….…….. 67 6.4. Задание на тему «Выбор файла в каталоге» ………………………… 68

Порядок выполнения лабораторной работы ………………………… 69 6.5. Сохранение файла в папке ….………………………………….…….. 69

Пример программы ………………………………….…….…….…….. 70 6.6. Задание на тему «Сохранение файла в папке» ……………………… 71

Порядок выполнения лабораторной работы ………………………… 72 6.7. Просмотр графических файлов ………………………………….…… 72

Пример программы ………………………………….…….…….……. 73 6.8. Задания на тему «Просмотр графических файлов» …….…….……. 74

Порядок выполнения лабораторной работы ………………………… 75

5

7. Построение графиков и диаграмм …………………………………… 76 7.1. Построение графика ………………………………….…….…….……. 76

Пример программы ………………………………….…….…….……… 77 7.2. Задание на тему «Построение графика» …………………………… 80

Порядок выполнения лабораторной работы ………………………… 80 7.3. Построение столбиковой диаграммы ……………………………….. 80

Пример программы ………………………………….…….…….……… 81 7.4. Задание на тему «Построение столбиковой диаграммы» ……….… 82

Порядок выполнения лабораторной работы …………………………. 82 7.5. Построение круговой диаграммы …………………………………… 83

Пример программы ………………………………….…….…….……… 84 7.6. Задание на тему «Построение круговой диаграммы» …….………... 88

Порядок выполнения лабораторной работы ………………………… 88

8. Интегрированный язык запросов LINQ …………………………… 89 8.1. Анализ числового массива ………………………………….…….… 89

Пример программы ………………………………….…….…….…….. 90 8.2. Задание на тему «Анализ числового массива» .…………………… 92

Порядок выполнения лабораторной работы ………………………… 92 8.3. Обработка массива строк ………………………………….…….……. 93

Пример программы ………………………………….…….…….……. 93 8.4. Задания на тему «Обработка массива строк» ………………………. 96

Порядок выполнения лабораторной работы ………………………… 98 8.5. Обработка массива записей ………………………………….…….… 99

Пример программы ………………………………….…….…….…….. 99 8.6. Задания на тему «Обработка массива записей» …………………… 100

Порядок выполнения лабораторной работы ………………………… 101

9. Работа с базой данных ………………………………….…….…….… 102 9.1. Чтение информации из базы данных ………………………………… 102

Управляемый провайдер OLE DB …………………………………… 102 Соединение с базой данных ………………………………….…….… 103 Построение команды SQL ………………………………….…….……. 104 Чтение информации из базы данных …………………………………. 106 Пример программы ………………………………….…….…….…….. 108

9.2. Задание на тему «Чтение информации из базы данных» …….…….. 110 Порядок выполнения лабораторной работы ………………………… 110

9.3. Отображение данных на форме в приложении Windows …….……. 111 Установление соединения с базой данных …………………………… 112 Описание свойства компонента OleDbDataAdapter ………………… 112 Описание свойств компонента DataSet ……………………………….. 113 Описание свойств компонента DataGridView ………………………… 114 Код обработки событий ………………………………….…….…….… 116 Пример программы ………………………………….…….…….……. 118

9.4. Задание на тему «Просмотр данных с помощью dbGridView» ……. 123 Порядок выполнения лабораторной работы ………………………… 123

6

10. Анализ параметров компьютера ………………………………….… 124 10.1. Анализ системных параметров ………………………………….… 124

Определение версии операционной системы ………………………… 124 Получение системной даты и времени ……………………………….. 124 Чтение реестра ………………………………….…….…….…….…….. 124 Информация о процессах ………………………………….…….…….. 125 Список установленного программного обеспечения …….…….……. 126 Переменные окружения ………………………………….…….…….… 126 Учетные записи локальной машины ………………………………….. 126

10.2. Задания на тему «Анализ системных параметров» ………………. 128 Порядок выполнения лабораторной работы …………………………. 129

10.3. Анализ оборудования …………………………………..…….……… 129 Получение информации о компьютере ……………………………….. 129 Информация о производителе ………………………………….……… 130 Тип компьютера ………………………………….…….…….…….…… 131 Определение числа процессоров ………………………………….…… 131 Информация о жестком диске ………………………………….……… 132 Свойства видеоконтроллера ………………………………….…….… 132

10.4. Задания на тему «Анализ оборудования» ………………………… 133 Порядок выполнения лабораторной работы ………………………… 134

10.5. Анализ сетевой информации ………………………………….……. 134 Разбор URL ………………………………….…….…….…….…….… 134 DNS-имя компьютера ………………………………….…….…….…… 135 Netbios-имя компьютера ………………………………….…….…….. 135 Имя текущего пользователя ………………………………….…….… 135 Список IP-адресов компьютера ………………………………….……. 136 Список сетевых дисков ………………………………….…….…….… 136

10.6. Задания на тему «Анализ сетевой информации» …………………. 137 Порядок выполнения лабораторной работы ………………………… 137

11. Разные программы ………………………………….…….…….……. 138 11.1. Параметры приложения ………………………………….…….…… 138

Объект My.Settings ………………………………….…….…….…….. 140 Таблица свойств пользовательских параметров ……………………. 140 Пример программы ………………………………….…….…….…….. 141

11.2. Справочная информация ………………………………….…….…… 142 Порядок подключения справки ………………………………….……. 142 Создание файла справки ………………………………….…….……… 143 Пример справки на языке HTML ………………………………….…… 144

11.3. Чтение данных из книги Microsoft Excel …………………………… 145 Пример программы ………………………………….…….…….…….. 147

11.4. Время, дата, календарь ………………………………….…….……. 149 Библиографический список ……………………….…….…….…….. 150 Предметный указатель ….…………………………….…….…….… 151

7

Введение

Язык программирования Visual Basic появился в 1991 г., позволив более эффективно разрабатывать полнофункциональные Windows-приложения. Графический интерфейс таких приложений формировался в визуальной среде разработки путем перемещения стандартных компонентов в окно формы. С 1993 г. версия языка Microsoft Visual Basic for Application была включена в программы общего пользования Microsoft Word, Excel и др. в качестве макроязыка. В Visual Basic обеспечивается поддержка технологи OLE. В 1995 г. вышел язык Visual Basic Scripting Edition – язык сценариев для Internet, основанный на Visual Basic. В 1998 г. компания Misrosoft выпустила Visual Basic 6, который является компонентом Microsoft Visual Studio. Среда разработки Visual Studio представляет собой полный набор средств разработки для создания веб-приложений ASP.NET, XML (веб-службы), настольных приложений и мобильных приложений. Разработчик получил интегрированную среду разработки (IDE), которая позволяет совместно использовать средства и упрощает создание решений на базе нескольких языков. Кроме того, в этих языках используются функциональные возможности платформы .NET Framework, которая позволяет получить доступ к ключевым технологиям, упрощающим разработку веб-приложений ASP и XML (веб-службы).

Пособие предназначено для обучения студентов программированию на языке Visual Basic в среде Visual Studio. Пособие может быть использовано как преподавателем, так и студентами. Для преподавателя важны порядок следования учебного материала и определение основных элементов содержания каждой темы и дисциплины в целом. Главы пособия расположены в том порядке, который соответствует логике обучения языку программирования. Вначале рассматривается процесс создания консольных приложений, работа с текстовыми и бинарными файлами. Все данные, получаемые и обрабатываемые в программах, размещаются в файлах. Тестовые данные и результаты лабораторных работ становятся при этом более наглядными. Студент получает важные навыки работы с информацией на диске. Файловые операции рассматриваются в комплексе с вопросами обработки исключительных ситуаций. В данном контексте эти вопросы

8

осваиваются учащимися достаточно успешно. Достаточно подробно описаны особенности работы с различными визуальными компонентами, в том числе с управляющими. В отдельную главу выделены компоненты, позволяющие выполнять просмотр и выбор в списках каталогов и файлов, в том числе графических файлов. Графические функции рассматриваются в примерах построения графиков и диаграмм. В главе, посвященной интегрированному языку запросов LINQ, освещены новые возможности обработки структурных типов данных. Важное значение имеет глава, посвященная программированию приложений, работающих с базой данных. В последних главах рассматриваются вопросы анализа системных параметров компьютера, параметров установленного оборудования, сетевых параметров, организации работы с параметрами пользователя и справкой, а также установления связи с приложениями Micrososft Office.

Читатели пособия, особенно студенты, будут заинтересованы большим набором практических примеров, которые рассматриваются в тексте.

9

1. ЯЗЫК ПРОГРАММИРОВАНИЯ VISUAL BASIC

1.1. Основы языка

Правила написания текста простой программы на языке Visual Basic во многом совпадают с правилами тех версий языка Basic, которые были разработаны специально для обучения студентов. Каждый оператор занимает одну строку. Окончание оператора можно перенести на следующую строку, указав в конце текущей строки пробел и символ подчеркивания « _». В идентификаторах не различаются прописные и строчные буквы. Имена, определенные пользователем, не должны совпадать с зарезервированными именами. Имя должно начинаться с латинской буквы или символа подчеркивания «_», причем подчеркивание не может быть единственным символом имени. Имя может содержать также и цифры. Максимальное количество символов в имени 1023, но для удобства в реальной программе не рекомендуется использовать имена длиннее 30 символов. Заметим, что полное имя объекта может содержать идентификаторы пространства имен, метод, параметры и т.д. В среде программирования применяетя специальная технология перевода кода, благодаря которой программист получает подсказки непосредственно в процессе ввода кода программы. Файл, содержащий текст программы, должен иметь расширение .vb.

Структура программы

Программа на языке Visual Basic построена из стандартных блоков. Решение состоит из одного или нескольких проектов. Проект в свою очередь может содержать одну или несколько сборок. Каждая сборка компилируется из одного или нескольких исходных файлов. Исходный файл включает в себя определения и реализацию классов, структур, модулей и интерфейсов и в конечном счете содержит весь код.

Структура текста простой программы, выполняющей вывод одной строки на экран, представлена ниже. ‘Пример 1.1 Module Module1 Sub Main()

10

Console.WriteLine(“Пример простой программы”) Console.ReadLine() End Sub End Module

Программа состоит из одного модуля и одной процедуры. Процедура имеет имя Main. Все Visual Basic-приложения начинают выполняться с вызова процедуры Main. В программе использованы парные операторы: Module - End Module, Sub - End Sub. Модуль может содержить несколько процедур. Процедура содержит несколько строк программного кода. В пример 1.1 включены однострочные операторы «вывод строки» Console.WriteLine и «ввод строки» Console.ReadLine. Последний оператор использован для задержки экрана до нажатия клавиши Enter.

Элементы программирования уровня файла

При создании проекта или файла и открытии редактора кода пользователю предоставляется уже готовая часть кода, расположенная в правильном порядке. Любой код должен создаваться в следующей последовательности: 1. Операторы Option. 2. Операторы Imports. 3. Операторы Namespace и элементы уровня пространства имен.

Размещение операторов в иной последовательности может вызвать ошибки компиляции.

Операторы Option устанавливают основные правила для последующего кода, способствуя предотвращению синтаксических и логических ошибок.

Оператор Imports позволяет ссылаться на классы и другие типы, определенные в импортированном пространстве имен, без их уточнения. Можно использовать столько операторов Imports, сколько необходимо. Пространства имен помогают организовывать и классифицировать элементы программирования для облегчения их группировки и доступа к ним.

11

Элементы программирования уровня пространства имен

Классы, структуры и модули содержат весь код исходного файла. Они являются элементами уровня пространства имен и могут отображаться в пространстве имен или на уровне исходного файла. Они содержат описания всех других элементов программирования. Интерфейсы, которые определяют подписи элементов, но не выполняют реализацию, также отображаются на уровне модуля. Элементы данных на уровне пространства имен являются перечислениями и делегатами.

Элементы программирования уровня модуля

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

Элементы программирования уровня процедуры

К элементам уровня процедуры относятся в основном исполняемые операторы, которые составляют код времени выполнения программы. Весь исполняемый код должен находиться в пределах некоторой процедуры (Function, Sub, Operator, Get, Set, AddHandler, RemoveHandler, RaiseEvent). Элементы данных на уровне процедуры ограничиваются локальными переменными и константами.

Процедура Main

Каждое приложение Visual Basic должно содержать процедуру с именем Main. Эта процедура служит начальной точкой программы и осуществляет общее управление работой приложения. Платформа .NET Framework вызывает процедуру Main при загрузке приложения и готовности передачи управления. При создании приложения Windows Forms для приложений, которые выполняются самостоятельно, необходимо написать процедуру Main.

12

Объявление переменных

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

подчеркивания «_»; имя может содержать только символы латинского алфавита,

десятичные цифры и знаки подчеркивания; имя должно содержать хотя бы один символ латинского алфавита

или десятичную цифру, если оно начинается со знака подчеркивания;

длина имени не должна превышать 1023 символа. Регистр в именах элементов не учитывается. Это означает, что

при сравнении двух имен AаA и aАa, которые отличаются только регистром буквенных символов, компилятор воспринимает их как одно и то же имя. Однако использовать подобный «разнобой» в одних и тех же именах не рекомендуется.

В простом примере, показанном выше, используется одна текстовая константа и нет ни одной переменной. Если есть переменные, которые требуются в обычной программе, то они должны быть обязательно объявлены до их использования, например: ‘Пример 1.2 Module Module1 Sub Main() Dim k, m, n As Integer Dim S As String m = 20 n = 7 k = m \ n S = "Частное " & Str(m) & " /" & Str(n) & " =" & Str(k) Console.WriteLine(S) Dim x, y, z As Double x = 10.0 y = 3.0 z = x / y S = "Частное " & Str(x) & " /" & Str(y) & " =" & Str(z) Console.WriteLine(S)

13

Console.ReadLine() End Sub End Module

В примере с помощью ключевого слова Dim объявлены три целочисленные (тип Integer) переменные k, m, n, три вещественные (тип double) переменные x, y, z, а также строковая (тип string) переменная S. Значения четырех переменных определяются с помощью числовых констант. Две переменные определяются с помощью арифметических выражений. Отметим, что символ “\” означает целочисленное деление, например, k=m\n. Значение строковой переменной определяется с помощью объединения (символ & обозначает объединение строк) строковых констант со строковым представлением чисел. Функция Str преобразовывает значение числа в его строковое представление.

Арифметические операции

Подобно другим языкам программирования, Visual Basic поддерживает арифметические операции:

+ и – * и / \ mod ^

сложение и вычитание; умножение и деление; целочисленное деление; остаток от деления возведение в степень.

Условный оператор

Для построения сложных программ необходимы инструкции управления, которые позволяют реализовать ветвление, цикл и другие алгоритмические структуры. Ветвление осуществляется с помощью инструкции If. If Условие1 Then Первая группа операторов ElseIf Условие2 Then Вторая группа операторов ElseIf Условие3 Then Третья группа операторов . . .

14

Else Последняя группа операторов End If

Условие1, условие2 и др. представляют собой булево выражение, принимающее значения true и false. Если условие1 равно true, то выполняется Первая группа операторов, следующих за If. В противном случае проверяется Условие2, и если оно равно true, то выполняется Вторая группа операторов и т.д. Если все условия равны false, то выполняется Последняя группа операторов, следующая за Else. Инструкции ElseIf, Else и соответствующие им группы операторов не обязательны в условном операторе. Для построения условных выражений можно использовать следующие операторы отношения:

< <= > >= = <>

меньше меньше либо равно больше больше либо равно равно не равно

В примере, предложенном ниже, определяется некоторое целое число. Это число сравнивается с тем, что пользователь вводит с клавиатуры. ‘Пример 1.3 Module Module1 Sub Main() Dim m, n As Integer n = 7 Console.Write(“Угадайте целое число между 0 и 10 = ”) m = Convert.ToInt32(Console.ReadLine()) if m<n Then Console.WriteLine(“Ваше число меньше”) ElseIf m>n Then Console.WriteLine(“Ваше число больше”) Else Console.WriteLine(“Угадали”) End If Console.ReadLine() End Sub End Module

15

В примере применены два условных оператора, один из которых вложен в другой. Для вывода первой строки использован метод Console.Write, который выводит список вывода, но не переходит в следующую строку на экране. Метод ToInt32 класса Convert преобразовывает введенную с клавиатуры строку символов в целое число.

Для сравнения кроме оператора «=» можно использовать функцию Equals, например, следующие две строки для переменных a и b выводят на экран одинаковый результат true, если переменные равны, или false в противном случае. Console.WriteLine(a = b) Console.WriteLine(a.Equals(b))

Для сравнения числовых переменных a и b можно также использовать функцию a.CompareTo(b), которая возвращает точно такое значение, как и функция Math.Sign(a-b) (знак числа).

Отметим, что сравнивать можно только переменные одного и того же типа. Если требуется преобразовать один тип данных в другой, то это нужно указывать явно, например, в приведенных ниже строках кода функции string.Format и ToString помещают строковое представление величины d, сохраняя 3 знака после десятичной точки. Заметим, что вещественные числовые константы должны указываться с дробной частью, иначе выражение из целых констант 1 / 29 равно нулю. Dim d As Double Dim s1, s2 As String d = 1.0 / 29.0 s1 = String.Format("{0:F3}", d)) s2 = d.ToString("F3")

Обратное преобразование из строкового типа в вещественный выполняется с помощью метода ToDouble класса Convert.

d = Convert.ToDouble(s2)

Цикл со счетчиком

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

16

For счетчик=нач To кон Step шаг Группа операторов Next счетчик

Перед первым выполнением цикла устанавливается начальное значение нач управляющей числовой переменной – счетчика. Если это значение превышает конечное значение кон, то цикл не работает ни разу. Шаг – это значение, на которое изменяется счетчик после каждого исполнения цикла. Элементы нач, кон и шаг – это числовые константы, переменные или математические выражения. В следующем примере вычисляется факториал N, то есть произведение целых чисел от 1 до N. ‘Пример 1.4 Module Module1 Sub Main() Dim i, P, N As Integer Console.Write(“Введите целое число = ”) N = Convert.ToInt32(Console.ReadLine()) P = 1 For i=2 To N Step 1 P = P * i Next i Console.WriteLine(Str(N) & "! = " & Str(P)) Console.ReadLine() End Sub End Module

При первом повторении значение счетчика равно 2. Одна строка, находящаяся в цикле, будет повторяться до тех пор, пока счетчик не превышает N. Значение счетчика изменяется после каждого повторения на величину шага. Отметим, что если шаг равен 1, то его можно не указывать.

Цикл может быть закончен до того момента, когда условие станет равным false. Эта возможность реализуется с помощью инструкции Exit For, помещенной в теле цикла, например: If i>10 Then Exit For End If

После команды Exit For никакие команды в теле цикла больше не выполняются, а управление передается инструкции, следующей за концом цикла.

17

1.2. Создание консольного приложения на языке Visual Basic

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

File:///C:/prog1/bin/debug/prog1.exe _ Введите целое число = 8 8! = 40320

Рис. 1.1. Окно консольного приложения

Консольное приложение может быть создано в среде Visual Studio последовательностью команд: Файл – Создать – Проект – Visual Basic – Консольное приложение. В появившемся окне (рис. 1.2) необходимо указать каталог для размещения папки проекта, а также ввести имя проекта. Введенное имя будет использовано для именования всех файлов проекта, в том числе исполняемого файла. После подтверждения имени проекта автоматически создаются все строки, необходимые в структуре программы: создается модуль, а также процедура main. После создания нового проекта программисту остается добавить в созданную структуру необходимый программный код.

Рис. 1.2. Создание консольного приложения

18

В первой практической работе исходные данные будем получать с помощью генератора случайных чисел, например, для получения очередного случайного числа используем функцию Rnd, которая генерирует случайное число в диапазоне от 0 до 1: x = Rnd()

Первая программа на языке Visual Basic должна определить площадь плоской фигуры методом Монте-Карло. Фигура ограничена снизу прямой y = 0, слева и справа – прямыми x = a и x = b, а сверху – кривой y = f(x). Функции, которые требуются в программе, принадлежат классу Math, например, Math.Sin. Некоторые функции, необходимые для разработки программ, приведены в табл. 1.1.

Таблица 1.1 Классы и методы, используемые в программах

Класс, метод Назначение

Console Встроенный класс, поддерживающий консольные операции ввода вывода

WriteLine Вывод строки на экран с переводом курсора в следующую строку экрана (метод класса Console)

Write Вывод строки на экран без перевода строки, то есть курсор остается в той же строке экрана (метод класса Console)

ReadLine Ввод строки с клавиатуры (метод класса Console)

Convert Встроенный класс, поддерживающий преобразования одного базового типа данных в другой базовый тип

ToInt32 Преобразование строки (тип String) в целое число (метод класса Convert)

Random Встроенный класс – генератор случайных чисел

NextDouble Случайное число от 0 до 1 (метод класса Random)

Math Встроенный класс математических функций

Sin Синус (метод класса Math)

Cos Косинус (метод класса Math)

Tan Тангенс (метод класса Math)

Sqrt Квадратный корень (метод класса Math)

Round Округление до указанного количества знаков после запятой (метод класса Math)

new Создает новый экземпляр класса

19

Алгоритм программы - примера

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

Пример программы

В программе используют вещественные переменные двойной точности s0, s, x, y, а также целочисленные переменные i, m, n. Все числовые методы в программе возвращают вещественное число двойной точности. ‘Пример 1.5 Module Module1 Sub Main() Dim i, m, n As Integer Dim s0, s, x, y As Double Console.WriteLine("Расчет площади методом Монте-Карло") Console.WriteLine() m = 0 n = 1000 s0 = 1 Console.Write("Введите число точек ") n = Convert.ToInt32(Console.ReadLine()) For i = 1 To n x = Rnd() y = Rnd() If (y < Math.Sin(x)) Then m = m + 1 End If Next s = s0 * m / n Console.WriteLine("Всего точек = " + Str(n))

20

Console.WriteLine("Внутри области = " + Str(m)) Console.WriteLine() Console.WriteLine("Площадь = " + Str(Math.Round(s, 4))) Console.ReadLine() End Sub End Module

1.3. Задания на тему «Создание консольного приложения»

Используя алгоритм, использованный в примере, создать консольное приложение, вычисляющее площадь, ограниченную вертикальными прямыми x = a и x = b, горизонтальной прямой y = 0, а также кривой – графиком функции y = f(x). Варианты заданий приведены в табл. 1.2. Каждое из заданий по данной и всем последующим темам выполняется в отдельной папке, в которой сохраняются файлы проекта, а также все необходимые файлы и тестовые данные. Одним из обязательных файлов является документ, в котором должно быть краткое описание программы: название, назначение, порядок работы, ожидаемые результаты.

Таблица 1.2 Варианты заданий на тему «Создание консольного приложения»

Вариант a b f(x)

1 0 1 Cos(x) 2 0 2 Sin(x) 3 0 1 Cos(x)*x^2 4 1 2 Sin(x)/x^2 5 0 1 Sin(x)*Cos(x) 6 0 1 Tg(x) 7 0 1 Sin(x)+Cos(x) 8 1 3 Sin(x)-Cos(x) 9 0 1 Sin(x^2) 10 0 1 Cos(x^2) 11 0 1 Sqrt(x) 12 1 2 x/Sqrt(x)

21

Порядок выполнения лабораторной работы

Создать новый проект: Файл – Создать проект – Язык Visual Basic – Создать консольное приложение.

Добавить программный код в функцию Main. Компилировать программу. Тестировать программу. Создать документ с описанием работы программы.

1.4. Обработка исключительных ситуаций

Ошибки, которые возникают во время выполнения программы, называются исключениями. В Visual Basic ошибки (также называемые исключениями) подразделяются на три категории: синтаксические ошибки, ошибки времени выполнения и логические ошибки.

Синтаксические ошибки

Синтаксические ошибки – это ошибки, выявляемые во время написания программного кода. Visual Basic проверяет код в процессе его ввода в окне Редактор кода и предупреждает при обнаружении ошибки, такой как неправильное написание слова или неправильное использование элемента языка. Синтаксические ошибки легко исправить в среде разработки непосредственно при возникновении. Оператор Option Explicit является одним из средств предотвращения синтаксических ошибок. Он требует предварительного объявления всех переменных, используемых в приложении. Таким образом, когда эти переменные используются в коде, опечатки немедленно обнаруживаются и могут быть исправлены.

Ошибки времени выполнения

Ошибки времени выполнения – это те ошибки, которые выявляются только после компиляции кода во время его выполнения. Они возникают в кодах, которые выглядят правильными и не содержат синтаксических ошибок, но не выполняются. Например, строка кода для открытия файла может быть написана правильно. Но если файл поврежден, приложение не сможет выполнить функцию

22

Open и будет остановлено. Для устранения большинства ошибок времени выполнения необходимо переписать ошибочный код, заново выполнить компиляцию и запустить приложение.

Логические ошибки

Логические ошибки – это те ошибки, которые выявляются при использовании данного приложения. Они часто проявляются в виде нежелательных или непредвиденных результатов в ответ на действия пользователя. Например, ошибочное нажатие клавиши или другое внешнее воздействие может вызвать прекращение работы приложения. Логические ошибки обычно наиболее сложно исправить, так как не всегда ясно их происхождение.

Класс Exception

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

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

23

Таблица 1.3

Свойства класса Exception

Свойство Описание

HelpLink Ссылка на файл справки, связанный с этим исключением

HResult Значение типа HRESULT – кодированное числовое значение, сопоставленное определенному исключению

InnerException Экземпляр объекта Exception, который вызвал текущее исключение

Message Краткое сообщение о текущем исключении

Source Имя приложения или объекта, который вызвал ошибку

StackTrace Строковое представление фреймов стека вызовов в момент возникновения текущего исключения

TargetSite Метод, создавший текущее исключение

Блок обработки исключений

Блок обработки исключений состоит из 4 частей: try, catch, throw, finally, из которых первые две обязательны. Программные инструкции, которые нужно контролировать, помещаются в try-блок. Информация об исключении, возникшем в try-блоке, перехватывается программным путем и обрабатывается с помощью catch-блока. Блок throw позволяет сгенерировать исключение вручную. Если при выходе из обработки исключений требуется обязательно выполнить некоторый код, то его размещают в блоке finally. Формат блока обработки исключений без throw выглядит так: Try [ Try-операторы ] [ Exit Try ] [ Catch [ переменная [ As тип исключения ]] [ When выражение] [ catch-операторы ] [ Exit Try ] ] [ Catch ... ] [ Finally [ Finally-операторы ] ] End Try

24

Try-операторы – это один или несколько операторов, при выполнении которых может возникнуть ошибка.

Catch содержит предусмотренный действия в ответ на исключение, возникшее в блоке Try. Разрешено использование нескольких блоков Catch, при этом каждая инструкция Catch сравнивается в текстовом порядке, чтобы определить обрабатывает ли она исключение, которое возникло.

Переменная – любое имя переменной, которая используется оператором Catch для задания перехватываемой ошибки. Значение переменной является значением возникшей ошибки. Если аргумент опущен, инструкция Catch перехватывает все исключения.

Тип исключения указывает тип класса фильтра. Если значение переменной относится к указанному типу исключения или к типу, производному от него, данный идентификатор становится привязкой к объекту исключения.

Инструкция Catch с предложением When перехватывает исключения, только если результат вычисления выражения равен True. Предложение When используется только после проверки типа исключения, и выражение может ссылаться на идентификатор, представляющий исключение.

Выражение типа Boolean используется для определения условий, при которых будет перехватываться данная ошибка. Обычно используется для фильтрации по номеру ошибки.

Сatch-операторы обрабатывают ошибки, возникшие в соответствующем блоке Try.

Exit Try – зарезервированное слово, которое разбивает структуру Try...Catch...Finally. Выполнение возобновляется с кода, непосредственно следующего за оператором End Try. Инструкция Finally будет по-прежнему выполняться. Не допускается в блоках Finally.

Finally всегда выполняется по окончании выполнения любой части оператора Try.

Finally-операторы выполняются после выполнения всех остальных действий по обработке ошибки.

End Try завершает структуру Try...Catch...Finally. Локальные переменные блока Try недоступны в блоке Catch,

поскольку это отдельные блоки. Если нужно использовать переменную в нескольких блоках, то следует объявить ее вне структуры Try...Catch...Finally.

25

Блок Try содержит код, в котором может возникнуть ошибка, а в блоке Catch содержится код обработки любой возникшей ошибки. Если ошибка возникла в блоке Try, то управление программой передается соответствующему блоку Catch.

Если в инструкции Catch не указан тип исключения, то она перехватывает любые исключения системы или приложения. Использовать этот вариант имеет смысл только в качестве последнего блока Catch.

Если инструкция Try не содержит ни одного блока Catch, то она должна содержать Finally.

В примере ниже создан блок обработки ошибки. ‘ Пример 1.6 Dim x As Integer = 1 Dim y As Integer = 0 Try x = x \ y Catch e As Exception When y = 0 Beep() MsgBox("Деление на 0") Finally Beep() End Try

Пример программы

В следующем примере блок обработки исключений содержит три блока catch, определенных для обработки ошибок OverflowException, , IndexOutOfRangeException. ‘ Пример 1.7 Module Module1 Sub Main() Dim b, c(2) As Integer Dim x As Double Console.Write("Введите целое число от 1 до 3 = ") b = Convert.ToInt32(Console.ReadLine()) x = b For i As Integer = 0 To 2 c(i) = i

26

Next Try ' Здесь событие для OverflowException If b = 1 Then For i As Integer = 1 To 100000 b = b * i Next End If ' Здесь событие для DivideByZeroException Console.WriteLine(1 \ (b - 2)) ' Здесь событие для IndexOutOfRangeException Console.WriteLine(c(b)) Catch e As DivideByZeroException Console.WriteLine(e.Message) Catch e As IndexOutOfRangeException Console.WriteLine(e.Message) Catch e As OverflowException Console.WriteLine(e.Message) Finally Console.WriteLine("Завершен блок Try-Catch-Finally") End Try Console.ReadLine() End Sub End Module

Данная программа выдает короткое сообщение – свойство Message для одного из трех видов ошибок, которые возникают при вводе с клавиатуры чисел 1, 2 или 3. Для отображения более полных сведений о текущем исключении можно использовать другие свойства (см. табл. 1.3) или же показать все сведения об исключении, например: Console.WriteLine(e.ToString)

27

1.1. Задание на тему «Обработка исключительных ситуаций»

Создать консольное приложение, содержащее блок обработки исключений для двух типов из табл. 1.4. В каждом catch-блоке отобразить значения трех свойств соответствующего исключения. Разработать программный код, который способен создавать ошибки – исключительные ситуации. Подготовить тестовые данные, подходящие для проверки программы.

Таблица 1.4

Примеры типов исключений

Исключение Значение

ArgumentException Недопустимый аргумент

ArgumentOutOfRangeException Значение аргумента вне допустимых пределов

ArithmeticException Ошибка в арифметическом действии

ArrayTypeMismatchException Недопустимый тип элемента массива

DivideByZeroException Деление на нуль

IndexOutOfRangeException Индекс массива вне допустимых пределов

OverflowException Арифметическое переполнение

Тестовые значения можно присвоить данным с помощью генератора случайных чисел или вводя их с клавиатуры или другим несложным способом.

Порядок выполнения лабораторной работы

Создать новый проект – консольное приложение. Добавить программный код в функцию Main. Компилировать программу. Тестировать программу. Создать документ с описанием работы программы.

28

2. ВВОД И ВЫВОД В ТЕКСТОВЫЙ ФАЙЛ

2.1. Создание текстового файла

В Visual Basic используется система ввода-вывода и классы, определенные средой .NET Framework. Программы выполняют операции ввода-вывода посредством потоков. Поток связывается с физическим устройством. На низком уровне система оперирует байтами. Три встроенных потока считывают и записывают символы. Доступ к ним осуществляется через свойства Console.In, Console.Out, Console.Error. По умолчанию они работают с консолью и клавиатурой, но могут быть перенаправлены на любое совместимое устройство ввода-вывода. Все классы потоков определены в пространстве имен System.IO, доступ к которому возможен после добавления в начало программы строки Imports System.IO.

Создание текстового файла может быть выполнено с помощью следующих строк кода: Dim F_Name = “a.txt” Dim fs As FileStream fs = New FileStream(F_Name, FileMode.Create)

При этом тот файл, который, возможно, уже существует, будет заменен новым. Если требуется добавить строки в уже существующий файл, то его нужно открыть с параметром Append: Dim fs As FileStream fs = New FileStream(F_Name, FileMode.Append)

Для записи символьной информации в текстовый файл можно использовать методы Write и WriteLine классa StreamWriter. Для этого создается объект класса StreamWriter: Dim fo As New StreamWriter(fs)

Метод WriteLine завершает строку парой управляющих символов, означающих конец строки. Метод Write не обеспечивает переход к следующей строке в файле. Например, следующие две команды выводят информацию в одну строку, причем вторая завершает строку. fo.Write(“Иванов - ”) fo.WriteLine("чемпион")

29

Методы WriteLine и Write могут выводить значения простых переменных так и целиком всего массива типа char, например: Dim n As Integer = 1 Dim c() As Char = {“A”, “B”, “C”, “D”, “E”} fo.Write(n) fo.Write(c)

Закрытие файла выполняется с помощью метода Close(), например: fo.Close() fs.Close()

Если при записи строк на русском языке возникает проблема распознавания символов, то она решается путем указания соответствующей кодовой страницы при создании файла. Dim w As New StreamWriter(fs, _ System.Text.Encoding.GetEncoding(1251))

Аналогично упомянутая проблема решается при чтении текста на русском языке. Dim w As New StreamReader(fs, _ System.Text.Encoding.GetEncoding(1251))

Пример программы

В программе используются строковая переменная s, целочисленная переменная i, a также fo – член класса StreamWriter. Ошибки при создании файла, а также при записи в него информации генерируют исключение IOException. Массив типа char выводится посимвольно fo.Write(c(i)), а затем весь сразу одной командой fo.WriteLine(c). ‘Пример 2.1 Imports System.IO Module Module1 Private Const FN As String = "a.txt" Sub Main() Dim fs As FileStream Try fs = New FileStream(FN, FileMode.Create) Catch e As IOException Console.WriteLine(e.Message)

30

Return End Try Dim s As String = "Вывод в текстовый файл" Dim i As Integer Dim c(26) As Char For i = 0 To 25 c(i) = Chr(i + 65) Next i Dim fo As New StreamWriter(fs) Try fo.WriteLine(s) For i = 0 To 26 fo.Write(c(i)) Next fo.WriteLine() fo.WriteLine(c) fo.WriteLine("Конец") Catch e As IOException Console.WriteLine(e.Message) End Try fo.Close() fs.Close() Console.WriteLine("Создан файл a.txt") Console.ReadLine() End Sub End Module

2.2. Задание на тему «Создание текстового файла»

Создать консольное приложение, создающее текстовый файл и записывающее в него не менее 15 символьных строк.

Порядок выполнения лабораторной работы

Создать новый проект – консольное приложение.

31

Добавить необходимый программный код. Компилировать программу. Тестировать программу. Создать документ с описанием работы программы.

2.3. Чтение информации из текстового файла

Открытие текствого файла может быть выполнено командами: Dim fs As FileStream fs = New FileStream(“a.txt”, FileMode.Open)

Для чтения символьной информации из текстового файла можно использовать методы Read и ReadLine класса StreamReader. Метод Read позволяет считывать из файла по одному символу. Dim fi As New StreamReader(fs) Dim s As String = fi.ReadLine()

Метод ReadLine читает из файла текущую строку целиком. Если достигнут конец файла, то метод возвращает null. Dim s As String = fi.ReadLine()

Можно загрузить текстовый файл целиком в одну строковую переменную с помощью метода ReadToEnd. Dim s As String = fi.ReadToEnd

Метод ReadBlock позволяет прочитать определенное количество символов, размещая их в массиве, начиная с указанного номера элемента: Dim c1(26) As Char fi.ReadBlock(c1, 0, 26)

Закрытие файла выполняется с помощью метода Close(), например: fi.Close()

Цикл с предусловием

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

32

Группа операторов End While

Группа операторов в теле цикла выполняется до тех пор, пока условие имеет значение true. Например, следующий фрагмент кода вычисляет произведение элементов числовой последовательности до тех пор, пока оно не превысит 1000. Dim n As Integer = 1 Dim p As Integer = 1 While p<1000 n = n +1 p = p * n End While

Пример программы

Программа читает информацию из текстового файла, созданного в примере из предыдущей темы. Используются массив с типа char, строковая переменная s, целочисленная переменная i, a также fi – член класса StreamReader. Обрабатываются исключения FileNotFoundException (файл не найден) и EndOfStreamException (попытка чтения после конца потока). ‘ Пример 2.2 Imports System.IO Module Module1 Private Const FN As String = "a.txt" Sub Main() ‘ Открыть файл для чтения Dim fs As FileStream Try fs = New FileStream(FN, FileMode.Open) Catch e As FileNotFoundException Console.WriteLine(e.Message) Return End Try Dim s As String

33

Dim i As Integer Dim c(26) As Char Dim fi As New StreamReader(fs) Try ‘ Читать одну строку s = fi.ReadLine() Console.WriteLine(s) For i = 0 To 26 ‘ Читать очередной символ (код символа) c(i) = Chr(fi.Read()) Console.Write(c(i)) Next Console.WriteLine() ‘ Читать два кода 13 и 10, означающих конец строки Console.WriteLine(fi.Read().ToString()) Console.WriteLine(fi.Read().ToString()) ‘ Читать блок символов в массив Dim c1(26) As Char fi.ReadBlock(c1, 0, 26) Console.WriteLine(c1) Catch e As EndOfStreamException Console.WriteLine(e.Message) End Try ‘ Закрыть файл fi.Close() fs.Close() Console.WriteLine("Прочитан файл a.txt") Console.ReadLine() End Sub End Module

34

2.4. Задание на тему «Чтение информации из текстового файла»

Задание для студентов: cоздать на языке Visual Basic консольное приложение, читающее строки из текстового файла и отображающее их на экране.

Порядок выполнения лабораторной работы

Создать новый проект – консольное приложение. Добавить необходимый программный код. Компилировать программу. Создать текстовый файл с исходными данными. Тестировать программу. - Создать документ с описанием работы программы.

35

3. ОБРАБОТКА ДАННЫХ

3.1. Формирование массива

При достаточно сложной обработке информации невозможно обойтись без структурных типов данных (один из них – строковый – уже был несколько раз использован в примерах из предыдущих глав). Массив – это таблица элементов, имеющих одно имя, но отличающихся значением индекса – номера элемента. Одномерный массив объявляется с помощью записи следующей формы: Dim имя_массива(макс_индекс) As тип

Здесь тип – это базовый тип данных каждого элемента массива. Целая величина макс_индекс определяет максимальный номер элемента массива. Минимальный номер равен 0. В следующей строке объявляется массив целых чисел, состоящий из 11 элементов. Первый элемент имеет индекс 0, а последний – 10. Dim a(10) As Integer

С элементами массива можно выполнять все те же действия, что и с простыми переменными указанного типа. Существенное отличие заключается в том, что номер элемента может указываться с помощью числовой переменной, а также с помощью арифметического выражения. Это позволяет строить сложные алгоритмы обработки данных. Dim a(10) As Integer Dim n As Integer A(0) = 10 A(1) = 7 n = 2 a(n) = a(0)+a(n-1)

Значения элементов массива могут быть заданы с помощью оператора присваивания, операцией ввода данных с клавиатуры или из файла, а также инициализацией в момент создания, например, массива вещественных чисел: Dim b() As Double = {0.0,1.0,2.0,3.0,4.0}

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

36

Dim b2() As Double = New Double() {0.1, 1.3, 2.5, 3.7, 4.9} В еще одном варианте объявления массив создается в одной

строке, а инициализируется в другой: Dim b3() As Double b3 = New Double() {0.01, 1.02, 2.03, 3.04, 4.05}

Пример программы

В примере создается один целочисленный и 3 вещественных массива из 5 элементов. В целочисленный массив заносятся случайные числа от 10 до 99. Вещественные массивы инициируются непосредственно при объявлении. Затем значения элементов массива выводятся на экран. ‘ Пример 3.1 Module Module1 Sub Main() Dim A(4) As Integer Dim b() As Double = {0.02, 1.04, 2.06, 3.08, 4.1} Dim b2() As Double = New Double() {0.1, 1.3, 2.5, 3.7, 4.9} Dim b3() As Double b3 = New Double() {0.01, 1.02, 2.03, 3.04, 4.05} For I As Integer = 0 To 4 A(I) = 10 + Int(90*Rnd) Next I For i As Integer = 0 To 4 Console.Write(A(i)) Console.Write(" " & b(i).ToString("00.00")) Console.Write(" ") Console.Write("{0:R2}", b2(i)) Console.Write(" ") Console.Write("{0:F2}", b3(i)) Console.WriteLine() Next Console.ReadLine() End Sub End Module

При выводе чисел использовано 3 способа форматирования. Первый – b(i).ToString("00.00") означает, что число выводится с

37

обязательными 2 знаками до запятой и 2 знаками после запятой. Второй и третий форматы похожи – они означают, что число выводится с обязательными 2 знаками после запятой. Числа отделяются друг от друга пробелами.

3.2. Задания на тему «Формирование массива»

Сформировать два массива и записать их содержимое в текстовый файл. В табл. 3.1 указаны типы данных, которые должны быть использованы в программе.

Таблица 3.1

Варианты задания на тему «Формирование массива» Вариант Массив 1 Массив 2 Вариант Массив 1 Массив 2

1 char integer 9 byte double 2 char long 10 single integer 3 char single 11 single long 4 char double 12 single short 5 char short 13 double integer 6 byte integer 14 double long 7 byte long 15 double short 8 byte single

Порядок выполнения лабораторной работы

Создать новый проект – консольное приложение. Добавить необходимый программный код. Компилировать программу. Тестировать программу. Создать документ с описанием работы программы.

3.3. Обработка массивов

Процедуры, которые применяются для обработки и анализа больших массивов данных, – это сортировка, фильтр, поиск. Мы не будем рассматривать традиционные алгоритмы. Для обработки данных воспользуемся методами класса System.Array. Рассмотрим массив целых чисел a1. Dim a1() As Integer = {2,4,3,7,1,8,6,9,0,5}

38

В данной строке длина массива не указана явно. Ее можно определить с помощью метода Length. Dim n As Integer = a1.Length

Сортировка массива a1 выполняется с помощью метода Sort: Array.Sort(a1)

Переставить элементы местами a1 так, чтобы первый стал последним, второй предпоследним и т.д., можно, применив метод Reverse: Array.Reverse(a1)

Копирование элементов одного массива в другой реализуем с помощью метода Copy, указав для первого массива индекс элемента, с которого начинается копирование, для второго – индекс элемента, с которого начинается вставка. Последний параметр – это количество копируемых элементов. Dim a2(9) As Integer Array.Copy(a1,0,a2,0,10)

Команда копирования может преобразовать тип числовых данных, при условии, что данные совместимы. Например, можно копировать данные из массива типа int в массив типа double. Dim a3(9) As Double a1.CopyTo(a3, 0)

Поиск позиции элемента, равного указанному значению, выполняет метод IndexOf. В том случае, если элемент не найден, метод возвращает значение -1. Dim n As Integer = Array.IndexOf(a1,9)

Для отсортированного массива аналогичное действие выполняет метод BinarySearch. Dim n As Integer = Array.BinarySearch(a1,9)

Позицию последнего элемента, имеющего указанное значение, определяет метод LastIndexOf. Dim n As Integer = Array.LastIndexOf(a1,9)

Для того чтобы очистить часть массива, то есть заполнить элементы нулями, требуется метод Clear. Например, следующая строка обнуляет 4 элемента массива, начиная с элемента, имеющего номер 6. Array.Clear(a1, 6, 4)

39

Опрос элементов коллекции

Коллекция – это группа объектов. Одним из типов коллекций является массив. Для опроса элементов коллекции используется цикл For Each, формат которого представлен ниже. For Each переменная As Тип in коллекция Инструкции Next

Здесь тип и переменная определяют итерационную переменную, которая в процессе работы цикла For Each будет получать значения элементов из коллекции. Итерационную переменную можно использовать только для чтения. При опросе массива тип должен совпадать с базовым типом массива. Цикл последовательно опрашивает элементы массива в направлении от наименьшего индекса к наибольшему. Например, следующие строки кода суммируют элементы массива целых чисел a1. ‘ Пример 3.2 Dim S As Integer = 0 For Each n As Integer in a1 S = S + n Next

Для преждевременного выхода из цикла до окончания опроса коллекции предназначена инструкция Exit For. Например, следующий пример определяет, есть ли среди элементов массива нуль. ‘ Пример 3.3 Dim F As Boolean = False For Each n As Integer in a1 If n=0 Then F = True Exit For End If Next

Пример программы

В примере создается целочисленный массив a1 из 20 элементов. С помощью генератора случайных чисел в массив заносятся числа от

40

10 до 99. Затем массив сортируется. Создается вещественный массив a2, в который копируются данные из a1. Порядок элементов массива a2 меняется на обратный. По два состояния каждого массива выводятся в текстовый файл. ‘ Пример 3.4 Module Module1 Sub Main() Dim i As Integer Dim fo As Integer Dim a1(20) As Integer For i = 0 To a1.Length - 1 a1(i) = 10 + 90 * Rnd() Next Try fo = FreeFile() FileOpen(fo, "a.txt", OpenMode.Output) Catch E As IOException Console.WriteLine(E.Message) End Try Try WriteLine(fo, "Массив чисел типа int") For Each n As Integer In a1 Write(fo, n) Next WriteLine(fo) Array.Sort(a1) WriteLine(fo, "Массив упорядочен") For Each n As Integer In a1 Write(fo, n) Next WriteLine(fo) Dim a2(20) As Double a1.CopyTo(a2, 0) WriteLine(fo, "Массив чисел типа double")

41

For Each x As Double In a2 Write(fo, x) Next WriteLine(fo) Array.Reverse(a2) WriteLine(fo, "Порядок элементов обратный") For Each x As Double In a2 Write(fo, x) Next Catch E As IOException Console.WriteLine(E.Message) End Try FileClose(fo) Console.WriteLine("Создан файл a.txt с 4 рядами чисел") Console.ReadLine() End Sub End Module

3.4. Задания на тему «Обработка массивов»

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

Таблица 3.2 Варианты задания на тему «Формирование массива»

Вариант Массив 1 Массив 2 Вариант Массив 1 Массив 2 1 byte integer 6 short long 2 byte long 7 short single 3 byte single 8 short double 4 byte double 9 integer single 5 short integer 10 integer double

42

Порядок выполнения лабораторной работы

Создать новый проект – консольное приложение. Добавить необходимый программный код. Компилировать программу. Тестировать программу. Создать документ с описанием работы программы.

43

4. БИНАРНЫЕ ФАЙЛЫ

4.1. Запись данных в бинарный файл

Данные в бинарный файл записываются не в символьном виде, а в том, в котором они хранятся в памяти. Для записи данных применяются методы Write, которые записывают данные всех встроенных Visual Basic-типов в их внутреннем формате. В частности, строка string записывается вместе со значением ее длины. Для создания бинарного файла используется класс BinaryWriter, который представляет собой оболочку для байтового потока, которая управляет записью двоичных данных. Пример создания файла: Dim Fs As FileStream Fs = New FileStream(F_Name, FileMode.CreateNew)

При этом, если файл с указанным именем существует, то произойдет ошибка. Если в первой строке использовать параметр FileMode.Create, то существующий файл будет удален и создан новый с тем же именем. Для записи данных в бинарный файл используются методы, представленные в табл. 4.1.

Таблица 4.1 Методы вывода данных класса BinaryWriter

Метод Описание Write(sbyte val) Записывает один байт со знаком Write(byte val) Записывает один байт без знака Write(byte[] buf) Записывает массив байтов Write(short val) Записывает целое число типа short Write(ushort val) Записывает целое число типа ushort (без знака) Write(int val) Записывает целое число типа int Write(uint val) Записывает целое число типа uint (без знака) Write(long val) Записывает целое число типа long (длинное целое) Write(ulong val) Записывает целое число типа ulong (без знака) Write(float val) Записывает вещественное число типа float Write(double val) Записывает вещественное число типа double Write(char val) Записывает символ Write(char[] val) Записывает массив символов Write(string val) Записывает строку типа string (включая ее длину)

44

Перечисленные методы способны определять все встроенные типы данных. Если при выводе массива байтов или символов указывается только имя, то массив выводится целиком. Если требуется вывести часть массива, то после его имени указывается индекс первого выводимого элемента, а затем количество выводимых элементов. Для записи информации в поток данных создается экземпляр класса BinaryWriter: Dim Fb As New BinaryWriter(Fs)

В одной из строк ниже выполняется запись всего массива байтов в файл, связанный с созданным экземпляром Fb класса BinaryWriter, а в другой – запись трех элементов, начиная с пятого (числа 5, 6, 7): Dim a As Byte = {0,1,2,3,4,5,6,7,8,9} Fb.Write(a) Fb.Write(a,5,3)

Классы определены в пространстве имен System.IO, доступ к которому возможен после добавления в начало программы строки Option System.IO. В случае неудачного исхода операции чтения генерируется исключение IOExcepion.

Закрытие файла выполняется с помощью метода Close, например: Fb.Close() Fs.Close()

Пример программы

В программе создаются 2 массива. Значения элементов массивов b и c задаются в цикле. Это латинские символы и их однобайтовые коды. Массивы b и c выводятся в файл целиком. Ошибки открытия файла, а также ошибки записи данных генерируют исключение IOExcepion. Команда Return в первом Catch-блоке завершает программу в случае ошибки при открытии файла. ‘ Пример 4.1 Imports System.IO Module Module1 Private Const FN As String = "b.bin" Sub Main() Dim fs As FileStream Try fs = New FileStream(FN, FileMode.Create)

45

Catch e As FileNotFoundException Console.WriteLine(e.Message) Return End Try Dim i As Integer Dim b(26) As Byte Dim c(26) As Char For i = 0 To 25 b(i) = i + 65 Next i For i = 0 To 25 c(i) = Chr(i + 65) Next i Dim w As New BinaryWriter(fs) Try w.Write(b, 0, 26) w.Write(c, 0, 26) Catch e As Exception Console.WriteLine(e.Message) End Try w.Close() fs.Close() Console.WriteLine("Создан файл b.bin") Console.ReadLine() End Sub End Module

Так как в качестве данных использованы символы и их коды, содержимое бинарного файла можно просмотреть с помощью программы Блокнот.

4.2. Задание на тему «Запись данных в бинарный файл»

Создать консольное приложение, создающее бинарный файл и записывающее в него данные из двух массивов. В табл. 4.2 указаны типы данных, которые должны быть использованы в программе.

46

Таблица 4.2

Варианты заданий на тему «Запись данных в бинарный файл» Вариант Массив 1 Массив 2 Вариант Массив 1 Массив 2

1 char short 6 byte short 2 char int 7 byte int 3 char long 8 byte long 4 char float 9 byte float 5 char double 10 Byte double

Порядок выполнения лабораторной работы

Создать новый проект – консольное приложение. Добавить необходимый программный код. Компилировать программу. Тестировать программу. Создать документ с описанием работы программы.

4.3. Чтение данных из бинарного файла

Для чтения двоичных данных используется класс BinaryReader, представляющий собой оболочку для байтового потока, который управляет чтением двоичных данных. Открытие файла может быть выполнено следующей парой команд: Dim fs As New FileStream fs = New FileStream(F_Name, FileMode.Open, FileAccess.Read)

Для чтения строк из файла используется один из методов, представленных в табл. 4.3.

Таблица 4.3 Методы ввода данных класса BinaryReader

Метод Описание 1 2

Read() Читает один байт

Read(мас_byte, поз_мас, кол_байт) Читает указанное количество байтов в массив

ReadBytes(количество) Читает символы и возвращает в виде массива

Read(мас_char, поз_мас, кол_симв) Читает символы в массив ReadBoolean() Читает значение типа bool

47

Окончание табл. 4.3

1 2 ReadByte() Читает значение типа byte ReadSByte() Читает значение типа sbyte ReadChar() Читает значение типа char

ReadChars(количество) Читает символы и возвращает в виде массива

ReadDouble() Читает значение типа double ReadSingle() Читает значение типа float ReadInt16() Читает значение типа short ReadInt32() Читает значение типа int ReadInt64() Читает значение типа long ReadString() Читает значение типа string

Для получения данных из файла создается экземпляр класса BinaryReader. Dim fb As New BinaryReader(fs)

В следующих строках выполняется чтение из файла, связанного с описанным выше экземпляром класса BinaryReader: сначала 10 байтов в массив, начиная с элемента с индексом 0; затем одного вещественного числа типа single и одного целого числа типа long. Dim a(26) Fb.Read(a, 0, 10) Dim x As single = Fb.ReadSingle() Dim n As long = Fb.ReadToInt64()

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

Пример программы

В программе создаются 2 массива. С помощью одной команды читаютя 26 байтов в массив a, затем аналогично читаются данные в массив b. Прочитанные данные выводятся на экран, при этом байты, которые подразумеваются кодами символов, при выводе преобразуются в символы. Обрабатываются исключения FileNotFoundException (файл не найден) и EndOfStreamException (попытка чтения после конца потока).

48

‘ Пример 4.2 Imports System.IO Module Module1 Private Const FN As String = "b.bin" Sub Main()

Dim fs As New FileStream Try fs = New FileStream(FN, FileMode.Open, FileAccess.Read) Catch e As FileNotFoundException Console.WriteLine(e.Message) Return End Try

Dim r As New BinaryReader(fs) Try b = r.ReadBytes(26) c = r.ReadChars(26) Catch e As EndOfStreamException Console.WriteLine(e.Message) End Try r.Close() fs.Close() For i = 0 To 25 Console.Write(Chr(b(i))) Next i Console.WriteLine() For i = 0 To 25 Console.Write(c(i)) Next i Console.ReadLine()

End Sub End Module

49

4.4. Задания на тему «Чтение данных из бинарного файла»

Создать консольное приложение, читающее данные из бинарного файла в два массива. Использовать в качестве тестовых данных файл, созданный в работе на тему «Запись данных в бинарный файл». В табл. 4.4 указаны типы данных, которые должны быть использованы в программе.

Таблица 4.4 Варианты заданий на тему «Чтение данных из бинарного файла»

Вариант Массив 1 Массив 2 Вариант Массив 1 Массив 2 1 char short 6 byte short 2 char integer 7 byte integer 3 char long 8 byte long 4 char single 9 byte single 5 char double 10 byte double

Порядок выполнения лабораторной работы

Создать новый проект – консольное приложение. Добавить необходимый программный код. Компилировать программу. Создать бинарный файл с исходными данными. Тестировать программу. Создать документ с описанием работы программы.

50

5. ВИЗУАЛЬНЫЕ КОМПОНЕНТЫ

5.1. Примеры визуальных компонентов

Современную технологию разработки программных продуктов упрощенно можно разбить на два шага: проектирование интерфейса и программирование обработки событий. Реализация интерфейса состоит, как правило, в добавлении необходимых визуальных компонентов на стандартную форму. Эти компоненты обеспечивают ввод и отображение информации, просмотр списков, выбор, организацию меню и т.д. Если при создании проекта вы указываете Приложение Windows Forms, то автоматически генерируется стандартная форма, на которой можно разместить все необходимые визуальные компоненты. В левой части рис. 5.1 отображена часть компонетов Панели элементов, которая открывается щелчком мыши.

Рис. 5.1. Панель с визуальными компонентами

Например, компонент Label предназначен для вывода сообщений. Текст сообщения присваивается свойству Text компонента. В табл. 5.1 перечислены некоторые визуальные компоненты.

51

Таблица 5.1

Примеры визуальных компонентов

Компонент Описание Button Управляющая кнопка CheckBox Флажок для выбора ComboBox Список с полем для ввода строки Label Поле для вывода строки ListBox Поле со списком PictureBox Поле для вывода рисунка RadioButton Переключатель для выбора одного из вариантов TextBox Поле для ввода строки

Свойства и параметры компонентов можно указывать непосредственно при построении формы в окне обозревателя свойств. После построения интерфейса в проект добавляют программный код обработки событий. Например, для добавления обработки события «щелчок по управляющей кнопке» нужно дважды щелкнуть по данной кнопке в конструкторе форм, а затем ввести соответствующий код в открывшуюся функцию. Программа, созданная после компиляции проекта, открывается в типичном для Windows окне. Вид и поведение компонента определяют его свойства, которые можно изменять как в программе, так и в конструкторе формы. В табл. 5.2–5.8 приводятся важнейшие свойства перечисленных выше компонентов.

Таблица 5.2 Свойства компонента Form

Name Имя формы Text Строка заголовка Size Размер (width – ширина, height – высота) FormBorderStyle Тип формы ControlBox Управление кнопками в строке заголовка Icon Значок в строке заголовка Font Шрифт для объектов на форме (по умолчанию) ForeColor Цвет символов у всех объектов на форме BackColor Цвет фона

52

Таблица 5.3 Свойства компонента TextBox

Text Текст в поле ввода MaxLength Количество символов PasswordChar Символ, отображаемы при вводе пароля MultiLine Несколько строк ReadOnly Запрет редактирования Dock Привязка к форме Lines Массив строк ScrollBars Полосы прокрутки

Таблица 5.4 Свойства компонента Label

Text Отображаемый текст AutoSize Автоматическое изменение размера TextAlign Выравнивание текста BorderStyle Вид рамки

Таблица 5.5 Свойства компонента Button

FlatStyle Стиль кнопки Enabled Доступность кнопки Visible Видимость кнопки Cursor Вид указателя мыши Image Картинка на кнопке ToolTip Подсказка рядом с кнопкой

Таблица 5.6 Свойства компонентов CheckBox и RadioButton

Text Текст справа от кнопки Checked Состояние кнопкп AutoCheck Автоматическое изменение состояния переключателя FlatStyle Стиль переключателя Appearance Вид переключателя

Таблица 5.7 Свойства компонента ListBox

Items Список строк SelectedIndex Номер выбранного элемента Sorted Автоматическая сортировка SelectionMode Режим выбора MultiColumn Несколько колонок

53

Таблица 5.8 Свойства компонента ComboBox

Text Текст на кнопке DropDownStyle Вид компонента Items Список строк Items.Count Количество строк SelectedIndex Номер выбранной строки Sorted Автоматическая сортировка MaxDropDownItems Количество отображаемых строк DropDownWidth Ширина области списка

Свойства и параметры компонентов можно указывать непосредственно при построении формы в окне обозревателя свойств. После построения интерфейса в проект добавляют программный код обработки событий.

Пример программы

В программе создана функция Goroskop, которая в зависимости от значения глобальной переменной God выбирает название года и соответствующий рисунок, а также отображает эту информацию на форме в компонентах TextBox, Label, PictureBox. Номер выбора определяется с помощью формулы God Mod 12 + 1, где оператор Mod означает получение остатка от деления. Чтобы целое число разместить в поле TextBox, его преобразуют в строку с помощью метода ToString. Для размера рисунка выбирают свойство StretchImage, означающее, что он будет подогнан по размерам окна PictureBox. ‘ Пример 5.1 Dim n As Integer n = God Mod 12 + 1 TextBox1.Text = God.ToString() PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage

Затем функция выбирает название года и соответствующий рисунок с помощью оператора выбора Select-Case-End Select. Изображение в поле PictureBox загружается с помощью метода System.Drawing.Image.FromFile. ‘ Пример 5.2 PictureBox1.Visible = True Select Case (n)

54

Case 1 Label1.Text = "Бык" PictureBox1.Image = System.Drawing.Image.FromFile("1.jpg") Case 2 Label1.Text = "Тигр" PictureBox1.Image = System.Drawing.Image.FromFile("2.jpg") Case Else Label1.Text = "Неизвестен" PictureBox1.Visible = False End Select

При открытии формы в процедуре Form1_Load глобальной переменной god присваивается значение 2009, после чего вызывается функция goroskop, отображающая информацию, соответствующую числу 2009. Свойству SizeMode компонента PictureBox присваивается значение Zoom, означающее пропорциональную подгонку рисунка под размеры компонента. God = 2009 goroskop() PictureBox1.SizeMode = PictureBoxSizeMode.Zoom

В функциях Button1_Click и Button2_Click значение переменной God уменьшается или увеличивается на 1. Это изменение отображается на форме с помощью функции goroskop. Изменить величину переменной можно непосредственно в поле TextBox, после чего также вызывается функция goroskop. Для преобразования строки из поля TextBox в целое число используется метод ToInt32 класса Convert. ‘ Пример 5.3 if TextBox1.Text.Length > 0 Then God = Convert.ToInt32(textBox1.Text) goroskop() End If

5.2. Задание на тему «Визуальные компоненты»

Создать приложение Windows Forms, осуществляющее выбор рисунков и текстовых строк, например «Гороскоп». Обязательно использовать компоненты Label, Button, TextBox, PictureBox, а также оператор выбора Select.

55

Порядок выполнения лабораторной работы

Создать новый проект – приложение Windows Forms. Вынести на форму необходимые визуальные компоненты. Добавить программный код обработки событий. Компилировать программу. Тестировать программу. Создать документ с описанием работы программы.

5.3. Управляющие визуальные компоненты

Для управления работой программы в Visual Studio предлагаются множество визуальных компонентов, в том числе, управляющие кнопки, радиокнопки, меню, списки и др. Для того, чтобы пользоваться списком ListBox необходимо иметь возможность размещать в нем строки для выбора, определять номер и текст выбранного пункта, сортировать строки списка. В табл. 5.9 приведены некоторые методы, предназначенные для работы со списком ListBox (рис. 5.2).

Рис. 5.2. Список ListBox

Таблица 5.9 Методы, предназначенные для работы со списком ListBox

Метод Описание GetSelected(номер) Выбран ли пункт с указанным номером SelectedIndex Номер выбранного пункта SetSelected(номер, true|false) Установить или отменить выбор пункта Sorted Сортировка строк Text Текст выбранной строки TopIndex Номер первой видимой строки ToString() Преобразование в тип String

Аналогичное назначение имеет список CheckedListBox, который

отличается от ListBox тем, что слева от строк в нем имеются поля для отметки пунктов галочкой (рис. 5.3).

56

Текстовые меню понятны и удобны для пользователя. После размещения на форме компонента MenuStrip пользователю предлагаются возможные продолжения описания пунктов меню, новые пункты

добавляются щелчком мыши. После создания пункта выполняется добавление обработки события «Выбор пункта меню», которое

начинается с двойного щелчка по созданному пункту (рис. 5.4).

Рис. 5.4. Компонент MenuStrip

Примеры работы со свойствами компонентов

Во фрагменте, представленном ниже, в имеющийся список ListBox добавляются 3 строки текста. После добавления один пункт (номер 0) выделяется. Отметим, что нумерация пунктов начинается с нуля. ‘ Пример 5.4 ListBox2.BeginUpdate() ListBox2.Items.Add("Авангард") ListBox2.Items.Add("Локомотив") ListBox2.Items.Add("Металлург") ListBox2.EndUpdate() ListBox2.SetSelected(0, true)

Во втором фрагменте в функции, обрабатывающей событие «Выбор в списке», определяются номер и текст выбранного пункта. Затем проверяется, выбран или нет пункт 4, а также определяется номер первого пункта, видимого в окне списка. ‘ Пример 5.5 Label1.Text = ListBox1.Text

Рис. 5.3. Список CheckedBox

57

Label2.Text = ListBox1.SelectedIndex.ToString() Label3.Text = ListBox1.GetSelected(4).ToString() Label4.Text = ListBox1.TopIndex.ToString()

5.4. Задание на тему «Управляющие визуальные компоненты»

Создать приложение Windows Forms, осуществляющее выбор рисунков и текстовых строк с помощью меню и списка. Обязательно использовать компоненты ListBox, MenuStrip, а также оператор выбора Select Case.

Порядок выполнения лабораторной работы

Создать новый проект – приложение Windows Forms. Вынести на форму необходимые визуальные компоненты. Добавить программный код обработки событий. Компилировать программу. Тестировать программу. Создать документ с описанием работы программы.

5.5. Использование визуальных компонентов

Для того чтобы сделать какой-либо компонент активным, достаточно щелкнуть по нему мышью. В случаях, когда выгоднее программно передать состояние активности или «фокус» компоненту, необходимо выполнить команду, аналогичную указанной ниже. После данной команды поле ввода станет активным и в нем появится курсор ввода текста. TextBox1.Focus()

Ряд компонентов предполагают выбор из нескольких вариантов. Иногда имеет смысл выбрать их программно. Ниже приводятся команды выбора компонентов CheckBox и RadioButton. После выполнения этих команд в соответствующих компонентам квадратике и кружочке появятся значки выбора. CheckBox1.Checked = true RadioButton1.Checked = true

Для выбора произвольной строки компонента ComboBox нужно указать ее номер, учитывая, что нумерация начинается с нуля. В

58

примере ниже выбирается первая строка (ее номер равен 0). Текст выбранной строки появится в поле выбора. ComboBox1.SelectedIndex = 0

Иногда после некоторых событий требуется временно прекратить доступ пользователя к некоторому компоненту. Для этого нужно присвоить свойству Enabled значение false, как в примере ниже. Вернуть доступ к компоненту можно, присвоив этому свойству значение true. TextBox1.Enabled = false

Компоненты, предназначенные для ввода и отображения информации TextBox, Label и др., содержат строковые данные. Числовые величины, размещаемые в Label, необходимо преобразовать в строковые. В первой строке ниже значение целочисленной переменной отображается как целое без дробной части, а во второй строке – как «коммерческое» с двумя знаками после десятичной точки и буквой «р» в конце. Label1.Text = n.ToString() Label2.Text = n.ToString(“c”)

Для того чтобы определить, есть ли информация в поле ввода, можно проверить его длину, например: If (TextBox1.Length>0) Then

Как было сказано выше, поле ввода TextBox содержит строковые данные. Если вводится число, то эти строковые данные необходимо преобразовать в соответствующий числовой тип. В примере, представленном ниже, команда в первой строке преобразует строку в целый тип, во второй – в вещественный с двойной точностью. Dim n As Integer = Convert.ToInt32( textBox1.Text ) Dim x As Double = Convert.ToDouble( textBox1.Text )

Нужно отметить, что при вводе вещественного числа в TextBox целая часть от дробной отделяется запятой.

Выход из программы можно осуществить щелчком по кнопке с крестиком в строке заголовка. Также наглядно выполнять выход с помощью специальной управляющей кнопки. В процедуру обработки события (щелчок по кнопке) нужно добавить одну строку: Close()

59

5.6. Задания на тему «Использование визуальных компонентов»

Создать приложение Windows Forms, используя несколько визуальных компонентов, указанных в варианте задания.

Варианты 1–3. Разработать программу, вычисляющую сумму, разность и произведение двух вещественных чисел. В табл. 5.10 указаны компоненты, которые требуется использовать в программе.

Таблица 5.10 Компоненты, которые нужно использовать в вариантах 1–3

Вариант Ввод или выбор чисел

Выбор операции

Подтверждение операции и выход

Вывод результата

1 TextBox RadioButton Button TextBox 2 ComboBox RadioButton Button Label 3 TextBox CheckBox Button TexBox

Варианты 4–6. Разработать программу, вычисляющую максимум, минимум и среднее из трех однозначных чисел. В табл. 5.11 указаны компоненты, которые требуется использовать в программе.

Таблица 5.11 Компоненты, которые нужно использовать в вариантах 4–6

Вариант Ввод или выбор чисел

Выбор операции

Подтверждение операции и выход

Вывод результата

4 ComboBox RadioButton Button Label 5 TextBox RadioButton Button TextBox 6 TextBox ComboBox Button Label

Варианты 7–9. Разработать программу, определяющую номер группы, если известны специальность и курс. В табл. 5.12 указаны компоненты, которые требуется использовать в программе.

Таблица 5.12 Компоненты, которые нужно использовать в вариантах 7–9

Вариант Выбор курса Выбор специальности

Подтверждение операции и выход

Вывод результата

7 ComboBox ComboBox Button Label

8 TextBox TextBox Button Label

9 ComboBox TextBox Button TexBox

60

Варианты 10–12. Разработать программу, определяющую номер автобуса и время отправления по названию пункта, в который нужно прибыть. В табл. 5.13 указаны компоненты, которые требуется использовать в программе.

Таблица 5.13 Компоненты, которые нужно использовать в вариантах 10–12

Вариант Выбор пункта прибытия

Выбор полей для вывода

Подтверждение операции и выход

Вывод результата

10 ComboBox CheckBox Button Label

11 RadioButton CheckBox Button Label

12 TextBox CheckBox Button Label

Варианты 13–15. Разработать программу-расписание, определяющую номер аудитории и дисциплину по дню недели и номеру пары (урока). В табл. 5.14 указаны компоненты, которые требуется использовать в программе.

Таблица 5.14 Компоненты, которые нужно использовать в вариантах 13–15

Вариант Ввод или выбор дня

Ввод или выбор номера пары

Подтверждение операции и выход

Вывод результата

13 TextBox CheckBox Button Label

14 CheckBox ComboBox Button Label

15 RadioButton CheckBox Button TextBox

Варианты 16–18. Разработать программу-путеводитель, определяющую этаж и номер кабинета по названию отдела. В табл. 5.15 указаны компоненты, которые требуется использовать в программе.

Таблица 5.15 Компоненты, которые нужно использовать в вариантах 16–18

Вариант Ввод или выбор отдела

Выбор полей для вывода

Подтверждение операции и выход

Вывод результата

16 TextBox CheckBox Button Label

17 CheckBox ComboBox Button Label

18 RadioButton CheckBox Button Label

61

Варианты 19–21. Разработать программу, определяющую цену товара и цену со скидкой (при покупке значительного количества). В табл. 5.16 указаны компоненты, которые требуется использовать в программе.

Таблица 5.16 Компоненты, которые нужно использовать в вариантах 19–21

Вариант Ввод или выбор наименования товара

Ввод или выбор количества товара

Подтверждение операции и выход

Вывод результата

19 TextBox CheckBox Button Label 20 ComboBox TextBox Button TextBox 21 RadioButton NumericUpdown Button Label

Варианты 22–24. Разработать программу, определяющую стоимость заказа по набору блюд и количеству персон. В табл. 5.17 указаны компоненты, которые требуется использовать в программе.

Таблица 5.17 Компоненты, которые нужно использовать в вариантах 22–24

Вариант Ввод исходного значения

Ввод или выбор количества персон

Подтверждение операции и выход

Вывод результата

22 CheckBox TextBox Button TextBox 23 CheckBox RadioButton Button Label 24 CheckBox NumericUpDown Button Label

Варианты 25–27. Разработать программу, определяющую стоимость билета по пункту назначения и качеству посадочного места. В табл. 5.18 указаны компоненты, которые требуется использовать в программе.

Таблица 5.18 Компоненты, которые нужно использовать в вариантах 25–27

Вариант Выбор пункта назначения

Выбор качества места

Подтверждение операции и выход

Вывод результата

25 ComboBox RadioButton Button Label 26 CheckBox NumericUpDown Button TextBox 27 CheckedListBox RadioButton Button Label

Варианты 28–30. Разработать программу, переводящую мили в километры (в 1 км 1,609344 мили) и фунты в килограммы (в 1 кг 0,4095 фунтов). В табл. 5.19 указаны компоненты, которые требуется использовать в программе.

62

Таблица 5.19 Компоненты, которые нужно использовать в вариантах 29–30

Вариант Ввод исходного значения

Выбор преобразования

Подтверждение операции и выход

Вывод результата

28 TextBox RadioButton Button TextBox 29 TextBox ComboBox Button Label 30 TextBox CheckBox Button Label

Порядок выполнения лабораторной работы

Создать новый проект – приложение Windows Forms. Вынести на форму необходимые визуальные компоненты. Добавить программный код обработки событий. Компилировать программу. Тестировать программу. Создать документ с описанием работы программы.

63

6. ПРОСМОТР КАТАЛОГОВ И ФАЙЛОВ

6.1. Просмотр и выбор в дереве каталогов

Для того чтобы иметь представление о системе, необходим список логических дисков, который можно получить с помощью метода GetLogicalDrives класса Environment. Например, следующая строка программы размещает имена дисков в массиве строк L_D. Количество дисков определяется с помощью функции Length. Dim L_D() As String = Environment.GetLogicalDrives() Dim Nd As Integer = L_D.Length

Какие папки размещены в данном каталоге, можно узнать с помощью метода GetDirectories класса System.IO.Directory. Например, строка ниже помещает список всех подкаталогов корневого каталога в массив строк S_F. Dim S_F() As String = IO.Directory.GetDirectories("c:\") Dim Nf As Integer = S_F.Length

Указанный метод дает возможность отфильтровать папки по маске, например, выбрать те, которые начинаются с буквы W: Dim W() As String = IO.Directory.GetDirectories("c:\,"W*")

Просмотр и выбор в дереве каталогов осуществляется с помощью класса FolderBrowserDialog, который предоставляет способ выдачи приглашения пользователя для просмотра, выбора, а также создания папки. Этот класс используется, когда необходимо разрешить пользователю выбирать только папки, но не файлы. Обзор папок осуществляется с помощью дерева. Могут выбираться только папки из файловой системы; выбор виртуальных папок невозможен. В примере кода ниже создается новый объект класса FolderBrowserDialog и устанавливается имя корневой папки RootFolder, с которой начинается просмотр, например, Мой компьютер: Dim FolderBrowserDialog1 As New FolderBrowserDialog() FolderBrowserDialog1.RootFolder = _ Environment.SpecialFolder.MyComputer

Можно использовать свойство ShowNewFolderButton, чтобы указать, имеется ли у пользователя возможность создания новых

64

папок с помощью кнопки Создать папку, например, следующая строка запретит отображение этой кнопки: FolderBrowserDialog1.ShowNewFolderButton = False

Свойство Description предоставляет пользователю текстовую подсказку. FolderBrowserDialog1.Description = "выберите папку"

Метод ShowDialog служит для отображения диалогового окна с деревом каталогов (рис. 6.1), в котором пользователь выбирает папку. Если пользователь выбрал папку, то результатом диалога является DialogResultOK, а свойство SelectedPath будет содержать путь к выбранной папке. В строках кода ниже путь отображается в поле Label: If FolderBrowserDialog1.ShowDialog() = DialogResult.OK Then Label1.Text = FolderBrowserDialog1.SelectedPath End If

Рис. 6.1. Окно FolderBrowserDialog

Объект FolderBrowserDialog является модальным диалоговым окном. Поэтому, когда это окно отображается, остальная часть приложения блокируется до тех пор, пока пользователь не выберет папку. Программа должна скрыть или закрыть диалоговое окно перед тем, как разрешить ввод в вызывающую программу.

65

Пример программы

Данный пример кода может быть использован, например, в качестве обработки события Button.Click. В нем с помощью метода ShowDialog класса FolderBrowserDialog осуществляется выбор папки, полное имя которой выводится в поле Label. Для доступа к указанному классу требуется строка Imports System.IO. В качестве корневого каталога указан Мой компьютер. ‘ Пример 6.1 Dim FolderBrowserDialog1 As New FolderBrowserDialog() FolderBrowserDialog1.Description = "выберите папку" FolderBrowserDialog1.ShowNewFolderButton = False FolderBrowserDialog1.RootFolder = _ Environment.SpecialFolder.MyComputer If FolderBrowserDialog1.ShowDialog() = DialogResult.OK Then Label1.Text = FolderBrowserDialog1.SelectedPath Else Label1.Text = "" End If

6.2. Задание на тему «Просмотр и выбор в дереве каталогов»

Разработать программу, которая выполняет следующие действия: 1) получает список логических дисков; 2) дает пользователю возможность выбора одного из дисков; 3) предоставляет пользователю возможность выбора произвольной папки на этом диске; 4) получает и выводит в текстовый файл список подкаталогов выбранной папки; 5) получает и выводит в текстовый файл список подкаталогов по маске.

Порядок выполнения лабораторной работы

Создать новый проект – приложение Windows Forms. Вынести на форму необходимые визуальные компоненты. Добавить программный код обработки событий. Компилировать программу. Тестировать программу. Создать документ с описанием работы программы.

66

6.3. Выбор файла в каталоге

Для того чтобы получить список файлов из произвольной папки, можно применить метод GetFiles класса System.IO.Directory. Например, ниже список файлов помещается в массив строк FL, а количество файлов – в переменную N. Dim FL() As String = IO.Directory.GetFiles("c:\") Dim N As Integer = FL.Length

Метод GetFiles позволяет отфильтровать файлы по маске, например, выбрать те, которые начинаются с буквы S: Dim FL() As String = System.IO.Directory.GetFiles("c:\","S*") Dim N As Integer = FL.Length

Для выбора произвольного файла из папки служит класс OpenFileDialog. Этот класс позволяет проверить, существует ли файл, и открыть его. Свойство ShowReadOnly определяет, отображается ли в диалоговом окне флажок «Доступно только для чтения». Свойство ReadOnlyChecked показывает, установлен ли флажок «Доступно только для чтения». Значительная часть возможностей этого класса находится в классе FileDialog.

После создания нового объекта класса OpenFileDialog требуется указать папку, в которой пользователь начнет выбор файла. Dim openFileDialog1 As New OpenFileDialog() openFileDialog1.InitialDirectory = "C:\"

Сократить количество просматриваемых файлов можно с помощью маски, которая состоит из пар описание-маска, разделенных вертикальной чертой. Например, ниже задаются два варианта маски. openFileDialog1.Filter = "текстовые файлы .txt|*.txt|все файлы|*.*" openFileDialog1.FilterIndex = 2

Можно также изменить заголовок диалогового окна: openFileDialog1.Title = "Выбор текстового файла"

Метод ShowDialog служит для отображения диалогового окна с деревом каталогов (рис. 6.2), в котором пользователь выбирает файл. Если пользователь выбрал файл, то результатом диалога является DialogResultOK, а свойство SafeFileName будет содержать имя выбранного файла. If openFileDialog1.ShowDialog() = DialogResult.OK Then Label1.Text = openFileDialog1.SafeFileName

67

End If

Рис. 6.2. Окно OpenFiledialog

Объект OpenFileDialog является модальным диалоговым окном. Поэтому, когда это окно отображается, остальная часть приложения блокируется до тех пор, пока пользователь не выберет папку. Программа должна скрыть или закрыть диалоговое окно перед тем, как разрешить ввод в вызывающую программу.

Если следует предоставить пользователю возможность выбрать папку, а не файл, используйте объект FolderBrowserDialog.

Пример программы

В следующем примере кода создается экземпляр класса OpenFileDialog. Чтобы использовать указанный класс, в программу обязательно должно быть добавлено пространство имен System.IO. С помощью метода ShowDialog отображается диалоговое окно, в котором осуществляется выбор текстового файла. Для окна указывается заголовок Title, папка InitialDirectory, с которой начинается выбор, а также строка фильтра Filter, состоящая из пар подсказка|маска. Имя файла отображается в компоненте Label.

68

Содержимое текстового файла читается в поле TextBox. Для решения проблем с распознаванием русских букв указывается соответствующая кодовая таблица Text.Encoding.GetEncoding(1251). ‘ Пример 6.2 Dim fs As FileStream = Nothing Dim openFileDialog1 As New OpenFileDialog() Dim INI_FLD As String = "C:\_Pro" openFileDialog1.Title = "Выбор текстового файла" openFileDialog1.InitialDirectory = INI_FLD openFileDialog1.Filter = _ "текстовые файлы .txt|*.txt|все файлы|*.*" openFileDialog1.FilterIndex = 2 openFileDialog1.RestoreDirectory = True openFileDialog1.FileName = "" If openFileDialog1.ShowDialog() = DialogResult.OK Then Try fs = openFileDialog1.OpenFile() If (fs IsNot Nothing) Then Label1.Text = openFileDialog1.SafeFileName Dim fi As New StreamReader(fs, _ System.Text.Encoding.GetEncoding(1251)) TextBox1.Text = fi.ReadToEnd() fi.Close() End If Catch e1 As Exception Label1.Text = e1.Message Finally fs.Close() End Try End If

6.4. Задание на тему «Выбор файла в каталоге»

Разработать программу, которая выполняет следующие действия: 1) предоставляет пользователю возможность выбора произвольной папки на диске; 2) получает и выводит в текстовый файл список файлов по маске из выбранной папки; 3) предоставляет пользователю

69

возможность выбора текстового файла; 4) читает и отображает на экране содержимое файла; 5) выводит в новый текстовый файл прочитанную информацию.

Порядок выполнения лабораторной работы

Создать новый проект – приложение Windows Forms. Вынести на форму необходимые визуальные компоненты. Добавить программный код обработки событий. Компилировать программу. Тестировать программу. Создать документ с описанием работы программы.

6.5. Сохранение файла в папке

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

После создания нового объекта класса SaveFileDialog требуется указать папку, в которой пользователь начнет выбор файла. Dim SaveFileDialog1 As New SaveFileDialog() SaveFileDialog1.InitialDirectory = "C:\Tmp\"

Сократить количество просматриваемых файлов можно с помощью маски, которая состоит из пар описание-маска, разделенных вертикальной чертой. Например, ниже задаются два варианта маски. SaveFileDialog1.Filter = "текстовые файлы .txt|*.txt|все файлы|*.*" SaveFileDialog1.FilterIndex = 2

Можно также изменить заголовок диалогового окна: SaveFileDialog1.Title = "Выбор текстового файла"

Метод ShowDialog служит для отображения диалогового окна (рис. 6.3), в котором пользователь выбирает папку. Если пользователь подтвердил сохранение файла, то результатом диалога является DialogResultOK. Функция OpenFile открывает или создает файл для записи нового содержимого. Свойство FileName содержит имя записанного файла. If SaveFileDialog1.ShowDialog() = DialogResult.OK Then

70

fs = SaveFileDialog1.OpenFile() Label1.Text = SaveFileDialog1.FileName

Объект SaveFileDialog является модальным диалоговым окном. Поэтому, когда это окно отображается, остальная часть приложения блокируется до тех пор, пока пользователь не выберет папку. Программа должна скрыть или закрыть диалоговое окно перед тем, как разрешить ввод в вызывающую программу.

Рис. 6.3. Окно SaveFileDialog

Пример программы

В следующем примере кода показано создание SaveFileDialog, задание элементов, вызов диалогового окна с помощью метода ShowDialog и сохранение текущего файла. В созданный текстовый файл выводится содержимое компонента TextBox. Для решения проблем с распознаванием русских букв указывается соответствующая кодовая таблица Text.Encoding.GetEncoding(1251). В примере предполагается, что используется форма, на которой размещена кнопка.

71

‘ Пример 6.3 Dim fs As FileStream = Nothing Dim SaveFileDialog1 As New SaveFileDialog() Dim INI_FLD As String = "C:\_Pro" SaveFileDialog1.Title = "Выбор текстового файла" SaveFileDialog1.InitialDirectory = INI_FLD SaveFileDialog1.Filter = _ "текстовые файлы .txt|*.txt|все файлы|*.*" SaveFileDialog1.FilterIndex = 2 SaveFileDialog1.RestoreDirectory = True SaveFileDialog1.FileName = "" If SaveFileDialog1.ShowDialog() = DialogResult.OK Then Try fs = SaveFileDialog1.OpenFile() If (fs IsNot Nothing) Then Label1.Text = SaveFileDialog1.FileName Dim fo As New StreamWriter(fs, _ System.Text.Encoding.GetEncoding(1251)) fo.Write(TextBox1.Text) fo.Close() End If Catch e1 As Exception Label1.Text = e1.Message Finally fs.Close() End Try End If

6.6. Задание на тему «Сохранение файла в папке»

Разработать программу, которая выполняет следующие действия: 1) предоставляет пользователю возможность выбора произвольного текстового файла на диске; 2) читает и отображает на экране содержимое файла; 3) предоставляет пользователю возможность редактирования текста; 4) предоставляет пользователю возможность сохранения файла с прежними или с выбранными произвольно именем и адресом.

72

Порядок выполнения лабораторной работы

Создать новый проект – приложение Windows Forms. Вынести на форму необходимые визуальные компоненты. Добавить программный код обработки событий. Компилировать программу. Тестировать программу. Создать документ с описанием работы программы.

6.7. Просмотр графических файлов

Приводим фрагмент кода, предназначенный для просмотра в окне PictureBox графического файла с именем, полученным из диалога openFileDialog. Параметр PictureBoxSizeMode.Zoom означает, что рисунок будет пропорционально растянут в окне PictureBox. PictureBox1.Visible = False PictureBox1.Image = New Bitmap(openFileDialog1.FileName) PictureBox1.SizeMode = PictureBoxSizeMode.Zoom PictureBox1.Visible = True

Для удобства список файлов можно разместить в компоненте ListBox. Список файлов помещаем в массив FL с помощью метода GetFiles класса System.IO.Directory. Строки в ListBox очищаются при помощи функции Items.Clear, а содержимое в них добавляется функцией Items.Add. Dim FL() As String = IO.Directory.GetFiles("c:\Foto","*.jpg") Dim N As Integer = FL.Length ListBox1.Items.Clear() For i As Integer = 0 To N - 1 ListBox1.Items.Add(FL(i)) Next

Произвольный элемент в списке можно выбрать по его номеру. Нумерация начинается с нуля. Количество строк в списке определяется с помощью функции Items.Count. Для выбора номера может быть использован компонент NumericUpDown. Номер элемента списка указывается в квадратных скобках. numericUpDown1.Minimum = 0 numericUpDown1.Maximum = listBox1.Items.Count-1

73

Выбор номера элемента списка может осуществляться с помощью компонента NumericUpDown, а содержимое выбранной таким образом строки ListBox.Items отображаться в Label. Label1.Text = ListBox1.Items(NumericUpDown1.Value).ToString()

Пример программы

Приводим ниже текст программы, в которой файл выбирается с помощью класса OpenFileDialog. ‘ Пример 6.4 Imports System.IO Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Dim fs As FileStream = Nothing Dim openFileDialog1 As New OpenFileDialog() Dim INI_FLD As String = "C:\Foto\" openFileDialog1.Title = "Выбор графического файла" openFileDialog1.InitialDirectory = INI_FLD openFileDialog1.Filter = "фото .jpg|*.jpg" openFileDialog1.FilterIndex = 1 openFileDialog1.RestoreDirectory = True openFileDialog1.FileName = "" If openFileDialog1.ShowDialog() = DialogResult.OK Then Try fs = openFileDialog1.OpenFile() If (fs IsNot Nothing) Then Label1.Text = openFileDialog1.FileName PictureBox1.Visible = False PictureBox1.Image = New Bitmap(Label1.Text) PictureBox1.SizeMode = PictureBoxSizeMode.Zoom PictureBox1.Visible = True End If Catch e1 As Exception Label1.Text = e1.ToString Finally fs.Close End Try End If

74

End Sub End Class

6.8. Задания на тему «Просмотр графических файлов»

Для каждого из вариантов задания по данной теме необходим набор тестовых данных, представляющих собой текстовые или графические файлы. Эти данные должны быть размещены в каталоге проекта. Возможный вид окна приложения приведен на рис. 6.4.

Рис. 6.4. Пример окна программы

Вариант 1. Разработать программу, которая позволит выбрать и просмотреть произвольный текстовый файл (*.txt) или графический (*.bmp) из произвольной папки.

Вариант 2. Разработать программу, которая позволит выбрать и просмотреть произвольный графический файл (*.jpg) из произвольной папки.

Вариант 3. Разработать программу, которая позволит выбрать и просмотреть произвольный графический файл (*.bmp) из произвольной папки.

Вариант 4. Разработать программу, которая позволит выбрать и просмотреть произвольный графический файл (*.gif) из произвольной папки.

Вариант 5. Разработать программу, которая позволит получить список текстовых файлов (*.txt) из произвольной папки, а также просмотреть любой файл из списка.

Вариант 6. Разработать программу, которая позволит получить список графических файлов (*.jpg) из произвольной папки, а также просмотреть любой файл из списка.

75

Вариант 7. Разработать программу, которая позволит получить список графических файлов (*.bmp) из произвольной папки, а также просмотреть любой файл из списка.

Вариант 8. Разработать программу, которая позволит получить список графических файлов (*.gif) из произвольной папки, а также просмотреть любой файл из списка.

Вариант 9. Разработать программу, которая позволит выбрать и просмотреть произвольный текстовый (*.txt) или графический (*.jpg) файл из произвольной папки.

Вариант 10. Разработать программу, которая позволит выбрать и просмотреть произвольный текстовый (*.txt) или графический (*.bmp) файл из произвольной папки.

Вариант 11. Разработать программу, которая позволит выбрать и просмотреть произвольный текстовый (*.txt) или графический (*.gif) файл из произвольной папки.

Вариант 12. Разработать программу, которая позволит получить список текстовых (*.txt) и графических (*.jpg) файлов из произвольной папки, а также просмотреть любой файл из списка.

Вариант 13. Разработать программу, которая позволит получить список текстовых (*.txt) и графических (*.bmp) файлов из произвольной папки, а также просмотреть любой файл из списка.

Вариант 14. Разработать программу, которая позволит получить список текстовых (*.txt) и графических (*.gif) файлов из произвольной папки, а также просмотреть любой файл из списка.

Вариант 15. Разработать программу, которая позволит получить список графических файлов (*.bmp и *.jpg) из произвольной папки, а также просмотреть любой файл из списка.

Порядок выполнения лабораторной работы

Создать папку с набором тестовых данных. Создать новый проект – приложение Windows Forms. Вынести на форму необходимые визуальные компоненты. Добавить программный код обработки событий. Компилировать программу. Тестировать программу. Создать документ с описанием работы программы.

76

7. ПОСТРОЕНИЕ ГРАФИКОВ И ДИАГРАММ

7.1. Построение графика

Машинная графика всегда являлась самым популярным упражнением программистов. При наличии готовых к использованию компонентов графика стала вполне доступной. Хорошим заданием для ее освоения является построение графика таблично заданной функции. Для построения рисунка задаем процедуру Grafik обработки события Paint. Эта процедура содержит код построения рисунка, который будет выполняться при наступлении некоторых событий. Me.Paint = new PaintEventHandler(Grafik)

Благодаря этой функции после изменения размеров окна формы рисунок может быть обновлен командой Me.Refresh()

Для вывода графических объектов необходимо задать графическую поверхность G_P, в которой будет отображаться график. Dim G_P As Graphics G_P = e.Graphics()

На указанной поверхности должна отображаться и вспомогательная информация, в частности заголовок и подписи данных. Необходимо описать шрифт этих элементов графика, например, в строковой переменной: Dim hF As F = New Font("Tahoma", 14) Dim H As String = "График"

Для того чтобы оценить размеры области для вывода, используем свойство ClientSize.Width, означающее ширину рабочей области формы. Свойство MeasureString().Width означает ширину строки текста с учетом выбранного шрифта. Dim w As Integer = G_P.MeasureString(H, hF).Width Dim x As Integer = (Me.ClientSize.Width - w) / 2

Метод DrawString предназначен для вывода строки текста на графическую поверхность. G_P.DrawString(H, hF, System.Drawing.Brushes.Black, x, 5)

77

Важной частью программы построения графика является определение шага по Х, а также настройка масштаба. Для определения шага нужно размер рабочей области формы Me.ClientSize.Width разделить на количество точек графика. Например, если массив D содержит значения функции, a количество его элементов содержится в свойстве D.Length, то шаг с учетом отступа от границы формы равен Dim s_x As Integer = (Me.ClientSize.Width -40)/d.Length

Для определения масштабного множителя определяются максимальное и минимальное значения элементов массива. Масшабный множитель вычисляется на основании вертикального размера рабочей области формы Me.ClientSize.Height с учетом отступа от границ: Dim m As Integer = (Me.ClientSize.Height - 100) / (max-min)

Координата X определяется путем умножения номера точки i на постоянный шаг, а Y вычисляется в соответствии с масшабом и с учетом отступа от границы формы: X = 8 + i * S_X Y = Me.ClientSize.Height - 20 – m * d(i)

Экранные координаты – это целые числа. Точки изображаются прямоугольниками DrawRectangle, а график – отрезками прямой DrawLine. Над каждой точкой выводится соответствующее числовое значение. G_P.DrawRectangle(System.Drawing.Pens.Black,x2-2,y2-2,4,4) G_P.DrawLine(System.Drawing.Pens.Black, x1, y1, x2, y2) G_P.DrawString(Convert.ToString(d(i)), dF, _ System.Drawing.Brushes.Black, x2 - 10, y2 - 20)

Пример программы

Исходные данные – это 10 вещественных чисел, хранящихся в 10 строках текстового файла. Для использования методов ввода данных из текстового файла в начале программы делается ссылка на пространство имен System.IO. ‘ Пример 7.1 Imports System.IO Public Class Form1 Private d(10) As Double

78

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint ' графическая поверхность Dim g As Graphics g = e.Graphics() ' подписи данных Dim dF As Font = New Font("Tahoma", 9) ' заголовок Dim hF As F = New Font("Tahoma", 14) Dim H As String = "График" Dim w As Integer= g.MeasureString(H,hF).Width Dim x As Integer = (Me.ClientSize.Width - w) / 2 g.DrawString(H, hF, System.Drawing.Brushes.Black, x,7) ‘ шаг по Х Dim sw As Integer = (Me.ClientSize.Width -40)/(d.Length-1) ‘ размеры реальной области Dim max As Double = d(1) Dim min As Double = d(1) For i As Integer = 1 To d.Length - 1 If d(i) > max Then max = d(i) If d(i) < min Then min = d(i) Next ‘ масштабный множитель Dim m As Integer = (Me.ClientSize.Height - 100) / (max-min) Dim x1, y1, x2, y2 As Integer ‘ первая точка графика x1 = 20 y1 = Me.ClientSize.Height - 20 – m * d(1) g.DrawRectangle(System.Drawing.Pens.Black, x1-2, y1-2,4,4) g.DrawString(Convert.ToString(d(1)), dF, _ System.Drawing.Brushes.Black, x1 - 10, y1 - 20)

79

‘ остальные точки For i As Integer = 2 To d.Length - 1 x2 = 8 + i * sw y2 = Me.ClientSize.Height - 20 – m * d(i) g.DrawRectangle(System.Drawing.Pens.Black,x2-2,y2-2,4,4) g.DrawLine(System.Drawing.Pens.Black, x1, y1, x2, y2) g.DrawString(Convert.ToString(d(i)), dF, _ System.Drawing.Brushes.Black, x2 - 10, y2 - 20) x1 = x2 y1 = y2 Next End Sub ‘ обновление графики при изменении размеров формы Private Sub Form1_SizeChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.SizeChanged Refresh() End Sub ‘ подготовка исходны данных Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim fs As FileStream ‘ путь в текущий каталог Dim FN As String = Application.StartupPath + "\d.txt" Dim i As Integer = 0 Try ' поток для чтения fs = New FileStream(FN, FileMode.Open, FileAccess.Read) Dim sr As New StreamReader(fs) ‘ читаем числа в массив Dim t As String = sr.ReadLine() While i < d.Length - 1 i = i + 1 d(i) = Convert.ToDouble(t) t = sr.ReadLine()

80

End While sr.Close() ' задаем функцию обработки события Paint Dim Paint = New PaintEventHandler(AddressOf Form1_Paint) Catch ex As FileNotFoundException MessageBox.Show(ex.ToString()) Catch ex As Exception MessageBox.Show(ex.ToString()) Finally fs.Close() End Try End Sub End Class

7.2. Задание на тему «Построение графика»

Разработать программу, вычерчивающую график. Исходные данные должны извлекаться из текстового файла. Количество точек – произвольно.

Порядок выполнения лабораторной работы

Создать папку с набором тестовых данных. Создать новый проект – приложение Windows Forms. Вынести на форму необходимые визуальные компоненты. Добавить программный код обработки событий. Компилировать программу. Тестировать программу. Создать документ с описанием работы программы.

7.3. Построение столбиковой диаграммы

Вычерчивание столбиковой диаграммы выполняется аналогично графику. Относительные изменения только упрощают программу. Вместо шага определяется ширина столбика диаграммы: W_S = (Me.ClientSize.Width-40-5*d.Length)/d.Length-1

81

Для перехода к следующей точке достаточно выполнить шаг по Х. X = X + W_S + 5

Высота столбика h_Y определяется по найденной (как в графике) координате Y точки с учетом отступа от границы формы: h_Y = ClientSize.Height - Y - 20

Вычерчивание закрашенного столбика выполняется с помощью функции FillRectangle, например: G_P.FillRectangle(Brushes.ForestGreen, X, Y, W_S, h_Y)

Для вычерчивания границ столбика можно также использовать DrawRectangle: G_P.DrawRectangle(System.Drawing.Pens.Black, X, Y, W_S, h_Y)

Пример программы

Столбиковая диаграмма строится с помощью программы, аналогичной графику. Все процедуры, кроме одной, в этих программах совпадают. Поэтому в примере мы приводим только одну процедуру, которая непосредственно выполняет вычерчивание диаграммы. ‘ Пример 7.2 Private d(10) As Double Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint ' графическая поверхность Dim g As Graphics g = e.Graphics() ' подписи данных Dim dF As Font = New Font("Tahoma", 9) ' заголовок Dim hF As Font = New Font("Tahoma", 14, FontStyle.Regular) Dim H As String = "График" Dim w As Integer = g.MeasureString(H,hF).Width Dim x As Integer = (Me.ClientSize.Width - w) / 2 g.DrawString(H, hF, System.Drawing.Brushes.Black, x, 5)

82

‘ размеры реальной области Dim max As Double = d(1) Dim min As Double = d(1) For i As Integer = 1 To d.Length - 1 If d(i) > max Then max = d(i) If d(i) < min Then min = d(i) Next Dim x1, y1, m,h0 As Integer ' ширина столбца w1 = (Me.ClientSize.Width-40-5*(d.Length -1))/(d.Length-1) x1 = 20 ‘ масштабный множитель m = (Me.ClientSize.Height - h1)/(max-min) Dim h1 As Integer = Me.ClientSize.Height \ 2 For i As Integer = 1 To d.Length - 1 y1 = Me.ClientSize.Height - 20 – m*d(i) g.DrawString(Convert.ToString(d(i)), dF, System.Drawing.Brushes.Black, x1, y1 - 21) h0 = Me.ClientSize.Height - y1 - 20 g.FillRectangle(Brushes.ForestGreen, x1, y1, w, h0) g.DrawRectangle(System.Drawing.Pens.Black, x1, y1, w, h0) x1 = x1 + w + 5 Next End Sub

7.4. Задание на тему «Построение столбиковой диаграммы»

Разработать программу, вычерчивающую столбиковую диаграмму. Исходные данные должны извлекаться из текстового файла. Количество точек – произвольно.

Порядок выполнения лабораторной работы

Создать папку с набором тестовых данных. Создать новый проект – приложение Windows Forms. Вынести на форму необходимые визуальные компоненты.

83

Добавить программный код обработки событий. Компилировать программу. Тестировать программу. Создать документ с описанием работы программы.

7.5. Построение круговой диаграммы

В круговой диаграмме для определения доли каждого сектора вычисляются доли соответствующих исходных значений в их общей сумме. Dim s As Double = 0 For i = 1 To d.Length - 1 s = s + d(i) Next For i = 1 To d.Length - 1 p(i) = d(i) / s Next

Для круговой диаграммы выбирается величина диаметра с учетом отступа от границ формы, а также координаты центра: Dim DD As Integer = ClientSize.Height - 70 Dim x0 As Integer = 30 Dim y0 As Integer = (ClientSize.Height - DD) / 2 + 10

Если в графике и столбиковой диаграмме достаточно одного цвета, то в круговой диаграмме необходимо использовать несколько цветов. Переменная fbrush, используемая для хранения цвета закраски Brushes, объявляется в следующей строке: Dim fbrush As Brush = Brushes.White

В табл. 7.1 представлены несколько значений для цвета. Таблица 7.1

Примеры значений свойства Brushes

Свойство Описание Свойство Описание Aquamarine Аквамарин Coral Коралловый

Beige Бежевый Cyan Голубой Black Черный Gold Золотой Blue Синий Green Зеленый

Brown Коричневый Yellow Желтый

84

Для круговой диаграммы обязательны пояснения – легенда. Она может быть изображена с помощью цветных прямоугольников с сопутствующим текстом – названием элемента данных, например: g.FillRectangle(fbrush, Lx, Ly + i * 20, 20, 10) g.DrawString(title(i) + " - " + p(i).ToString("p"), _ dFont, System.Drawing.Brushes.Black, _ Lx + 24, Ly + i * 20 - 3)

Сектор закрашивается с помощью функции FillPie. Контур сектора рисуется с помощью функции DrawPie. В обеих функциях указываются центр диаграммы, ширина и высота, а также начальный угол сектора и дуга сектора в градусах. g.FillPie(fbrush, x0, y0, dd, dd, sta, swe) g.DrawPie(System.Drawing.Pens.Black,x0,y0,dd,dd,sta,swe)

Пример программы

Круговая диаграмма строится по данным из текстового файла, в котором в столбик размещены названия 10 элементов и соответствующие величины. Для прорисовки секторов диаграммы используются 10 цветов, которые выбираются с помощью оператора Select Case. В правой части формы выводится легенда данных. ‘ Пример 7.3 Imports System.IO Public Class Form1 Private d(10), p(10) As Double Private title(10) As String Private n As Integer Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint ' графическая поверхность Dim g As Graphics g = e.Graphics() ' легенда Dim dF As Font = New Font("Tahoma", 9)

85

' заголовок Dim hF As Font = New Font("Tahoma", 12, FontStyle.Bold) Dim H As String = "Круговая диаграмма" Dim w As Integer=Convert.ToInt32(g.MeasureString(H,hF).Width) Dim x As Integer = (Me.ClientSize.Width - w) / 2 g.DrawString(H, hF, System.Drawing.Brushes.Black, x, 10) ‘ диаметр диаграммы Dim dd As Single = ClientSize.Height - 70 ‘ центр диаграммы Dim x0 As Integer = 30 Dim y0 = (ClientSize.Height - dd) / 2 + 10 ‘ легенда Dim Lx As Integer = 60 + dd Dim Ly As Integer = 30 ‘ дуга сектора Dim swe As Single Dim sta As Single = -90 ‘ закраска Dim fbrush As Brush = Brushes.White For i As Integer = 1 To d.Length - 1 ‘ дуга swe = 360 * p(i) ‘ выбор цвета закраски Select Case i Case 0 fbrush = Brushes.YellowGreen Case 1 fbrush = Brushes.Gold Case 2 fbrush = Brushes.Pink Case 3 fbrush = Brushes.Violet

86

Case 4 fbrush = Brushes.OrangeRed Case 5 fbrush = Brushes.RoyalBlue Case 6 fbrush = Brushes.SteelBlue Case 7 fbrush = Brushes.Chocolate Case 8 fbrush = Brushes.LightGray Case 9 fbrush = Brushes.Aquamarine Case 10 fbrush = Brushes.Brown Case Else fbrush = Brushes.Fuchsia End Select ‘ устранение возможного накопления ошибки If i = (n - 1) Then swe = 270 - sta ‘ вычерчивание сектора g.FillPie(fbrush, x0, y0, dd, dd, sta, swe) g.DrawPie(System.Drawing.Pens.Black,x0,y0,dd,dd,sta,swe) ‘ вывод легенды g.FillRectangle(fbrush, Lx, Ly + i * 20, 20, 10) g.DrawString(title(i) + " - " + p(i).ToString("p"), _ dFont, System.Drawing.Brushes.Black, _ Lx + 24, Ly + i * 20 - 3) ‘ перейти к началу следующего сектора sta = sta + swe Next End Sub ‘ подготовка исходных данных Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

87

Dim fs As FileStream ‘ путь в текущую папку Dim FN As String = Application.StartupPath + "\d.txt" Dim i As Integer = 0 Try fs = New FileStream(FN, FileMode.Open, FileAccess.Read) Dim sr As New StreamReader(fs, _ System.Text.Encoding.GetEncoding(1251)) ‘ читаем данные из файла Dim st As String = sr.ReadLine() While i < d.Length - 1 i = i + 1 ‘ заголовок элемента данных title(i) = st st = sr.ReadLine() ‘ значение элемента данных d(i) = Convert.ToDouble(st) st = sr.ReadLine() End While sr.Close() ' задаем функцию обработки события Paint Dim Paint = New PaintEventHandler(AddressOf Form1_Paint) Catch ex As FileNotFoundException MessageBox.Show(ex.ToString()) Catch ex As Exception MessageBox.Show(ex.ToString()) Finally fs.Close() End Try Dim s As Double = 0 For i = 1 To d.Length - 1 s = s + d(i)

88

Next For i = 1 To d.Length - 1 p(i) = d(i) / s Next End Sub ‘ обновление после изменения размеров формы Private Sub Form1_ClientSizeChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.ClientSizeChanged Me.Refresh() End Sub End Class

7.6. Задание на тему «Построение круговой диаграммы»

Разработать программу, вычерчивающую круговую диаграмму. Исходные данные должны извлекаться из текстового файла. Количество точек – произвольно.

Порядок выполнения лабораторной работы

Создать папку с набором тестовых данных. Создать новый проект – приложение Windows Forms. Вынести на форму необходимые визуальные компоненты. Добавить программный код обработки событий. Компилировать программу. Тестировать программу. - Создать документ с описанием работы программы.

89

8. ИНТЕГРИРОВАННЫЙ ЯЗЫК ЗАПРОСОВ LINQ

Интегрированный язык запросов (Language Integrated Query) позволяет оперировать с массивами, XML-документами и другими источниками данных. Операции над данными выполняются с помощью q-операторов (Query-операторы). Для того чтобы использовать LINQ, нужно добавить ссылку на пространства имен System.Linq и System.Linq.Xml. LINQ добавляет возможности запросов в Visual Basic, обеспечивает простые и мощные способы обработки всех видов данных. В запросах независимо от типа данных используется унифицированный синтаксис. LINQ позволяет запрашивать данные из базы данных SQL Server, XML, массивов и коллекций в памяти, наборов данных ADO.NET или любого другого локального или удаленного источника данных, который поддерживает LINQ.

8.1. Анализ числового массива

Операторы LINQ предоставляют возможности для анализа числовых массивов. В частности, операторы Count, Max, Min, Sum дают количество элементов, максимальное, минимальное значения, а также сумму элементов массива. Например, в следующей строке определяется количество элементов массива D: Dim c As Integer = D.Count()

В табл. 8.1 представлены примеры простых функций, предназначенных для анализа массива.

Таблица 8.1

Функции, предназначенные для анализа массива Функция Действие Average Среднее арифметическое Count Количество элементов First Первый элемент Last Последний элемент Max Максимальный элемент Min Минимальный элемент Sum Сумма элементов

Более сложные процедуры выполняются с помощью строки запроса, которая имеет следующий формат:

90

Dim результат = From переменная In массив Where условие

Параметр запроса результат содержит те элементы исходного массива, которые удовлетворяют условию. Переменная – это имя переменной, которая участвует в построении условия. Например, следующий запрос выбирает те элементы числового массива, которые больше 10. Dim M1 = From x In M Where x>10

Другой запрос выбирает те элементы, которые совпадают с минимальным или максимальным элементом: Dim M2 = From x In M Where x = M.Max Or x = M.Min

Отобранные таким образом элементы можно вывести на экран, например в поле ListBox: For Each a in M2 ListBox1.Items.Add(a.ToString) Next

Для упорядочения элементов требуется другая форма запроса: Dim результат = From переменная In массив Order By параметр

Здесь параметр может принимать значения Descending (по убыванию) или Ascending (по возрастанию). Например, следующий запрос сортирует элементы по убыванию: Dim M2 = From x In M Order By Descending

Еще одна форма запроса позволяет исключить повторяющиеся элементы. Dim результат = From переменная In массив Distinct

Например, следующий запрос отбирает только оригинальные элементы из массива, игнорируя повторы: Dim M3 = From x In M2 Distinct

Используя q-операторы, легко выполнить какие-либо вычисления для всех элементов массива, например найти долю каждого элемента в процентах.

Пример программы

В примере для исходного целочисленного массива выполняется сортировка, фильтр, поиск элементов, определяются минимум,

91

максимум, количество элементов и др. Результат отображается в компоненте ListBox. ‘ Пример 8.1 Public Class Form1 Private s As String Private A() As Integer = {7,3,6,3,5,7,9,1,4,8,5,4,0,2,3} Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load s = "исходный массив = " For Each x In A s = s + x.ToString + " " Next ListBox1.Items.Add(s) End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click s = "по возрастанию = " Dim b = From c In A Order By c Ascending For Each d In b s = s + d.ToString + " " Next ListBox1.Items.Add(s) s = "по убыванию = " b = From c In A Order By c Descending For Each d In b s = s + d.ToString + " " Next ListBox1.Items.Add(s) s = "не мин и не макс = " b1 = From c In A Where c > A.Min And c < A.Max For Each d In b1 s = s + d.ToString + " " Next ListBox1.Items.Add(s)

92

s = "неповторяющиеся эл. = " b1 = From c In A Distinct For Each d In b1 s = s + d.ToString + " " Next ListBox1.Items.Add(s) s = "больше 6, меньше 4 = " b1 = From c In A Where c > 6 Or c < 4 For Each d In b1 s = s + d.ToString + " " Next ListBox1.Items.Add(s) ListBox1.Items.Add("min = " + A.Min.ToString) ListBox1.Items.Add("max = " + A.Max.ToString) ListBox1.Items.Add("avg = " + A.Average.ToString) ListBox1.Items.Add("first = " + A.First.ToString) ListBox1.Items.Add("last = " + A.Last.ToString) ListBox1.Items.Add("sum = " + A.Sum.ToString) ListBox1.Items.Add("count = " + A.Count.ToString) End Sub End Class

8.2. Задание на тему «Анализ числового массива

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

Порядок выполнения лабораторной работы

Создать папку с набором тестовых данных. Создать новый проект – приложение Windows Forms. Вынести на форму необходимые визуальные компоненты. Добавить программный код обработки событий. Компилировать программу. Тестировать программу.

93

Создать документ с описанием работы программы.

8.3. Обработка массива строк

С массивом строк можно выполнять процедуры, аналогичные тем, что действуют с числами. Например, максимальный элемент в массиве строк – это тот, который должен находиться на первом месте по порядку возрастания (строка начинается с буквы А), а минимальный элемент – это тот, который стоит на последнем месте по алфавиту. Пусть требуется в массиве строк S найти все элементы, содержащие подстроку S1. Для получения результатов создается запрос со словом Where. Фильтрация строк массива выполняется с помощью функции Contains. Dim FS = From c In S Where c.Contains(S1)

Если требуется в массиве строк S найти все элементы, совпадающие со строкой S1, то фильтрация выполняется командами Where и Equals. Dim FS = From c In S Where c.Equals(S1)

Отобразить результат запроса, например, в поле ListBox можно с помощью короткого цикла: For Each a in FS ListBox1.Items.Add(a) Next

С помощью запроса можно выполнить некоторое действие для каждого элемента массива. Например, запрос в следующей строке получает новый массив, в котором элементы равны удвоенным элементам исходного массива. Dim B = From x In A Select x * 2

Пример программы

В примере исходные данные отображаются в одном ListBox, а результаты запросов выводятся в другом ListBox. Выполняются сортировка и несколько вариантов фильтра. Один из вариантов предполагает, что пользователь будет вводить кусок строки в поле TextBox, а после каждого изменения этого поля будет выполняться запрос.

94

‘ Пример 8.2 Public Class Form1 Dim m0() As [String] = {"Ву", "Ли", "По", "Ас", "Мо", "Шу", "Лу", "Ка", "Яр", "Ал", "До", "Ву", "Ус", "Шу"} Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Label1.Text = "исходный массив" For Each f As Object In m0 ListBox1.Items.Add(f) Next Label2.Text = "" End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Label2.Text = "без повторов" Dim b = From a In m0 Distinct ListBox2.Items.Clear() For Each f As Object In b ListBox2.Items.Add(f) Next End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Label2.Text = "содержит у" ListBox2.Items.Clear() Dim c = From a In m0 Where a.Contains("у") For Each f As Object In c ListBox2.Items.Add(f) Next End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Label2.Text = "содержит у и У" ListBox2.Items.Clear() Dim c = From a In m0 Where a.Contains("у") Or _ a.Contains("У")

95

For Each f As Object In c ListBox2.Items.Add(f) Next End Sub Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click Label2.Text = "Не содержит у и У" ListBox2.Items.Clear() Dim c = From a In m0 Where Not (a.Contains("у") Or _ a.Contains("У")) For Each f As Object In c ListBox2.Items.Add(f) Next End Sub Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click Label2.Text = "Select - результат" ListBox2.Items.Clear() Dim d = From a In m0 Select a+10 For Each f As Object In d ListBox2.Items.Add(f) Next End Sub Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click Label2.Text = "первый и последний " ListBox2.Items.Clear() ListBox2.Items.Add(m0.First) ListBox2.Items.Add(m0.Last) End Sub Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click Label2.Text = "максимальный и минимальный" ListBox2.Items.Clear() ListBox2.Items.Add(m0.Min) ListBox2.Items.Add(m0.Max)

96

End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged If Me.Text.Length > 0 Then Label2.Text = "Произвольный выбор" ListBox2.Items.Clear() Dim d = From a In m0 Where a.Contains(TextBox1.Text) For Each f In d ListBox2.Items.Add(f) Next End If End Sub End Class

8.4. Задания на тему «Обработка массива строк»

Разработать программу, выполняющую анализ массива строк. Исходные данные подготовить в соответствии с вариантом задания и разместить в текстовом файле. Результат отобразить на экране, а также разместить в текстовом файле.

Вариант 1. Дан список фамилий. Сортировать его по возрастанию. Найти фамилии, содержащие произвольную подстроку.

Вариант 2. Дан список фамилий. Сортировать его по убыванию. Найти фамилии, содержащие произвольную подстроку без учета регистра.

Вариант 3. Дан список фамилий. Сортировать его по возрастанию. Найти фамилии, совпадающие с указанной произвольно фамилией.

Вариант 4. Дан список фамилий. Сортировать его по убыванию. Найти фамилии, совпадающие с указанной произвольно фамилией без учета регистра.

Вариант 5. Даны 2 списка фамилий. Сортировать их по возрастанию, затем объединить.

Вариант 6. Даны 2 списка фамилий. Сортировать их по убыванию, затем объединить.

Вариант 7. Даны 2 списка фамилий. Объединить фамилии в один список, затем сортировать их по возрастанию.

97

Вариант 8. Даны 2 списка фамилий. Объединить фамилии в один список, затем сортировать их по убыванию.

Вариант 9. Даны 2 списка фамилий. Объединить фамилии в один список, затем сортировать их по возрастанию. Найти в объединенном списке совпадающие фамилии.

Вариант 10. Даны 2 списка фамилий. Объединить фамилии в один список, затем сортировать их по убыванию. Найти в объединенном списке совпадающие фамилии.

Вариант 11. Даны 2 списка фамилий. Объединить фамилии в один список, затем сортировать их по возрастанию. Найти в объединенном списке группы фамилий (более одной), которые начинаются с одной и той же буквы.

Вариант 12. Даны 2 списка фамилий. Объединить фамилии в один список, затем сортировать их по возрастанию. Найти в объединенном списке группы фамилий (более одной), которые оканчиваются одной и той же парой букв.

Вариант 13. Дан список фамилий вкладчиков, количество их денег, а также номера счетов. Сортировать их по возрастанию номера счета. Найти вкладчика с указанной фамилией.

Вариант 14. Дан список фамилий вкладчиков, количество их денег, а также номера счетов. Сортировать их по убыванию количества денег. Найти вкладчика с указанной фамилией.

Вариант 15. Дан список фамилий вкладчиков, количество их денег, а также номера счетов. Сортировать их по фамилиям в порядке возрастания. Найти вкладчика с указанным номером счета.

Вариант 16. Дан список фамилий вкладчиков, количество их денег, а также номера счетов. Сортировать их по фамилиям в порядке возрастания. Найти для каждого вкладчика размер полагающейся прибавки счета (10%).

Вариант 17. Даны 2 списка фамилий вкладчиков, количество их денег, а также номера счетов. Объединить списки, затем сортировать их по номерам счетов. Найти вкладчиков, имеющих более одного счета.

Вариант 18. Даны 2 списка фамилий вкладчиков, количество их денег, а также номера счетов. Объединить списки, затем сортировать их по номерам счетов. Объединить записи, в которых номер счета совпадает.

98

Вариант 19. Имеется список автомобилей, включающий следующие данные: владелец, модель, цвет кузова, государственный номер. Сортировать список по произвольному полю.

Вариант 20. Имеется список автомобилей, включающий следующие данные: владелец, модель, цвет кузова, государственный номер. Сортировать список по произвольному полю. Найти записи по произвольному значению одного из полей.

Вариант 21. Имеется список автомобилей, включающий следующие данные: владелец, модель, цвет кузова, государственный номер. Сортировать список фамилиям владельцев. Найти записи по произвольным фрагментам значений полей модель, цвет кузова.

Вариант 22. Имеется список автомобилей, включающий следующие данные: владелец, модель, цвет кузова, государственный номер. Сортировать список по значению государственного номера. Найти записи по произвольным фрагментам значений полей модель, цвет кузова, государственный номер.

Вариант 23. Имеется список книг, находящихся у читателей библиотеки: читатель, автор книги, название, год издания, цена. Сортировать список по фамилиям читателей. Показать тех читателей, которые имеют более 2 книг.

Вариант 24. Имеется список книг, находящихся у читателей библиотеки: читатель, автор книги, название, год издания, цена. Сортировать список по одному из первых четырех полей. Найти количество записей, в которых значение выбранного поля совпадают.

Вариант 25. Имеется список книг библиотеки: автор, название, тематика, год издания, цена. Сортировать список по одному из первых четырех полей. Найти количество записей, в которых значение выбранного поля совпадают.

Порядок выполнения лабораторной работы

Создать папку с набором тестовых данных. Создать новый проект – приложение Windows Forms. Вынести на форму необходимые визуальные компоненты. Добавить программный код обработки событий. Компилировать программу. Тестировать программу. Создать документ с описанием работы программы.

99

8.5. Обработка массива записей

С помощью q-операторов можно обрабатывать сложные структуры. Например, пусть имеется массив A типа stud. structure stud public string Name public int Grp public double Res end structure

Запрос From – In - Order By - Descending позволяет сортировать записи по одному из полей Res в порядке убывания. Dim b = From x In A Order By x.Res Descending

Пример программы

В примере создается массив типа «Структура». Массив заполняется данными, а затем выполняется запрос – сортировка по возрастанию. Исходные данные и результат выводятся на экран. ‘ Пример 8.3 Module Module1 ‘ объявление структуры Structure stud Public Name As String Public Grp As Integer Public Res As Double End Structure Sub Main() ‘ объявление массива типа структура Dim A(5) As stud ‘ заполнение массива данными For I As Integer = 0 To 5 A(I).Name = Str(I) + " студент" A(I).Grp = 342 A(I).Res = Int(90 * Rnd() + 10)

100

Console.WriteLine(A(I).Name+Str(A(I).Grp)+Str(A(I).Res)) Next Console.WriteLine() ‘ выполнение запроса и вывод результатов на экран Dim b = From x In A Order By x.Res Ascending For Each c In b Console.WriteLine(c.Name + Str(c.Grp) + Str(c.Res)) Next Console.ReadLine() End Sub End Module

8.6. Задания на тему «Обработка массива записей»

Разработать программу, выполняющую сортировку и фильтр массива записей. Исходные данные подготовить в текстовом файле в соответствии с вариантом задания. Результат отобразить на экране, а также в текстовом файле.

Вариант 1. Известны сведения о товарах: название, цена, количество. Создать процедуру обработки массива записей, содержащих данные сведения.

Вариант 2. Известны сведения о вакансиях: должность, категория, оклад. Создать процедуру обработки массива записей, содержащих данные сведения.

Вариант 3. Известны сведения о перевозках пассажиров: водитель, номер автобуса, количество пассажиров. Создать процедуру обработки массива записей, содержащих данные сведения.

Вариант 4. Известны сведения о студентах: фамилия, группа, курс. Создать процедуру обработки массива записей, содержащих данные сведения.

Вариант 5. Известны сведения о зданиях: адрес, цена, площадь. Создать процедуру обработки массива записей, содержащих данные сведения.

Вариант 6. Известны сведения о бегунах: фамилия, время, место. Создать процедуру обработки массива записей, содержащих данные сведения.

101

Вариант 7. Известны сведения о книгах: название, автор, цена. Создать процедуру обработки массива записей, содержащих данные сведения.

Вариант 8. Известны сведения о городах: название, население, площадь. Создать процедуру обработки массива записей, содержащих данные сведения.

Вариант 9. Известны сведения о машинах: модель, цена, год выпуска. Создать процедуру обработки массива записей, содержащих данные сведения.

Вариант 10. Известны сведения о выборах: кандидат, партия, количество голосов. Создать процедуру обработки массива записей, содержащих данные сведения.

Порядок выполнения лабораторной работы

Создать папку с набором тестовых данных. Создать новый проект – приложение Windows Forms. Вынести на форму необходимые визуальные компоненты. Добавить программный код обработки событий. Компилировать программу. Тестировать программу. Создать документ с описанием работы программы.

102

9. РАБОТА С БАЗОЙ ДАННЫХ

Задачи обработки данных делятся на несколько процессов. Во-первых, необходимо подключиться к источнику данных, а затем выбрать данные, которые требуется отобразить. После импорта данных в приложение требуется организовать их временное хранение, например в объекте DataSet. На рис. 9.1 изображены основные процессы обработки данных.

Рис. 9.1. Цикл обработки данных

9.1. Чтение информации из базы данных

Если для пользователя требуется только просмотр базы данных, без изменения, то для реализации соответствующего приложения можно использовать возможности управляемого провайдера OLE DB: в том числе для соединения с базой данных использовать класс OleDbConnection; для построения запроса – класс OleDbCommand; для чтения данных – класс OleDbDataReader; для обработки исключительных ситуаций – класс OleDbException.

Управляемый провайдер OLE DB

Вместе с ADO.NET поставляются два управляемых провайдера. Управляемый провайдер OLE DB можно использовать для доступа к MS Access, Oracle, MS SQL Server 7.0. Управляемый провайдер SQL может обращаться к данным только MS SQL Server 7.0 и последующих версий. Если для доступа к данным используется OLE DB, то необходимо указать соответствующее пространство имен: using System.Data.OleDb

103

В табл. 9.1 представлены важнейшие типы пространства имен System.Data.OleDb.

Таблица 9.1 Типы пространства имен System.Data.OleDb

Тип Описание

OleDbCommand Представляет запрос SQL к источнику данных

OleDbConnection Представляет открытое соединение с источником данных

OleDbDataAdapter Представляет соединение с БД и набор команд, используемых для заполнения объекта DataSet, а также обновления исходной БД после внесения изменений в DataSet

OleDbDataReader Обеспечивает метод считывания потока данных из источника

OleDbException Исключение, возникающее при ошибке

OleDbPatameter Используется для передачи параметров процедуре, хранимой на источнике данных

Соединение с базой данных

Для установления соединения с базой данных необходимо создать строку соединения (connection string). С ее помощью можно задать имя компьютера, параметры безопасности, имя базы данных, имя провайдера. В табл. 9.2 представлены некоторые провайдеры OLE DB.

Таблица 9.2 Наиболее часто используемые провайдеры OLE DB

Значение Описание

Microsoft.Jet.OLEDB.4.0 Используется для подключения к Access

MSDAORA Для подключения к базам данных Oracle

SQLOLEDB Для подключения к базам данных MS SQL Server

Объект OleDbConnection представляет уникальное подключение к источнику данных. В случае с системой базы данных типа «Клиент-сервер» это эквивалентно сетевому подключению к серверу. Класс OleDbConnection содержит члены (табл. 9.3), позволяющие настраивать различные параметры подключения.

104

Таблица 9.3 Члены класса OleDbConnection

Член класса Описание BeginTransaction CommitTransaction RollbackTransaction

Начать транзакцию, завершить ее или отменить

Close() Закрыть соединение ConnectionString Настройка строки подключения ConnectionTimeout Установить время тайм-аута DataBase Установить имя базы данных DataSource Установить имя источника Open() Открыть соединение с базой данных Provider Установить имя провайдера State Получить информацию о состоянии соединения

В строке, создаваемой ниже для объекта соединения Cnt, указано имя провайдера Microsoft.Jet.OLEDB.4.0, а также адрес базы данных на локальной машине. Dim Cnt As New OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0; _ Data Source= c:\_Pro\P651\P651\BIN\DEBUG\auto.mdb")

После настройки строки соединения требуется создать запрос к базе данных Cmd – объект класса OleDbCommand (члены класса в табл. 9.4) и открыть сеанс соединения с источником данных с помощью метода Open. Dim Cmd As New OleDbCommand(“Select * from Ts”, Cnt) Cnt.Open()

Таблица 9.4 Члены класса OleDbCommand

Член класса Описание Cancel() Прекращает выполнение команды CommandText Позволяет задать текст запроса на языке SQL Connection Позволяет получить ссылку на объект OleDbConnection ExecuteReader() Возвращает объект OleDbDataReader Prepare() Готовит команду к выполнению

Построение команды SQL

Обработка и анализ данных осуществляется посредством запроса, одним из параметров которого является объект соединения Cnt, а

105

другим – команда на языке SQL, например, команда просмотра всех записей таблицы Владельцы: OleDbCommand Cmd1 = new _ OleDbCommand("SELECT * FROM владельцы", Cnt)

В данной команде использована простейшая форма оператора SELECT, который предназначен для выборки данных: SELECT список_столбцов FROM имя_таблицы

Столбцы в списке перечисляются через запятую, но если требуется выбрать все столбцы, то вместо списка указывается символ «*». Для отбора части строк в команду добавляется слово WHERE с соответствующим условием, например: OleDbCommand Cmd1 = new OleDbCommand( _ "SELECT * FROM владельцы WHERE возраст>50", Cnt)

Для построения условий служат слова и символы, перечисленные в табл. 9.5.

Таблица 9.5 Элементы условия запроса

Элементы Описание =, < >, <, >, >=, <= Операторы сравнения AND, OR, NOT Логические операторы BETWEEN знач1 AND знач2 Проверка на принадлежность интервалу IN (знач1, знач2, …) Проверка на принадлежность списку IS NULL Проверка на пустое значение IS NOT NULL Проверка на непустое значение LIKE шаблон Проверка на соответствие шаблону

При описании шаблона LIKE используются символы: % – для произвольного количества символов; знак подчеркивания – для одного символа.

Упорядочение строк выполняется с помощью добавления в команду слова ORDER BY с указанием столбца, по которому должна выполняться сортировка в порядке возрастания. Если требуется сортировка по убыванию, то к ORDER BY добавляется параметр DESC. OleDbCommand Cmd1 = new OleDbCommand( _ "SELECT * FROM владельцы WHERE возраст>50 _ ORDER BY возраст DESC", Cnt)

106

Для отбора всех данных, за исключением повторяющихся, применяется ключевое слово DISTINCT, например следующая команда позволяет получить список фамилий (упорядоченный): OleDbCommand Cmd1 = new OleDbCommand( _ "SELECT DISTINCT фамилия FROM владельцы", Cnt)

Изменение данных в таблице осуществляется с помощью оператора Update, один из вариантов формата которого UPDATE имя_таблицы SET имя_столбца_1 = значение_1, _ имя_столбца_2 = значение_2, имя_столбца_3 = значение_3, . . .

Значением может быть константа или выражение, например: OleDbCommand Cmd2 = new OleDbCommand( _ "UPDATE Ts SET стоимость=стоимось*1.05)

После выполнения данного запроса все значения столбца Стоимость будут умножены на 1,05. Есть возможность применить команду Update только к тем строкам, которые удовлетворяют некоторому условию. Для этого в запрос добавляется слово Where с соответствующим условием. Например, следующий запрос изменяет поле Стоимость в тех строках, в которых значение текстового поля Модель начинается с букв ВАЗ. OleDbCommand Cmd2 = new OleDbCommand( _ "UPDATE Ts SET стоимость=стоимось*1.15 _ WHERE модель LIKE ‘ВАЗ%’ ”)

Для того чтобы очистить значения столбца, используем константу Null, как в следующей строке: OleDbCommand Cmd2 = new OleDbCommand( _ "UPDATE владельцы SET нарушения=NULL)

Чтение информации из базы данных

Класс OleDbDataReader предоставляет простой способ получения информации от источника данных. Этот класс предоставляет доступный только для чтения поток данных, который за один раз возвращает одну строку в ответ на запрос SQL. Создается объект класса OleDbDataReader с помощью метода ExecuteReader, например объект Rd для определенного выше запроса Cmd: Dim reader As OleDbDataReader = Cmd.ExecuteReader()

107

Чтение записей выполняется последовательно (от первой к последней) с помощью метода Read. Rd.Read()

Одно выполнение Read возвращает одну строку таблицы. Доступ к значениям столбцов после чтения строки выполняется по их индексу, начиная с 0, или по имени столбца. Например, в следующей строке один столбец выбирается по номеру, а другой по имени: Console.WriteLine(Rd(0).ToString() + Rd(“фамилия”))

Некоторые методы класса OleDbDataReader перечислены в табл. 9.6.

Таблица 9.6 Методы класса OleDbDataReader

Член класса Описание FieldCount Возвращает количество столбцов таблицы GetName Имя столбца GetType Тип данных столбца GetDouble Возвращает значения столбца типа double GetInt32 Возвращает значения столбца типа int GetString Возвращает значения столбца типа string GetValue Возвращает значения столбца в собственном формате Read Читает очередную запись Close Закрывает объект класса OleDbDataReader

Закрывается объект класса OleDbDataReader с помощью метода Close: reader.Close()

Для одного подключения OleDbConnection можно открыть более одного объекта DataReader. Если объект OleDbConnection выходит за границы области действия, он не закрывается. Поэтому следует в явном виде закрыть подключение, вызвав метод Close или Dispose либо воспользовавшись объектом OleDbConnection в операторе Using: Using connection As New OleDbConnection(connectionString)

Данная команда объявляет начало блока Using и получает системные ресурсы, которыми управляет блок. За нею следует блок операторов, запускаемый блоком Using. Завершается блок командой End Using, которая завершает определение блока и удаляет все ресурсы, которыми он управляет. Это делает ресурсы доступными

108

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

‘ Пример 9.1 ‘ создается соединение с базой данных Using connection As New OleDbConnection(connectionString) ‘ задается запрос Dim command As New OleDbCommand(queryString, connection) ‘ открывается соединение connection.Open() ‘ создается объект OleDbDataReader Dim reader As OleDbDataReader = command.ExecuteReader() ‘ при каждом повторении цикла читается одна строка While reader.Read() ‘ значения столбцов из прочитанной строки выводятся на экран Console.WriteLine(reader(0).ToString()) End While reader.Close() End Using

Пример программы

В программе выполняется чтение строк таблицы Stud из базы данных Prim.mdb. Выражение System.IO.Path.GetFullPath(".") возвращает полный путь в текущий каталог, в котором расположена база данных. Создаются несколько запросов: фильтр, сортировка, модификация данных. В процедуре ReadData cоздается объект Rd класса OleDbDataReader. В цикле с помощью метода Read последовательно читаются строки таблицы. Отметим, что запрос Update только модифицирует, но не выполняет выборку данных, поэтому модифицированные им данные выводятся только по следующему за ним запросу Select.

109

‘ Пример 9.2 Imports System.Data.OleDb Module Module1 Sub Main() Dim s, q1, q2, q3, q4, q5 As String ‘ полное имя файла базы данных s = System.IO.Path.GetFullPath(".") + "\Prim.mdb" ‘ строка ConnectionSring s = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” + s ‘ строка запроса – отобрать все поля таблицы Stud q1 = "Select * From Stud" ReadData(s, q1) Console.WriteLine() ‘ строка запроса – строки, упорядоченные по полю Fio q2 = "Select * From Stud Order By Fio" ReadData(s, q2) Console.WriteLine() ‘ строка запроса – строки, в которых Fio оканчивается «н» q3 = "Select * From Stud Where Fio Like '%н'" ReadData(s, q3) Console.WriteLine() ‘ строка запроса – модифицировать колонку Grp во всех строках q4 = "Update Stud Set Grp=Grp+100" ReadData(s, q4) ‘ строка запроса – сортировка по полю Fio в обратном порядке q5 = "Select * From Stud Order By Fio" ReadData(s, q5) Console.ReadLine() End Sub Public Sub ReadData(ByVal connectionString As String, ByVal queryString As String)

110

‘ установить соединение с базой данных Using connection As New OleDbConnection(connectionString) ‘ создать запрос Dim command As New OleDbCommand(queryString, connection) ‘ открыть соединение connection.Open() ‘ создать объект OleDbDataReader Dim Rd As OleDbDataReader = command.ExecuteReader() ‘ читать в цикле по одной строке из таблицы While Rd.Read() ‘ вывести на экран столбцы из прочитанной строки Console.WriteLine(Rd(0).ToString()+" "+Rd(1).ToString()) End While ‘ закрыть объект OleDbDataReader Rd.Close() End Using End Sub End Module

9.2. Задание на тему «Чтение информации из базы данных»

Разработать программу, которая выполняет несколько запросов к таблице базы данных. Отобранные строки записать в текстовый файл. Для тестирования программы подготовить таблицу базы данных Microsoft Access, состоящую не менее чем из 50 строк.

Порядок выполнения лабораторной работы

Создать базу данных для тестирования программы. Создать новый проект – консольное приложение. Добавить программный код. Компилировать программу. Тестировать программу. Создать документ с описанием работы программы.

111

9.3. Отображение данных на форме в приложении Windows

Существуют компоненты, которые позволяют создавать программы для работы с базами данных. Соединение с базой данных обеспечивает компонент OleDbConnection. Взаимодействие с базой данных после того, как соединение уже установлено, обеспечивает компонент OleDbDataAdapter. Хранение информации, полученной из базы данных, обеспечивает компонент DataSet. Для отображения информации, полученной из базы данных, а также для редактирования, добавления и удаления записей предназначен компонент DataGridView. Отметим, что первые три компонента не отображаются на форме, а присутствуют только в виде значков в конструкторе формы. Имеется возможность связать поле базы данных с такими визуальными компонентами, как TextBox, Label, и отображать в них информацию из таблицы базы данных.

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

Рис. 9.2. Добавление компонентов на Панель элементов

В процессе разработки приложения, работающего с базой данных, от программиста требуется аккуратно следовать определенной технологии, описанной далее.

112

Установление соединения с базой данных

Сначала нужно вынести на форму компонент OleDbConnection. Затем в окне свойств компонента ввести значение ConnectionString, например: Provider=Microsoft.Jet.OLEDB.4.0;Data Source= _ c:\pro\p655\p655\bin\debug\diplom.mdb

Описание свойств компонента OleDbDataAdapter

Компонент OleDbDataAdapter выносится на форму, а затем заполняются значения следующих его свойств.

Полю SelectCommand-Connection присвоить значение OleDbConnection1.

В поле SelectCommand-CommandText записать команду SQL для отбора данных, например: «Select * From Dp», что означает показать все поля таблицы Dp.

Полю InsertCommand-Connection присвоить значение OleDbConnection1.

В поле InsertCommand-CommandText записать команду SQL для вставки данных, например: «Insert Into Dp (id, fio, img) values (?,?,?)», чтобы добавить запись.

Затем щелкнуть мышью по кнопке в поле InsertCommand-Parameters. Откроется окно Редактор коллекции OleDbParameter (рис. 9.3), в котором с помощью соответствующей кнопки добавить

Рис. 9.3. Редактор коллекции OleDbParameter

113

параметры для каждого отображаемого поля. Для каждого из столбцов таблицы нужно ввести его имя в два поля ParameterName и SourceColumn.

Полю UpdateCommand-Connection присвоить значение oleDbConnection1.

В поле UpdateCommand-CommandText записать команду SQL для обновления данных, например: «Update Dp Set fio=?, img=?, Where (id=?)», что означает обновить все измененные данные в таблице Dp. Здесь id – ключевое поле типа «Счетчик».

Затем щелкнуть мышью по кнопке в поле UpdateCommand-Parameters. Откроется окно Редактор коллекции OleDbParameter, в котором выполнить действия, аналогичные InsertCommand-Parameters. Для ключевого поля здесь также создается соответствующий параметр.

Полю DeleteCommand-Connection присвоить значение oleDbConnection1.

В поле DeleteCommand-CommandText записать команду SQL для удаления строк данных, например: «Delete From Where (id=?)», что означает удалить отмеченные строки в таблице Dp.

Затем щелкнуть мышью по кнопке в поле DeleteCommand-Parameters. Откроется окно Редактор коллекции OleDbParameter, в котором необходимо ввести значения по аналогии с предыдущими параметрами, но только для ключевого поля.

Описание свойств компонента DataSet

Ввод свойств компонента DataSet начинается с размещения его на форме и работы с Редактором коллекции таблиц (рис. 9.4).

Рис. 9.4. Редактор коллекции таблиц

114

Вынести на форму компонент DataSet. Ввести по порядку значения его свойств. Сначала щелкнуть мышью по кнопке в поле пункт Tables. Появится окно Редактор коллекции таблиц (рис. 9.4), в котором нужно ввести имя таблицы в поле TableName.

Затем нужно щелкнуть мышью по кнопке в поле Columns окна Редактор коллекции таблиц и указать в окне Редактор коллекции столбцов (рис. 9.5) для каждого столбца его имя в полях ColumnName и Caption.

Рис. 9.5. Окно Редактор коллекции столбцов

Описание свойств компонента DataGridView

Вынести на форму визуальный компонент dataGridView, определив для него с помощью перетаскиваня границ положение и размеры. Затем ввести значения свойств компонента.

Свойству DataSource присвоить значение DataSet1. Свойству DataMember присвоить значение имени таблицы,

например Dp. Свойству AutoSizeColumnsMode присвоить значение Fill. Далее нужно щелкнуть мышью по кнопке в поле Tables и в

открывшемся окне Правка столбцов (рис. 9.6) указать имена столбцов в полях HeaderText и DataPropertyName, а для счетчика также False в поле Visible.

115

Рис. 9.6. Ввод параметров dataSet

Вынести на форму визуальный компонент TextBox1 и ввести для него значение свойства DataBindings-Text, связывающего TextBox1 c полеv базы данных. Для этого нужно щелкнуть по полю и выбрать нужный пункт в открывшемся меню (рис. 9.7).

Рис. 9.7. Установление связы TextBox

c полем таблицы базы данных

После создания компонентов и описания их свойств необходимо создать функции, в тело которых затем будет записан код обработки событий. Это часто осуществляется двойным щелчком по компоненту. Для некоторых событий создание функций выполняется двойным щелчком по полю их в свойства компонента. Например, для того чтобы создать функцию Form1_FormClosing, предназначенную для обработки события Закрытие окна приложения, требуется щелкнуть по кнопке События в верхней части окна свойств компонента form1. Среди открывшихся событий отметить пункт Поведение-FormClosing двойным щелчком, после которого будет создана функция обработки события.

116

Код обработки событий

Параметры команд Select, Insert, Update и Delete, определенные выше с помощью редакторов коллекций, можно описать с помощью программного кода, например, код описания команды Insert: ‘ Пример 9.3 ' создание шаблона команды Insert Adp.InsertCommand = New OleDbCommand( _ "INSERT INTO Dp (S_id, Fio, Img) VALUES (?,?,?)", Cnt1) ' создание параметров команды Insert Adp.InsertCommand.Parameters.Add( _ "@S_id", OleDbType.Integer, 5, "S_id") Adp.InsertCommand.Parameters.Add( _ "@Fio", OleDbType.VarChar, 20, "Fio") Adp.InsertCommand.Parameters.Add( _ "@Img", OleDbType.VarChar, 20, "Img")

Здесь Adp – имя OleDb-адаптера, Dp – имя таблицы базы данных, Cnt1 – имя OleDb-соединения, а S_id, Fio и Img – имена полей таблицы. При добавлении параметра в скобках указываются по порядку: имя параметра, тип данных, имя поля таблицы.

Аналогично описываются параметры команды Update: ‘ Пример 9.4 ' создание шаблона команды Update Adp.UpdateCommand = New OleDbCommand( _ "UPDATE Dp SET Fio = ?, Img=? WHERE S_id = ?", Cnt1) ' создание параметров команды Update Adp.UpdateCommand.Parameters.Add( _ "@Fio", OleDbType.VarChar, 20, "Fio") Adp.UpdateCommand.Parameters.Add( _ "@Img", OleDbType.VarChar, 20, "Img") Adp.UpdateCommand.Parameters.Add( _ "@OldS_id", OleDbType.Integer, 5, "S_id").SourceVersion _ = DataRowVersion.Original

Отметим, что в последней команде создается создается параметр OldS_id, который хранит данные из поля счетчика S_id.

Описание параметров команды Delete содержит меньше строк:

117

‘ Пример 9.5 ' создание шаблона команды Delete? Adp.DeleteCommand = New OleDbCommand( _ "DELETE FROM Dp WHERE S_id = ?", Cnt1) ' создание параметров команды Delete Adp.DeleteCommand.Parameters.Add( _ "@S_id", OleDbType.Integer, 5, "S_id").SourceVersion = _ DataRowVersion.Original

После определения свойств компонентов необходимо написать код обработки событий. Например, воспользовшись методом Application.StartupPath, который дает путь к папке, из которой запускается программа, можно получить полное имя файла базы данных. Dim Fdb As String Fdb = Application.StartupPath+"\Diplom.mdb"

Используя полученное таким образом полное имя файла базы данных, открыть соединение с базой данных. OleDbConnection1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Fdb

Используя путь к папке, из которой запускается программа, можно получить и другие адреса, например адрес папки с фотографиями. Dim Foto As String Foto = Application.StartupPath + "\Img\"

Данные из таблицы базы данных помещаем в DataSet1. OleDbDataAdapter1.Fill(DataSet1.Tables(0))

Фотографии отображаем в поле PictureBox1 с помощью метода Drawing.Bitmap.FromFile. Перемещение по строкам в таблице вызывает изменение компонента TextBox1, связанного с полем img таблицы. Как только происходит изменение TextBox1, выполняются следующие команды. ‘ Пример 9.6 Dim Ff As String if (textBox1.Text.Length == 0) Ff = Foto + "Нет_фото.jpg" else

118

Ff = Foto + textBox1.Text pictureBox1.Image=System.Drawing.Bitmap.FromFile(Ff) End If

Для обработки события «Закрытие окна приложения» в процедуре Form1_FormClosing нужно применить команду сохранения изменений в базе данных. OleDbDataAdapter1.Update(dataTable1)

Если в программе нужно показать несколько таблиц, то для каждой из них выгодно использовать вкладки TabControl – TabPage. Сначала на форме размещается компонент TabControl (рис. 9.8).

Рис. 9.8. Визуальный компонент «Вкладка»

Чтобы открыть в этом компоненте новую вкладку, необходимо щелкнуть по нему правой кнопкой мыши и выполнить «Добавить вкладку». Далее нужно переименовать вкладку и разместить на ней необходимые компоненты, в частности таблицу базы данных.

Связь с базой данных можно установить с помощью следующих действий: Данные – Добавить новый источник данных – База данных – Создать подключение – Обзор (указать файл базы данных) – Проверить подключение – Копировать файл базы данных в проект – Выбрать таблицы и запросы базы данных и их поля, которые нужно отобразить.

Пример программы

В программе выполнены все действия, описанные выше. Таблица Dp базы Diplom.mdb данных просматривается в компоненте dbGridView1. Для тех записей, в которых имеется имя графического файла, изображение открывается в окне pictureBox1. Новые строки сохраняются в процедуре Form1_FormClosing, выполняющейся перед закрытием формы. ‘ Пример 9.7 Imports System.Data.OleDb Public Class Form1

119

Private DS_stud As DataSet Private Adp As OleDbDataAdapter Private Cmd1 As OleDbCommand Private Cnt1 As OleDbConnection Private Foto As String Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load ‘ путь к базе данных и к папке с фото Dim s As String = Application.StartupPath + "\Prim.mdb" Foto = Application.StartupPath + "\Img\" ‘ строка соединения с базой данных Dim Cnt_S As String = _ "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + s ‘ строка команды Select Dim Cmd_S As String = "Select * From Dp" ‘ создать новое соединение Cnt1 = New OleDbConnection(Cnt_S) ‘ создать новую команду Cmd1 = New OleDbCommand(Cmd_S) Cmd1.Connection = New OleDbConnection(Cnt_S) Cmd1.CommandTimeout = 20 ' новый адаптер с указанными соединением и командой Adp = New OleDbDataAdapter(Cmd_S, Cnt_S) ' схема данных? Adp.MissingSchemaAction = MissingSchemaAction.AddWithKey ‘ объект DataSet для временного хранения данных DS_stud = New DataSet("Dp") ‘ получить данные

120

Adp.Fill(DS_stud, "Dp") ' создание шаблона команды Insert Adp.InsertCommand = New OleDbCommand( _ "INSERT INTO Dp (S_id, Fio, Img) VALUES (?,?,?)", Cnt1) ' создание шаблона команды Update Adp.UpdateCommand = New OleDbCommand( _ "UPDATE Dp SET Fio = ?, Img=? WHERE S_id = ?", Cnt1) ' создание шаблона команды Delete Adp.DeleteCommand = New OleDbCommand( _ "DELETE FROM Dp WHERE S_id = ?", Cnt1) ' создание параметров команды Insert Adp.InsertCommand.Parameters.Add( _ "@S_id", OleDbType.Integer, 5, "S_id") Adp.InsertCommand.Parameters.Add( _ "@Fio", OleDbType.VarChar, 20, "Fio") Adp.InsertCommand.Parameters.Add( _ "@Img", OleDbType.VarChar, 20, "Img") ' создание параметров команды Update Adp.UpdateCommand.Parameters.Add( _ "@Fio", OleDbType.VarChar, 20, "Fio") Adp.UpdateCommand.Parameters.Add( _ "@Img", OleDbType.VarChar, 20, "Img") Adp.UpdateCommand.Parameters.Add( _ "@OldS_id", OleDbType.Integer, 5, "S_id").SourceVersion _ = DataRowVersion.Original ' создание параметров команды Delete Adp.DeleteCommand.Parameters.Add( _ "@S_id", OleDbType.Integer, 5, "S_id").SourceVersion = _ DataRowVersion.Original ‘ заполнение свойств DataGridView DataGridView1.AutoGenerateColumns = False DataGridView1.DataSource = DS_stud

121

DataGridView1.DataMember = "Dp" DataGridView1.AutoSizeColumnsMode = _ DataGridViewAutoSizeColumnsMode.DisplayedCellsExceptHeader DataGridView1.Show() ‘ свойство PictureBox, обеспечивающее пропорциии фото PictureBox1.SizeMode = PictureBoxSizeMode.Zoom ‘ процедура показа фото FotoShow(1) End Sub ‘ событие “закрыть форму приложения” – обновить данные в БД Private Sub Form1_FormClosing( _ ByVal sender As System.Object, _ ByVal e As System.Windows.Forms.FormClosingEventArgs) _ Handles MyBase.FormClosing Try ‘ выполнить проверку Me.Validate() ‘ завершить редактирование Me.DataGridView1.EndEdit() ‘ внести изменения в таблицу БД Me.Adp.Update(Me.DS_stud, "Dp") 'MsgBox("Все в норме") Catch ex As Exception MsgBox(ex.ToString) End Try End Sub ‘ событие “выбрана строка” – показать фото Private Sub DataGridView1_RowEnter( _ ByVal sender As System.Object, _ ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) _ Handles DataGridView1.RowEnter

122

FotoShow(e.RowIndex) End Sub ‘ процедура, отображающая фото Private Sub FotoShow(ByVal RowCur As Integer) Try ‘ в первом столбце – фамилия Label1.Text = DS_stud.Tables(0).Rows(RowCur).Item(1) ‘ во втором столбце – имя файла с фото PictureBox1.Image = System.Drawing.Bitmap.FromFile(Foto + _ DS_stud.Tables(0).Rows(RowCur).Item(2)) ‘ нет файла с фото Catch e1 As System.IO.FileNotFoundException NotFoto() ‘ добавление новой строки в конце списка DataGridView Catch e2 As IndexOutOfRangeException NotFoto() End Try End Sub ‘ процедура, стирающая фото Sub NotFoto() PictureBox1.Image = Nothing PictureBox1.Refresh() Label1.Text = "" End Sub ‘ событие “добавление строки” – нет фото Private Sub DataGridView1_RowsAdded( _ ByVal sender As System.Object, ByVal e As _ System.Windows.Forms.DataGridViewRowsAddedEventArgs) _ Handles DataGridView1.RowsAdded NotFoto() End Sub End Class

123

9.4. Задание на тему «Просмотр данных с помощью dbGridView»

Разработать программу, которая выполняет просмотр и добавление записей в таблице базы данных. Одно поле должно содержать имя файла с фотографией. Отображать фотографию, соответствующую текущей записи. Для тестирования программы необходима таблица базы данных Microsoft Access, а также набор графических файлов.

Порядок выполнения лабораторной работы

Создать базу данных для тестирования программы. Подготовить набор фотографий для тестирования программы. Создать новый проект – приложение Windows Forms. Установить связь с базой данных. Добавить код обработки событий. Компилировать программу. Тестировать программу. Создать документ с описанием работы программы.

124

10. АНАЛИЗ ПАРАМЕТРОВ КОМПЬЮТЕРА

10.1. Анализ системных параметров

Анализ параметров компьютера обычно выполняется с помощью достаточно универсальных утилит, таких, в частности, как Everest. Включение в разрабатываемые приложения кода анализа оборудования, программного обеспечения и других подобных возможностей делает приложения более гибкими и, возможно, эффективными.

Определение версии операционной системы

Номер версии операционной системы и текущую платформу можно определить с помощью класса OSVersion. В следующих строках кода эта информация выводится в поле компонента ListBox с помощью метода Items.Add. ‘ Пример 10.1 Dim Pla As String = Environment.OSVersion.Platform.ToString() Dim Ver As String = Environment.OSVersion.Version.ToString() ListBox1.Items.Add("Платформа " + Pla) ListBox1.Items.Add("Версия " + Ver)

Получение системной даты и времени

Текущие дату и время можно получить с помощью операторов DateTime.Today и DateTime.Now, первый из которых дает только дату, а второй дату и время. ‘ Пример 10.2 ListBox1.Items.Add(DateTime.Now.ToString()) ListBox1.Items.Add(DateTime.Today.ToString())

Чтение реестра

Для обращения к реестру используются классы библиотеки Microsoft.Win32. Оператор OpenSubKey открывает раздел реестра, из которого с помощью функции GetValue выбираются сведения о типе процессора и его производителе.

125

‘ Пример 10.3 Dim M As RegistryKey = Registry.LocalMachine M = M.OpenSubKey( _ "HARDWARE\DESCRIPTION\System\CentralProcessor\0") Dim Prc As Object = M.GetValue("Identifier") Dim Vnd As Object = M.GetValue("VendorIdentifier") ListBox1.Items.Add(Prc.ToString()) ListBox1.Items.Add(Vnd.ToString())

Из следующего раздела извлекаются сведения о статусе BIOS. ‘ Пример 10.4 Dim V As RegistryKey = Registry.LocalMachine V = V.OpenSubKey( _ "HARDWARE\DESCRIPTION\System\MultiFunctionAdapter\4") Dim I_B As Object = V.GetValue("Identifier") ListBox1.Items.Add(I_B.ToString())

Далее читаются дата записи BIOS и аппаратная платформа компьютера. ‘ Пример 10.5 RegistryKey B = Registry.LocalMachine B = B.OpenSubKey("HARDWARE\\DESCRIPTION\\System\\") Object D_B = B.GetValue("SystemBiosDate") Object P_M = B.GetValue("Identifier")

Информация о процессах

Для получения сведений о процессах в программе необходима ссылка на пространство имен System.Diagnostics. Информация извлекается с помощью оператора Process.GetProcesses. Между названием процесса и его номером выводится символ табуляции Chr(9). ‘ Пример 10.6 Dim Proc() As Process = Process.GetProcesses() For Each P As Process In Proc P.Refresh() ListBox1.Items.Add(P.ProcessName+Chr(9)+P.Id.ToString()) Next

126

Список установленного программного обеспечения

Для чтения из реестра информации об установленном программном обеспечении в программе требуется поместить ссылку на пространство имен Microsoft.Win32. Для размещения массива строк в поле компонента ListBox используется метод Items.AddRange. ‘ Пример 10.7 Dim R As RegistryKey = Registry.LocalMachine.OpenSubKey( _ "Software\Microsoft\Windows\CurrentVersion\Uninstall") Dim SubKeys() As String = R.GetSubKeyNames() ListBox1.Items.AddRange(SubKeys)

Переменные окружения

Для получения информации о переменных окружения в программе требуется поместить ссылку на пространство имен System.Management. Информация о переменных окружения выбирается с помощью запроса Win32_Environment из инструментария управления Windows, затем отображается в поле ListBox. ‘ Пример 10.8 Dim Query As WqlObjectQuery = _ New WqlObjectQuery("Select * from Win32_Environment") Dim Find As ManagementObjectSearcher = _ New ManagementObjectSearcher(Query) For Each Mo As ManagementObject In Find.Get() ListBox1.Items.Add(Mo("Description") + " - " + _ Mo("Name") + " - " + Mo("UserName") + " - " + _ Mo("VariableValue")) Next

Учетные записи локальной машины

Для получения информации об учетных записях локальной машины в программе требуется поместить ссылку на пространство

127

имен System.Management. Информация об учетных записях выбирается с помощью запроса Win32_UserAccount из инструментария управления Windows, затем отображается в поле ListBox. Ниже приводится полностью код программы, читающей информацию об учетных записях. ‘ Пример 10.9 Imports System.Management Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Dim Query As WqlObjectQuery = New WqlObjectQuery( _ "SELECT * FROM Win32_UserAccount WHERE LocalAccount = _ 'true'") Dim Find As ManagementObjectSearcher = _ New ManagementObjectSearcher(Query) For Each Mo As ManagementObject In Find.Get() ListBox1.Items.Add("Caption." + Mo("Caption").ToString()) ListBox1.Items.Add("Description." + _ Mo("Description").ToString()) ListBox1.Items.Add("Domain where account belongs." + _ Mo("Domain").ToString()) ListBox1.Items.Add("Account is defined on local machine" _ + Mo("LocalAccount").ToString()) ListBox1.Items.Add("Name of the account " + _ Mo("Name").ToString()) ListBox1.Items.Add("Password can be changed." + _ Mo("PasswordChangeable").ToString()) ListBox1.Items.Add("Password expires." + _ Mo("PasswordExpires").ToString()) ListBox1.Items.Add( _ "Password is required for this account" + _ Mo("PasswordRequired").ToString()) ListBox1.Items.Add("Security identifier (SID)." + _ Mo("SID").ToString()) ListBox1.Items.Add("Type of security identifier." + _ GetSidType(Convert.ToInt32(Mo("SIDType"))).ToString())

128

ListBox1.Items.Add("Status." + Mo("Status").ToString()) ListBox1.Items.Add("-------------") Next End Sub Public Function GetSidType(ByVal type As Integer) As String Select Case type Case 1 Return "SidTypeUser" Case 2 Return "SidTypeGroup" Case 3 Return "SidTypeDomain" Case 4 Return "SidTypeAlias" Case 5 Return "SidTypeWellKnownGroup" Case 6 Return "SidTypeDeletedAccount" Case 7 Return "SidTypeInvalid" Case 8 Return "SidTypeUnknown" Case 9 Return "SidTypeComputer" Case Else Return String.Empty End Select End Function End Class

10.2. Задания на тему «Анализ системных параметров»

Разработать приложение Windows Forms, которое определяет системные параметры, указанные в соответствующем варианте задания.

Вариант 1. Определить системные дату и время, а также информацию о процессах.

129

Вариант 2. Определить системные дату и время, а также информацию о переменных окружения.

Вариант 3. Определить системные дату и время, а также информацию об установленном программном обеспечении.

Вариант 4. Определить версию операционной системы, а также информацию об установленном программном обеспечении.

Вариант 5. Определить версию операционной системы, а также информацию о переменных окружения.

Вариант 6. Определить версию операционной системы, а также информацию о процессах.

Вариант 7. Определить аппаратную платформу, дату записи и статус BIOS.

Вариант 8. Определить аппаратную платформу, процессор и производителя.

Вариант 9. Определить аппаратную платформу, а также версию операционной системы.

Вариант 10. Определить учетные записи локальной машины.

Порядок выполнения лабораторной работы

Создать новый проект – приложение Windows Forms. Вынести на форму необходимые визуальные компоненты. Добавить программный код обработки событий. Компилировать программу. Тестировать программу. Создать документ с описанием работы программы.

10.3. Анализ оборудования

Получение информации о компьютере

Информацию о компьютере дает запрос Win32_ComputerSystem из инструментария управления Windows ‘ Пример 10.10 Dim Query As WqlObjectQuery = New WqlObjectQuery( _ "SELECT * FROM Win32_ComputerSystem") Dim Find As ManagementObjectSearcher = New _ ManagementObjectSearcher(Query)

130

For Each Mo As ManagementObject In Find.Get() ListBox1.Items.Add("Computer belongs to domain " + _ Mo("Domain").ToString()) ListBox1.Items.Add("Computer manufacturer." + _ Mo("Manufacturer").ToString()) ListBox1.Items.Add("Model name given by manufacturer "+ _ Mo("Model").ToString()) Next

Информация о производителе

Информация о производителе выбирается с помощью запроса Win32_ComputerSystemProduct из инструментария управления Windows, затем отображается в поле Label. ‘ Пример 10.11 Dim Query As WqlObjectQuery = New WqlObjectQuery( _ "SELECT * FROM Win32_ComputerSystemProduct") Dim Find As ManagementObjectSearcher = New _ ManagementObjectSearcher(Query) For Each Mo As ManagementObject In Find.Get() ListBox1.Items.Add("Description." + _ Mo("Description").ToString()) ListBox1.Items.Add( _ "Identifying number (usually serial number)." + _ Mo("IdentifyingNumber").ToString()) ListBox1.Items.Add("Commonly used product name." + _ Mo("Name").ToString()) ListBox1.Items.Add("Universally Unique Identifier of product." + Mo("UUID").ToString()) ListBox1.Items.Add("Vendor of product." + _ Mo("Vendor").ToString()) Next

131

Тип компьютера

Информация о типе компьютера выбирается с помощью запроса Win32_ComputerSystem из инструментария управления Windows, затем отображается в поле Label. ‘ Пример 10.12 Dim Roles() As String = {"Standalone Workstation", _ "Member Workstation", _ "Standalone Server", _ "Member Server", _ "Backup Domain Controller", _ "Primary Domain Controller"} Dim Query As WqlObjectQuery = New WqlObjectQuery( _ "SELECT * FROM Win32_ComputerSystem") Dim Find As ManagementObjectSearcher = New _ ManagementObjectSearcher(Query) For Each Mo As ManagementObject In Find.Get() ListBox1.Items.Add(Roles( _ Convert.ToInt32(Mo("DomainRole"))).ToString()) Next

Определение числа процессоров

Количество процессоров вашего компьютера можно определить с помощью свойства ProcessorAffinity метода GetCurrentProcess. Инструкция And, стоящая в одном из выражений в цикле While, выполняет поразрядную (побитовую) операцию И. ‘ Пример 10.13 Dim Am As Integer = _ System.Diagnostics.Process.GetCurrentProcess(). _ ProcessorAffinity.ToInt32() Dim ProcCnt As Integer = 0 While Am <> 0 ProcCnt = ProcCnt + 1 Am = Am And (Am - 1) End While ListBox1.Items.Add(ProcCnt.ToString())

132

Информация о жестком диске

Информация о типе компьютера выбирается с помощью запроса Win32_LogicalDisk из инструментария управления Windows, затем отображается в поле Label. Для того чтобы использовать данный инструментарий, необходимо сделать ссылку на пространство имен System.Management. ‘ Пример 10.14 Dim cmiPath As String = _ "\root\cimv2:Win32_LogicalDisk.DeviceID='C:'" Dim Mo As ManagementObject = New ManagementObject(cmiPath) ListBox1.Items.Add("Описание: " + _ Mo("Description").ToString()) ListBox1.Items.Add("File system: " + _ Mo("Файловая система").ToString()) ListBox1.Items.Add("Свободное пространство: " + _ Mo("FreeSpace").ToString()) ListBox1.Items.Add("Общий размер: " + _ Mo("Size").ToString())

Свойства видеоконтроллера

Следующая команда отображает в поле Label сведения о границах экрана, то есть минимальных и максимальных значениях экранных координат. ‘ Пример 10.15 ListBox1.Items.Add( _ System.Windows.Forms.Screen.PrimaryScreen.Bounds.ToString())

Сведения о видеоконтроллере, а также о частоте обновления экрана можно получить с помощью WMI – инструментария управления Windows. Для того чтобы использовать данный инструментарий, необходимо сделать ссылку на пространство имен System.Manadgement. Свойства видеоконтроллера определяются применением запроса Win32_VideoController.

‘ Пример 10.16 Dim Sc As ManagementScope = New ManagementScope( _ "\\.\root\cimv2", Nothing)

133

Dim Ph As ManagementPath = New ManagementPath( _ "Win32_VideoController") Dim Mc As ManagementClass = New ManagementClass( _ Sc, Ph, Nothing)

Из полученной таким образом структуры сведения о имени видеоконтроллера, процессоре, памяти и частоте обновления экрана выбираются оператором GetPropertyValue с указанием соответствующего параметра. ‘ Пример 10.17 For Each ss As ManagementObject In Mc.GetInstances() ListBox1.Items.Add("Имя " + ss.GetPropertyValue("Name")) ListBox1.Items.Add("Видеопроцессор " + _ ss.GetPropertyValue("VideoProcessor")) ListBox1.Items.Add("Память " + _ ss.GetPropertyValue("AdapterRAM").ToString()) ListBox1.Items.Add("Разрешение " + _ ss.GetPropertyValue("VideoModeDescription").ToString()) ListBox1.Items.Add("Обновление " + _ ss.GetPropertyValue("CurrentRefreshRate").ToString()) Next

10.4. Задания на тему «Анализ оборудования»

Разработать приложение Windows Forms, которое определяет параметры оборудования, указанные в соответствующем варианте задания.

Вариант 1. Определить информацию о компьютере. Вариант 2. Определить информацию о производителе, а также

тип компьютера. Вариант 3. Определить тип компьютера и количество проце-

ссоров. Вариант 4. Определить информацию о видеоконтроллере. Вариант 5. Определить информацию о жестком диске.

134

Вариант 6. Определить информацию о компьютере. Вариант 7. Определить информацию о производителе, а также

тип компьютера. Вариант 8. Определить информацию о видеоконтроллере. Вариант 9. Определить информацию о жестком диске. Вариант 10. Определить тип компьютера и количество проце-

ссоров.

Порядок выполнения лабораторной работы

Создать новый проект – приложение Windows Forms. Вынести на форму необходимые визуальные компоненты. Добавить программный код обработки событий. Компилировать программу. Тестировать программу. Создать документ с описанием работы программы.

10.5. Анализ сетевой информации

Разбор URL

Выделить из строки URL-адреса ее составляющие (адрес, порт, протокол и т.д.) можно, применив класс System.UriBuilder. Строка для разбора вводится в поле TextBox. Результат разбора выводится в поле ListBox. ‘ Пример 10.18 Dim s As String If TextBox1.Text.Length > 0 Then s = TextBox1.Text Else s = "http://microsoft.com:80/default.aspx?id=55" End If Dim Parser As UriBuilder = New UriBuilder(s) ListBox1.Items.Add("URL " + Parser.Uri.ToString()) ListBox1.Items.Add("Адрес " + Parser.Host.ToString()) ListBox1.Items.Add("протокол " + Parser.Scheme.ToString()) ListBox1.Items.Add("путь " + Parser.Path.ToString())

135

ListBox1.Items.Add("порт " + Parser.Port.ToString()) ListBox1.Items.Add("запрос " + Parser.Query.ToString()) Dim builder As UriBuilder = New UriBuilder( _ "https", "microsoft.com", 81, "/default.aspx", "?id=77") ListBox1.Items.Add("построение URL " + builder.ToString())

DNS-имя компьютера

DNS-имя компьютера определяется с помощью метода GetHostByName класса Net.Dns.

Netbios-имя компьютера

Имя компьютера можно извлечь из системной переменной System.Environment.MachineName.

Имя текущего пользователя

Информация об имени домена и о текущем пользователе системы находится в переменных UserDomainName и UserName класса Environment. Аналогично определяется имя компьютера в переменной MachinName. Имя хоста определяетя с помощью метода System.Net.Dns.GetHostName. DNS-имя определяется с помощью метода System.Net.Dns.GetHostEntry. В примере кода ниже все эти сведения выводятся в поле ListBox. ‘ Пример 10.19 ' Имя компьютера ListBox1.Items.Add("Machine Name = " + _ System.Environment.MachineName.ToString()) ' Имя хоста Dim H As String = System.Net.Dns.GetHostName().ToString() ListBox1.Items.Add("Host Name = " + H) ' DNS-имя ListBox1.Items.Add("DNS-имя = " + _ System.Net.Dns.GetHostEntry(H).HostName)

136

' Имя домена ListBox1.Items.Add("Domain = " + _ Environment.UserDomainName.ToString()) ' Текущий пользователь ListBox1.Items.Add("User = " + _ Environment.UserName.ToString())

Список IP-адресов компьютера

Для получения списка адресов используется коллекция AddressList. Адреса выводятся в поле ListBox.

‘ Пример 10.20 ' Имя хоста Dim H As String = System.Net.Dns.GetHostName() ' Список IP-адресов Dim IP_list() As System.Net.IPAddress = _ System.Net.Dns.GetHostEntry(H).AddressList For Each IP As System.Net.IPAddress In IP_list ListBox1.Items.Add(IP.ToString()) Next

Список сетевых дисков

Список дисков определяется с помощью функции WshNetwork из библиотеки IWshRuntimeLibrary. Для доступа к библиотеке необходимо подключить COM-объект Windows Script Host Object Model, щелкнув правой кнопкой мыши по пункту Ссылки в окне Обозревателя решений. Небольшая программа приводится ниже полностью. ‘ Пример 10.21 Imports IWshRuntimeLibrary Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click

137

Dim Net As WshNetwork = New WshNetwork() For Each Drv As IEnumerable In Net.EnumNetworkDrives() ListBox1.Items.Add(Drv.ToString()) Next End Sub End Class

10.6. Задания на тему «Анализ сетевой информации»

Разработать приложение Windows Forms, которое определяет ту сетевую информацию, которая требуется в соответствующем варианте задания.

Вариант 1. Выполнить разбор URL-адреса. Вариант 2. Определить DNS-имя компьютера. Вариант 3. Определить имя текущего пользователя. Вариант 4. Определить IP-адреса компьютера. Вариант 5. Определить сетевые диски. Вариант 6. Выполнить IP-адреса компьютера, а также имя теку-

щего пользователя. Вариант 7. Определить NetBios-имя компьютера. Вариант 8. Определить DNS-имя компьютера, а также NetBios-

имя компьютера. Вариант 9. Определить имя хоста. Вариант 10. Определить имя хоста, DNS-имя компьютера, а

также NetBios-имя компьютера.

Порядок выполнения лабораторной работы

Создать новый проект – приложение Windows Forms. Вынести на форму необходимые визуальные компоненты. Добавить программный код обработки событий. Компилировать программу. Тестировать программу. Создать документ с описанием работы программы.

138

11. РАЗНЫЕ ПРОГРАММЫ

В последнюю главу включены несколько разнородных тем, по которым не предусмотрено заданий и лабораторных работ.

11.1. Параметры приложения

Параметры приложения для Windows Forms позволяют создавать настраиваемые приложения и параметры пользователей на клиентском компьютере. С помощью параметров приложения можно хранить такие сведения, как строки подключений к базам данных, предпочтения пользователя и др. Пользователь ожидает, что, повторно запуская приложение, он вернется к последнему состоянию данной системы. Например, увидит установленные им размеры окна, положение на рабочем столе, найдет оставленные им последние документы. Используя Visual Studio, можно создавать параметры, связывать со свойствами в формах, читать и записывать на диск. Параметры хранятся в формате XML в файлах конфигурации. Параметры приложения размещаются в файле app.exe.config, где app – имя основного исполняемого файла. Параметры пользователей помещаются в файле user.config, где user – имя пользователя, выполняющего приложение. В большинстве случаев параметры приложения доступны только для чтения. Параметры пользователей, напротив, можно и считывать, и записывать во время выполнения. Можно определить параметры в окне Свойства формы с помощью свойства ApplicationSettings (рис. 11.1).

Рис. 11.1. Окно Свойства формы

Visual Studio обеспечивает привязку значения параметра к свойству в форме или элементе управления таким образом, чтобы

139

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

Для создания параметра в окне свойств формы в группе ApplicationSettings нужно щелкнуть мышью по строке PropertyBinding, затем по возникшей там кнопке (рис. 11.1). После этого действия появляется окно Параметры приложения для Form1 (рис. 11.2), в котором выбирается параметр и задается его имя.

Рис. 11.2. Окно Параметры приложения для Form1

Например, для параметра ClientSize можно указать имя U_size, а для параметра Location – имя U_loc. Эти параметры позволят при перезапуске приложения получать его окно с сохраненными размерами и положением. Добавить, изменить или удалить параметры можно в окне Свойства проекта, открыв его с помощью контекстного меню после щелчка правой кнопкой мыши по имени проекта в Обозревателе решений.

Рис. 11.3. Изменение параметров в окне Свойства проекта

140

Объект My.Settings

Объект My.Settings предоставляет доступ к параметрам приложения и позволяет динамически хранить и извлекать свойства и другие сведения для приложения. Свойства объекта My.Settings обеспечивают доступ к параметрам приложения. Каждый параметр имеет имя, тип, область действия, значение, и эти настройки определяют доступ к каждому параметру в объекте My.Settings: Имя – определяет имя свойства. Тип – определяет тип свойства. Область действия может принимать одно из двух значений:

Приложение – свойство доступно только для чтения. Пользователь – свойство доступно для чтения и записи.

Значение – является значением по умолчанию. В следующей строке кода выполняется чтение параметра

User_Size. Label1.Text = My.Settings.User_Size.ToString()

Параметры пользователя можно изменить, присваивая новое значение свойству объекта параметров My.Settings, например, так можно изменить свойство User_Name: My.Settings.User_Name = “Сидоров С.С.”

Для сохранения измененных пользовательских параметров можно использовать метод My.Settings.Save. My.Settings.Save()

Отметим, что все параметры в примерах, нужно определять так, как было описано выше – в окне Свойства формы или в окне Свойства проекта.

Таблица свойств пользовательских параметров

Можно отобразить параметры пользователя, заполнив элемент управления PropertyGrid. Для этого необходимо выполнить следующие действия: 1. Добавить элемент управления PropertyGrid на форму. 2. Задать объект My.Settings в качестве объекта таблицы свойств. PropertyGrid1.SelectedObject = My.Settings 3. Настроить таблицу свойств для отображения только параметров

пользователей.

141

Dim U_A As New System.Configuration.UserScopedSettingAttribute Dim A As New System.ComponentModel.AttributeCollection(U_A) PropertyGrid1.BrowsableAttributes = A

Чтобы отобразить только параметры приложения, нужно использовать атрибут ApplicationScopedSettingAttribute вместо UserScopedSettingAttribute.

Пример программы

В примере параметры пользователя отражаются в таблице при загрузке формы, а также в поле ListBox после щелчка по управляющей кнопке. Параметры приложения сохраняются в процедуре обработки события Завершение работы с формой. ‘ Пример 11.1 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click ListBox1.Items.Add(My.Settings.U_size.ToString()) ListBox1.Items.Add(My.Settings.U_Loc.ToString()) End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles MyBase.Load PropertyGrid1.SelectedObject = My.Settings Dim userAttr As New _ System.Configuration.UserScopedSettingAttribute Dim attrs As New _ System.ComponentModel.AttributeCollection(userAttr) PropertyGrid1.BrowsableAttributes = attrs End Sub Private Sub Form1_FormClosed(ByVal sender As System.Object, _ ByVal e As System.Windows.Forms.FormClosedEventArgs) _ Handles MyBase.FormClosed My.Settings.Save() End Sub End Class

142

11.2. Справочная информация

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

Для присоединения справки к приложению можно использовать компонент HelpProvider. Разделы справки затем можно привязать к определенным элементам управления на форме.

Порядок подключения справки

1. Перетащить компонент HelpProvider из панели элементов в форму. 2. В окне Свойства задать значение свойству HelpNamespace в виде

CHM-, COL- или HTM-файла справки. 3. Выбрать элемент управления, к которому нужно привязать раздел

справки, и задать свойство HelpKeyword. Это ключевое слово (строка), по которому в файле справки будет найден соответствующий раздел.

4. В окне Свойства присвойте свойству HelpNavigator значение перечисления HelpNavigator. Это определяет способ передачи свойства HelpKeyword в справочную систему. Ниже приведены возможные параметры и их описания: AssociateIndex – указывает, что индекс для данного раздела

выполняется в заданном URL. Find – указывает, что отображается страница поиска заданного

URL-адреса. Указатель – указывает, что отображается указатель заданного

URL-адреса. KeywordIndex – указывает ключевое слово для поиска и

действие для выполнения в заданном URL-адресе. TableOfContents – указывает, что отображается оглавление

файла справки HTML 1.0. Topic – указывает, что отображается раздел, на который

ссылается заданный URL-адрес. Во время выполнения нажатие клавиши F1 при находящемся в

фокусе элементе управления (для которого заданы свойства HelpKeyword и HelpNavigator) открывает файл справки, связанный с

143

компонентом HelpProvider. Отметим, что компонент HelpProvider можно использовать для отображения всплывающей справки.

Создание файла справки

Создайте текстовый файл, имеющий расширение .htm. В заголовке файла поместить описания ключевых слов. Файл должен иметь в заголовке мета-тег, а также описания ключевых слов. Пример 11.2 <html> <head> <META HTTP-EQUIV="Htm-Help" Content="PROG.htm#Main_Contents"> <KEYWORD VALUE="R0" TITLE="Введение" HREF="PROG.htm#Main_contents"> <KEYWORD VALUE="R1" TITLE="Первый раздел" HREF="PROG.htm#R1"> <KEYWORD VALUE="R2" TITLE="Второй раздел" HREF="PROG.htm#R2"> </head>

Первый раздел в файле справки следует назвать Main_contents, остальные могут иметь произвольные имена (в примере R1, R2). Одному разделу может соответствовать несколько ключевых слов, которые отделяются точкой с запятой, например: <KEYWORD VALUE="R0;запуск;старт"

Количество ключевых слов для раздела не ограничено. Содержимое разделов, включая main_contents, начинается тегом комментария: <!-- PegHelp -->

Раздел Main_contents обычно содержит ссылки на подразделы. Обратите внимание, что требуется имя файла в дополнение к имени привязки. Пример 11.3 <body> <!-- PegHelp --> <a name="Main_Contents"></a> <b>Введение</b>

144

</p> <a href="PROG.htm#R0">Введение</a><br> <a href="PROG.htm#R1">Раздел 1</a><br>

В справку можно добавить графические объекты, например: <img src="1.bmp">

Пример справки на языке HTML

В примере создано три раздела, считая Введение. В справке использованы три картинки. Пример 11.4 <html> <head> <META HTTP-EQUIV="Htm-Help" Content="PROG.htm#Main_Contents"> <KEYWORD VALUE="R0" TITLE="Введение" HREF="PROG.htm#Main_contents"> <KEYWORD VALUE="R1" TITLE="Первый раздел" HREF="PROG.htm#R1"> <KEYWORD VALUE="R2" TITLE="Второй раздел" HREF="PROG.htm#R2"> </head> <body> <!-- PegHelp --> <p> <a name="Main_Contents"></a> </p> <p> <a href="PROG.htm#R1">Первый раздел</a><br> <a href="PROG.htm#R2">Второй раздел</a><br> </p> <b>Введение справки</b> </p> <p> Текст введения справки </p> <p> <img src="1.bmp">

145

</p> <!-- PegHelp --> <!-- ******* TOPIC BREAK ******* --> <hr> <a name="R1"></a> <p><b>Первый раздел справки</b></p> <p> Текст первого раздела справки </p> <p> <img src="2.2bp"> </p> <!-- PegHelp --> <!-- ******* TOPIC BREAK ******* --> <hr> <a name="R2"></a> <p><b>Второй раздел справки</b></p> <p> Текст первого раздела справки </p> <p> <img src="3.bmp"> </p> </body> </html>

11.3. Чтение данных из книги Microsoft Excel

Для чтения данных с листа книги Microsoft Excel необходимы команды из пространства имен System.Data.OleDb. Для доступа к файлу формируется строка подключения. ‘ Пример 11.5 ‘ имя файла Dim F_N As String = "Фирма.xls" ‘ строка соединения Dim C_S As String = String.Format( _ "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties= _ 'Excel 8.0;HDR=No';Data Source={0}", F_N)

146

С помощью оператора OleDbConnection открывается соединение. ‘ создать соединение Dim CNT As OleDbConnection = New OleDbConnection(C_S) ‘ открыть соединение CNT.Open()

С помощью оператора GetOleDbSchemaTable создается структура, содержащая схему книги Excel. ‘ Пример 11.6 ‘ получить схему таблицы Dim S_T As DataTable = CNT.GetOleDbSchemaTable( _ OleDbSchemaGuid.Tables, _ New Object() {Nothing, Nothing, Nothing, "TABLE"})

Каждая строка полученной структуры содержит сведения об одном из листов. Колонка schemaTable.Rows[i].ItemArray[2] содержит названия листов, а schemaTable.Rows[i].ItemArray[7] – даты модификации листов. ‘ Пример 11.7 ‘ отобразить названия листов For i As Integer = 0 To S_T.Rows.Count - 1 ListBox1.Items.Add(S_T.Rows(i).ItemArray(2).ToString()) ListBox1.Items.Add(S_T.Rows(i).ItemArray(7).ToString()) Next

Колонка schemaTable.Rows[i].ItemArray[0] содержит имя первого листа. Dim sh_1 As String = S_T.Rows(0).ItemArray(2).ToString()

С помощью оператора StringFormat формируется строка запроса для первого листа. Оператор OleDbDataAdapter реализует запрос с данной строкой. Оператор Fill обновляет строки в объекте System.Data.DataSet. Оператор Tables передает выбранные строки таблицы в переменную tb. ‘ Пример 11.8 ‘ запрос на данные с листа 1 Dim sel_cel As String = String.Format( _ "SELECT * FROM [{0}]", sh_1) ‘ объект OleDbDataAdapter

147

Dim Adp As OleDbDataAdapter = New OleDbDataAdapter( _ sel_cel, CNT) ‘ объект DataSet Dim D_S As DataSet = New DataSet("EXCEL") ‘ читать данные из файла в объет DataSet Adp.Fill(D_S) ‘ объект DataTable Dim TB As DataTable = D_S.Tables(0)

Отобранные с помощью запроса данные выводятся в поле ListBox. ‘ отобразить данные с листа 1 For Each ROW As DataRow In TB.Rows S = "" For Each COL As Object In ROW.ItemArray S = S + " " + COL.ToString() Next ListBox1.Items.Add(S) Next

Пример программы

В примере данные читаются с листа 1 документ фирма.xls. Прочитанная информация выводится в поле компонента ListBox. ‘ Пример 11.9 Imports System.Data.OleDb Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click ‘ имя файла Dim F_N As String = "Фирма.xls" ‘ строка соединения Dim C_S As String = String.Format( _ "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties= _ 'Excel 8.0;HDR=No';Data Source={0}", F_N)

148

‘ объект DataSet Dim D_S As DataSet = New DataSet("EXCEL") ‘ создать соединение Dim CNT As OleDbConnection = New OleDbConnection(C_S) ‘ открыть соединение CNT.Open() ‘ получить схему таблицы Dim S_T As DataTable = CNT.GetOleDbSchemaTable( _ OleDbSchemaGuid.Tables, _ New Object() {Nothing, Nothing, Nothing, "TABLE"}) ‘ отобразить названия листов For i As Integer = 0 To S_T.Rows.Count - 1 ListBox1.Items.Add(S_T.Rows(i).ItemArray(2).ToString()) Next ‘ лист 1 Dim sh_1 As String = S_T.Rows(0).ItemArray(2).ToString() ‘ запрос на данные с листа 1 Dim sel_cel As String = String.Format( _ "SELECT * FROM [{0}]", sh_1) ‘ объект OleDbDataAdapter Dim Adp As OleDbDataAdapter = New OleDbDataAdapter( _ sel_cel, CNT) ‘ читать данные из файла в объект DataSet Adp.Fill(D_S) ‘ объект DataTable Dim TB As DataTable = D_S.Tables(0) Dim S As String ‘ отобразить данные с листа 1 For Each ROW As DataRow In TB.Rows

149

S = "" For Each COL As Object In ROW.ItemArray S = S + " " + COL.ToString() Next ListBox1.Items.Add(S) Next End Sub End Class

11.4. Время, дата, календарь

Для контроля времени предназначен компонент Timer. Если таймер включен (Enabled), то он вырабатывает событие через некоторый интервал (Interval). Например, команды ниже задают интервал 100, соответствующий 0,1 секунды, и включают таймер. Timer1.Interval = 100 Timer1.Enabled = true

Обработка события, которое генерирует таймер, выполняется в процедуре Timer_Tick. В примере процедуры, показанном ниже, через каждый интервал изменяются целые переменные m, s и d, обозначающие минуты, секунды и десятые доли секунды. ‘ Пример 11.10 Private Sub Timer1_Tick(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Timer1.Tick d = d + 1 If d > 9 Then d = 0 s = s + 1 If s > 59 Then s = 0 m = m + 1 End If End If Label1.Text = d.ToString() Label2.Text = s.ToString() Label3.Text = m.ToString() End Sub

150

Если на форме нужно отобразить системное время, то можно использовать компонент DateTimePicker. Этот компонент может отображать время или дату. Для того чтобы выбрать время,

необходимо свойству Format присвоить значение Time. В правой части компонента имеется экранная кнопка, которая разворачивает календарь на текущий месяц (рис. 11.4).

Если в программе требуется календарь на произвольное число месяцев, то эту возможность предоставит компонент MontCalendar (рис. 11.5). Календарь выделяет текущий день, показывает дни недели. Можно также выделить праздники, важные последовательности дней и т.д.

Рис. 11.5. Компонент MontCalendar

Библиографический список

1. Агуров П.В. C#. Сборник рецептов. – СПб., 2007. 3. Культин Н.Б. Microsoft Visual C# в задачах и примерах. – СПб., 2009. 4. Троелсен Э. C# и платформа .NET. – СПб., 2007.

Рис. 11.4. Компонент DateTimePicker

151

ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ

Add – добавление строк в ListBox – 56, 72, 90 AddRange – добавление массива строк в ListBox – 126 Append – параметр FileMode – 28 Application.StartUpPath – папка запуска программы – 117 ApplicationScopedSettingAttribute – атрибут параметров приложения – 141 ApplicationSettings – свойство компонента – 138, 139 ArgumentException – тип исключения – 27 ArithmeticException – тип исключения – 27 ArrayTypeMismatchException – тип исключения – 27 Ascending – параметр сортировки – 90 Average – среднее арифметическое – 89

BeginUpdate – свойство ListBox – 57 Between – интервал – 105 BinaryReader – класс – 46, 47 BinarySearch – поиск позиции в массиве – 38 BinaryWriter – класс – 43, 44 Brushes – цвет закраски – 83 Button – управляющая кнопка – 51, 52 Button.Click – событие – 65

Catch – блок реакции на исключение – 23, 24, 25, 44 Checked – свойство CheckBox – 52 CheckBox – кнопки выбора – 51, 52, 57 Clear – очистка ListBox – 38, 72 ClientSize.Height – высота окна – 77 ClientSize.Width – ширина окна – 76, 77 Close – закрытие соединения – 104, 107 Close – закрыть объект OleDbDataReader – 107 Close – закрыть файл – 29, 31, 44 ComboBox – выбор строки – 51, 53, 57 CompareTo – сравнение – 15 Console – класс – 18, 28 Console.Error – свойство – 28 Console.In – свойство – 28 Console.Out – свойство – 28 Console.ReadLine – метод – 10 Console.WriteLine – метод – 10 Contains – содержит подстроку – 93 Convert – класс преобразований – 15, 18, 54 Copy – копирование массива – 38 CopyTo – копирование массива – 38 Cos – функция – 18 Count – размер массива – 89

152

Count – число строк ListBox – 53, 72 CreateNew – параметр FileMode – 43 DataGridView – конструктор – 114 DataGridView – отображение данных – 111 DataSet – компонент – 111, 113, 115 DataSet – хранение данных – 102, 103, 117, 146 DateTime – дата, время – 124 DeleteCommand – настройка в программе – 113 Desc – по убыванию – 105 Descending – параметр сортировки – 90, 99 DialogResult.OK – результат диалога – 64 Dim – ключевое слово – 13 Distinct – записи без повторов – 106 Distinct – массив без повторов – 90 DivideByZeroException – тип исключения – 25, 27 DNS-имя – 135 Double – тип – 13, 38 Drawing.Bitmap.FromFile – метод – 117 Drawing.Brushes – цвет кисти – 76 Drawing.Image.FromFile – загрузка рисунка – 53 DrawLine – прямая – 77 DrawPie – рисовать сектор – 84 DrawRectangle – прямоугольник – 77, 81 DrawString – рисовать строку – 76 Enabled – свойство – 58, 58, 149 Encoding – класс преобразований – 29, 68, 70 EndOfStreamException – тип исключения – 32, 48 EndUpdate – свойство ListBox – 56 Environment – класс – 63 Environment.SpecialFolder.MyComputer – адрес корневой папки – 63 Equals – совпадает – 15, 93 Exception – класс – 22, 23 ExecuteReader – метод – 104, 106 Exit For – прерывание цикла – 40 Exit Try – выход из Try-блока – 24 FileAccess – параметр открытия файла – 46 FileClose – закрыть файл – 41 FileMode – параметр открытия файла – 28, 31, 43, 46 FileName – свойство – 68 FileNotFoundException – тип исключения – 32, 48 FileOpen – открыть файл – 40 FileStream – класс – 28, 31, 43 Fill – заполнение DataSet – 114, 146 FillPie – закраска сектора – 84

153

FillRectangle – закраска прямоугольника – 81 Filter – свойство OpenFileDialog – 67 Filter – свойство SaveFileDialog – 69 FilterIndex – свойство OpenFileDialog – 66 FilterIndex – свойство SaveFileDialog – 69 First – первое появление в массиве – 89 FolderBrowserDialog – класс – 63, 64 Font – шрифт – 51, 76 For Each – цикл – 39 Form – форма – 51 Format – формат преобразования в строковый тип – 15, 150 FormClosing – событие – 115 For-Next – оператор – 16 FreeFile – свободный номер файла – 40 GetCurrentProcess – метод – 131 GetDirectories – метод – 63 GetEncoding – метод – 29, 68, 70 GetFiles – метод – 66, 72 GetHostByName – Dns-имя – 135 GetLogicalDrives – метод – 63 GetOleDbSchemaTable – 146 GetSelected – свойство ListBox – 55 GetSubKeyNames – извлечь данные – 126 GetValue – извлечь данные – 107, 124 Graphics – поверхность – 76

HelpKeyWord – свойство компонента HelpProvider – 142 HelpLink – свойство класса Exception – 23 HelpNameSpace – свойство компонента HelpProvider – 142 HelpNavigator – свойство компонента HelpProvider – 142 HelpProvider – компонент – 142, 143 Hresult – свойство класса Exception – 23 If-End If – оператор – 13, 14 Image – свойство PictureBox – 52, 53 Image – свойство Button – 53 Imports – оператор – 10, 28, 65 IN – принадлежность списку – 105 IndexOf – поиск позиции в массиве – 38 IndexOutOfRangeException – тип исключения – 25, 27 InitialDirectory – свойство – 66, 67 InnerException – свойство класса Exception – 23 InsertCommand – конструктор – 112, 113 Integer – тип – 13 Interval – свойство Timer – 149 IO.Directory – класс – 63, 66, 72

154

IOException – исключение – 29 IP-адреса – адрес компьютера – 136 IS NULL – если пусто – 105 IsNot – оператор – 68, 71, 73 Items – строки списка ComboBox – 53 Items – строки списка ListBox – 52, 72, 73, 124, 126 IWshRuntimeLibrary – библиотека – 136 Label – надпись – 50, 51, 52, 53 Last – последнее появление в массиве – 89 LastIndexOf – поиск позиции в массиве – 38 Length – длина массива – 38, 63, 77 Like – шаблон запроса – 105 Linq – запрос – 89 ListBox – вывод списка – 51, 52, 55, 56, 72, 73 MachineName – имя компьютера – 135 Main – процедура – 11 ManagementObjectSearcher – запрос – 126 Math – класс математических функций – 15, 18 Max – максимум в массиве – 89 MeasureString – свойство строки – 76 Message – свойство класса Exception – 22, 23, 26 MessageBox – окно сообщения – 80 Microsoft.Win32 – библиотека – 124, 126 Min – минимум в массиве – 89 Mod – остаток от деления – 13 MontCalendar – компонент – 150 My.Settings – параметры приложения – 140 My.Settings.Save – сохранить параметры – 140 Namespace – оператор – 10 Net.Dns – класс – 135 NetBios-имя – 135 New – создает новый экземпляр класса – 18 NextDouble – метод класса Random – 18 Nothing – значение по умолчанию – 68, 71 NumericUpDown – компонент – 72, 73 OleDbCommand – класс – 102, 103, 104 OleDbConnection – класс – 102, 103, 104, 107, 111 OleDbDataAdapter – класс – 103, 111, 112, 146 OleDbDataReader – класс – 102, 104, 106, 107 OleDbException – класс – 102, 103 Open – параметр FileMode – 31, 46 OpenFile – функция – 69 OpenFileDialog – класс – 66, 67 OpenSubKey – открыть раздел реестра – 124

155

Option – оператор – 10, 21, 44 Option Explicit – оператор – 21 Order By – сортировка – 90, 99, 105 OsVersion – версия ОС – 124 OverflowException – тип исключения – 25, 27 Paint – событие – 76 PaintEventHandler – объявление функции обработки события – 76 PictureBox – поле рисунка – 51, 53, 54, 72 Platform – параметр OsVersion – 124 Process.GetProcesses – извлечь информацию – 125 ProcessorAffinity – свойство – 131 PropertyGrid – таблица параметров – 140 RadioButton – кнопки выбора – 51, 52, 57 Random – генератор случайных чисел – 18 Read – ввод данных – 31 Read – метод класса BinaryReader – 47 Read – параметр FileAccess – 46 Read – чтение данных – 107, 108 ReadBlock – ввод блока символов – 31 ReadBoolean – метод класса BinaryReader – 46 ReadByte – метод класса BinaryReader – 47 ReadChar – метод класса BinaryReader – 47 ReadDouble – метод класса BinaryReader – 47 ReadInt16 – метод класса BinaryReader – 47 ReadInt32 – метод класса BinaryReader – 47 ReadInt64 – метод класса BinaryReader – 47 ReadLine – ввод строки – 10, 18, 31 ReadOnlyChecked – свойство – 66 ReadSingle – метод класса BinaryReader – 47 ReadString – метод класса BinaryReader – 47 ReadToEnd – ввод до конца файла – 31 Refresh – обновить окно – 76 Reverse – перестановка элементов массива – 38 Rnd – функция – 18 RootFolder – параметр FolderBrowserDialog – 63 Round – функция – 18 Rows – строка таблицы – 146 SafeFileName – свойство OpenFileDialog – 66 SaveFileDialog – класс – 69, 70 Screen.PrimaryScreen.Bounds – 132 Select – запрос SQL – 105 Select – оператор выбора – 53 SelectCommand – конструктор – 112 SelectedPath – свойство – 64

156

SelectedIndex – свойство ListBox – 52, 55 SelectedIndex – свойство ComboBox – 53 Set – новые значения данных – 106 SetSelected – свойство ListBox – 55 Show – показать MessageBox – 87 ShowDialog – метод – 64, 65, 66, 67, 69, 70 ShowNewFolderButton – свойство – 63 ShowReadOnly – свойство – 66 Sign – функция «Знак числа» – 15 Sin – функция – 18 SizeMode – свойство PictureBox – 54, 72 Sort – сортировка массива – 38 Source – свойство класса Exception – 23 Sqrt – функция – 18 StackTrace – свойство класса Exception – 23 Str – функция – 12 StreamReader – класс – 31, 32 StreamWriter – класс – 28, 29 StretchImage – значение свойства PictureBox – 53 String – тип – 13, 15 Structure – запись – 99 Sum – сумма элементов массива – 89 System.Array – класс – 37 System.Data.OleDb – пространство имен – 103, 145 System.Diagnostics – пространство имен – 125 System.IO – пространство имен – 44, 63, 66, 67 System.IO – свойство – 28 System.IO.Directory – пространство имен – 63, 66, 72 System.IO.Path.GetFullPath – текущая папка – 108 System.Linq – пространство имен – 89 System.Linq.Xml – пространство имен – 89 System.Management – пространство имен – 126, 127, 132 System.UriBuilder – разбор URL – 134 TabControl – компонент – 118 Tables – таблица базы данных – 114 Tan – функция – 18 TargetSite – свойство класса Exception – 23 Text – свойство компонента – 50, 51 TextBox – поле ввода – 51, 52, 53 Throw – блок генерации исключения – 23 ToDouble – преобразование в вещественный тип – 15 ToInt32 – преобразование в целый тип – 15, 18 TopIndex – свойство ListBox – 55 ToString – преобразование в строковый тип – 15, 36, 53, 55 Try – блок операторов – 23, 24, 25

157

Update – обновление данных – 106, 113 Update – параметры команды – 116 UpdateCommand-Connection – поле – 113 UpdateCommand-CommandText – поле – 113 UpdateCommand – настройка в программе – 120 URL – разбор – 134 URL – свойства компонента HelpNavigator – 142 UserDomainName – имя домена – 135 UserName – текущий пользователь системы – 135 UserScopedSettingAttribute – атрибут параметров пользователя – 141 Using – начало блока операторов – 107, 108

Value – свойство NumericUpDown – 73 Version – параметр OsVersion – 124 Visible – свойство Button – 52 Visible – свойство PictureBox – 53 Visible – свойство DataGridView – 114 Where – инструкция запроса Linq – 90, 93 Where – инструкция запроса SQL – 103, 106, 113 While – цикл – 31, 32 Win32_ComputerSystem – запрос – 129, 131 Win32_ComputerSystemProduct – запрос 130 Win32_Environment – запрос – 126 Win32_LogicalDisk – запрос – 132 Win32_UserAccount – запрос – 127 Win32_VideoController – запрос – 132 Write – вывод в файл – 28, 29 Write – вывод на экран – 15, 18 WriteLine – вывод строки в файл – 28, 29 WriteLine – вывод строки на экран – 10, 18 WshNetWork – функция – 136 Zoom – значение свойства PictureBox – 54, 72

Адрес компьютера – IP-адреса – 136 Адрес корневой папки – Environment.SpecialFolder.MyComputer – 63 Атрибут параметров пользователя – UserScopedSettingAttribute – 141 Атрибут параметров приложения – ApplicationScopedSettingAttribute – 141 Библиотека – IWshRuntimeLibrary – 136 Библиотека – Microsoft.Win32 – 124, 126 Блок генерации исключения – Throw – 23 Блок операторов – Try – 23, 24, 25 Блок реакции на исключение – Catch – 23, 24, 25, 44 Ввод блока символов – ReadBlock – 31 Ввод данных – Read – 31

158

Ввод до конца файла – ReadToEnd – 31 Ввод строки – ReadLine – 10, 18, 31 Версия ОС – OsVersion – 124 Выбор строки – ComboBox – 51, 53, 57 Вывод в файл – Write – 28, 29 Вывод на экран – Write – 15, 18 Вывод списка – ListBox – 51, 52, 55, 56, 72, 73 Вывод строки в файл – WriteLine – 28, 29 Вывод строки на экран – WriteLine – 10, 18 Высота окна – ClientSize.Height – 77 Выход из Try-блока – Exit Try – 24

Генератор случайных чисел – Random – 18 Дата, время – DateTime – 124 Длина массива – Length – 38, 63, 77 Добавление массива строк в ListBox – AddRange – 126 Добавление строк в ListBox – Add – 56, 72, 90 Если пусто – IS NULL – 105 Загрузка рисунка – Drawing.Image.FromFile – 53 Закраска прямоугольника – FillRectangle – 81 Закраска сектора – FillPie – 84 Закрытие соединения – Close – 104, 107 Закрыть объект OleDbDataReader – Close – 107 Закрыть файл – Close – 29, 31, 44

– FileClose – 41 Записи без повторов – Distinct – 106 Запись – Structure – 99 Заполнение DataSet – Fill – 114, 146 Запрос – Linq – 89

– ManagementObjectSearcher – 126 – Win32_ComputerSystem – 129, 131 – Win32_ComputerSystemProduct – 130 – Win32_Environment – 126 – Win32_LogicalDisk – 132 – Win32_UserAccount – 127 – Win32_VideoController – 132

Запрос SQL – Select – 105 Значение по умолчанию – Nothing – 68, 71 Значение свойства PictureBox – StretchImage – 53

– Zoom – 54, 72

Извлечь данные – GetSubKeyNames – 126 – GetValue – 107, 124

Извлечь информацию – Process.GetProcesses – 125 Имя домена – UserDomainName – 135

159

Имя компьютера – DNS-имя – 135 – MachineName – 135 – NetBios-имя – 135

Имя-Dns – GetHostByName – 135 Инструкция запроса Linq – Where – 90, 93 Инструкция запроса SQL – Where – 103, 106, 113 Интервал – Between – 105 Исключение – IOException – 29

Класс – BinaryReader – 46, 47 – BinaryWriter – 43, 44 – Console – 18, 28 – Environment – 63 – Exception – 22, 23 – FileStream – 28, 31, 43 – FolderBrowserDialog – 63, 64 – IO.Directory – 63, 66, 72 – Net.Dns – 135 – OleDbCommand – 102, 103, 104 – OleDbConnection – 102, 103, 104, 107, 111 – OleDbDataAdapter – 103, 111, 112, 146 – OleDbDataReader – 102, 104, 106, 107 – OleDbException – 102, 103 – OpenFileDialog – 66, 67 – SaveFileDialog – 69, 70 – StreamReader – 31, 32 – StreamWriter – 28, 29 – System.Array – 37

Класс математических функций – Math – 15, 18 Класс преобразований – Convert – 15, 18, 54

– Encoding – 29, 68, 70 Ключевое слово – Dim – 13 Кнопки выбора – CheckBox – 51, 52, 57

– RadioButton – 51, 52, 57 Компонент – DataSet – 111, 113, 115

– HelpProvider – 142, 143 – MontCalendar – 150 – NumericUpDown – 72, 73 – TabControl – 118

Конструктор – DataGridView – 114 – InsertCommand – 112, 113 – SelectCommand – 112

Копирование массива – Copy – 38 Копирование массива – CopyTo – 38

Максимум в массиве – Max – 89 Массив без повторов – Distinct – 90

160

Метод – Console.ReadLine – 10 – Console.WriteLine – 10 – Drawing.Bitmap.FromFile – 117 – ExecuteReader – 104, 106 – GetCurrentProcess – 131 – GetDirectories – 63 – GetEncoding – 29, 68, 70 – GetFiles – 66, 72 – GetLogicalDrives – 63 – ShowDialog – 64, 65, 66, 67, 69, 70

Метод класса BinaryReader – Read – 47 – ReadBoolean – 46 – ReadByte – 47 – ReadChar – 47 – ReadDouble – 47 – ReadInt16 – 47 – ReadInt32 – 47 – ReadInt64 – 47 – ReadSingle – 47 – ReadString – 47 – NextDouble – 18

Минимум в массиве – Min – 89 Надпись – Label – 50, 51, 52, 53 Настройка в программе – DeleteCommand – 113

– UpdateCommand – 120 Начало блока операторов – Using – 107, 108 Новые значения данных – Set – 106 Обновить окно – Refresh – 76 Обновление данных – Update – 106, 113 Объявление функции обработки события – PaintEventHandler – 76 Окно сообщения – MessageBox – 80 Оператор – For-Next – 16

– If-End If – 13, 14 – Imports – 10, 28, 65 – IsNot – 68, 71, 73 – Namespace – 10 – Option – 10, 21, 44 – Option Explicit – 21 – Select – 53

Описание таблицы Excel – GetOleDbSchemaTable – 146 Остаток от деления – Mod – 13 Открыть раздел реестра – OpenSubKey – 124 Открыть файл – FileOpen – 40 Отображение данных – DataGridView – 111 Очистка ListBox – Clear – 38, 72

161

Папка запуска программы – Application.StartUpPath – 117 Параметр FileAccess – Read – 46 Параметр FileMode – Append – 28

– CreateNew – 43 – Open – 31, 46

Параметр FolderBrowserDialog – RootFolder – 63 Параметр OsVersion – Platform – 124

– Version – 124 Параметр открытия файла – FileAccess – 46

– FileMode – 28, 31, 43, 46 Параметр сортировки – Ascending – 90

– Descending – 90, 99 Параметры команды – Update – 116 Параметры приложения – My.Settings – 140 Первое появление в массиве – First – 89 Перестановка элементов массива – Reverse – 38 По убыванию – Desc – 105 Поверхность – Graphics – 76 Поиск позиции в массиве – BinarySearch – 38

– IndexOf – 38 – LastIndexOf – 38

Показать MessageBox – Show – 87 Поле – UpdateCommand-CommandText – 113

– UpdateCommand-Connection – 113 Поле ввода – TextBox – 51, 52, 53 Поле рисунка – PictureBox – 51, 53, 54, 72 Последнее появление в массиве – Last – 89 Преобразование в вещественный тип – ToDouble – 15 Преобразование в строковый тип – ToString – 15, 36, 53, 55 Преобразование в целый тип – ToInt32 – 15, 18 Прерывание цикла – Exit For – 40 Принадлежность списку – IN – 105 Пространство имен – System.Data.OleDb – 103, 145

– System.Diagnostics – 125 – System.IO – 44, 63, 66, 67 – System.IO.Directory – 63, 66, 72 – System.Linq – 89 – System.Linq.Xml – 89 – System.Management – 126, 127, 132

Процедура – Main – 11 Прямая – DrawLine – 77 Прямоугольник – DrawRectangle – 77, 81 Разбор – URL – 134 Разбор URL – System.UriBuilder – 134 Размер массива – Count – 89

162

Результат диалога – DialogResult.OK – 64 Рисовать сектор – DrawPie – 84 Рисовать строку – DrawString – 76 Свободный номер файла – FreeFile – 40 Свойства компонента HelpNavigator – URL – 142 Свойство – Console.Error – 28

– Console.In – 28 – Console.Out – 28 – Enabled – 58, 58, 149 – FileName – 68 – InitialDirectory – 66, 67 – ProcessorAffinity – 131 – ReadOnlyChecked – 66 – Screen.PrimaryScreen.Bounds – 132 – SelectedPath – 64 – ShowNewFolderButton – 63 – ShowReadOnly – 66 – System.IO – 28

Свойство Button – Image – 53 – Visible – 52

Свойство CheckBox – Checked – 52 Свойство ComboBox – SelectedIndex – 53 Свойство DataGridView – Visible – 114 Свойство ListBox – BeginUpdate – 57

– EndUpdate – 56 – GetSelected – 55 – SelectedIndex – 52, 55 – SetSelected – 55 – TopIndex – 55

Свойство NumericUpDown – Value – 73 Свойство OpenFileDialog – Filter – 67

– FilterIndex – 66 – SafeFileName – 66

Свойство PictureBox – Image – 52, 53 – SizeMode – 54, 72

Свойство PictureBox – Visible – 53 Свойство SaveFileDialog – Filter – 69

– FilterIndex – 69 Свойство Timer – Interval – 149 Свойство класса Exception – HelpLink – 23

– Hresult – 23 – InnerException – 23 – Message – 22, 23, 26 – Source – 23 – StackTrace – 23

163

– TargetSite – 23 Свойство компонента – ApplicationSettings – 138, 139

– Text – 50, 51 Свойство компонента HelpProvider – HelpKeyWord – 142

– HelpNameSpace – 142 – HelpNavigator – 142

Свойство строки – MeasureString – 76 Событие – Button.Click – 65

– FormClosing – 115 – Paint – 76

Совпадает – Equals – 15, 93 Содержит подстроку – Contains – 93 Создает новый экземпляр класса – New – 18 Сортировка – Order By – 90, 99, 105 Сортировка массива – Sort – 38 Сохранить параметры – My.Settings.Save – 140 Сравнение – CompareTo – 15 Среднее арифметическое – Average – 89 Строка таблицы – Rows – 146 Строки списка ComboBox – Items – 53 Строки списка ListBox – Items – 52, 72, 73, 124, 126 Сумма элементов массива – Sum – 89

Таблица базы данных – Tables – 114 Таблица параметров – PropertyGrid – 140 Текущая папка – System.IO.Path.GetFullPath – 108 Текущий пользователь системы – UserName – 135 Тип – Double – 13, 38

– Integer – 13 – String – 13, 15

Тип исключения – ArgumentException – 27 – ArithmeticException – 27 – ArrayTypeMismatchException – 27 – DivideByZeroException – 25, 27 – EndOfStreamException – 32, 48 – FileNotFoundException – 32, 48 – IndexOutOfRangeException – 25, 27 – OverflowException – 25, 27

Управляющая кнопка – Button – 51, 52 Форма – Form – 51 Формат преобразования в строковый тип – Format – 15, 150 Функция – Cos – 18

– OpenFile – 69 – Rnd – 18 – Round – 18

164

– Sin – 18 – Sqrt – 18 – Str – 12 – Tan – 18 – WshNetWork – 136

Функция «Знак числа» – Sign – 15 Хранение данных – DataSet – 102, 103, 117, 146 Цвет закраски – Brushes – 83 Цвет кисти – Drawing.Brushes – 76 Цикл – For Each – 39 Цикл – While – 31, 32

Число строк ListBox – Count – 53, 72 Чтение данных – Read – 107, 108 Шаблон запроса – Like – 105 Ширина окна – ClientSize.Width – 76, 77 Шрифт – Font – 51, 76

165

Учебное издание

Владимир Викторович Балабошкин Ольга Петровна Кныш

ОСНОВЫ ПРОГРАММИРОВАНИЯ:

MICROSOFT VISUAL BASIC

Учебное пособие

***

Редактор И. Г. Кузнецова

***

Подписано к печати ___.___. 20__ Формат 60х90 1/16. Бумага писчая

Оперативный способ печати Гарнитура Times New Roman Усл.п.л. ____, уч.-изд.л. _____

Тираж 100 экз. Заказ № ___ Цена договорная

Издательство СибАДИ 644099, г.Омск, ул. П. Некрасова, 10

———————————————————————— Отпечатано в подразделении ОП издательства СибАДИ


Recommended