Книга представляет собой идеальной пособие всем, кто хотел бы освоить интегрированную среду разработки приложений Visual Basic.NET. Автор постарался охватить все современные программные технологии разработки приложений при помощи Visual Basic и проиллюстрировать их возможности на практических примерах. В книге подробно рассмотрены основы языка VB.NET, проектирование визуального интерфейса приложений, управление файлами, обработка графической информации, технология NET.Framework, создание распределенных приложений на ASP.NET, а также использование ADO.NET для разработки Web-приложений.
Содержание
Благодарности
Введение
ЧАСТЬ 1. Основы
Глава 1. Знакомство с VB .NET
Интегрированная среда разработки
Типы проектов
Создание простого приложения
Как сделать приложение более надежным
Как сделать приложение более дружественным
Компоненты IDE
Меню IDE
Окно Solution Explorer
Окно Properties
Окно Command
Окно Task List
Настройка интегрированной среды разработки
Часто используемые свойства
Часто используемые события
Часто используемые методы
Создание консольного приложения
Резюме
Глава 2. Проекты Visual Basic
Разработка приложения LoanCalculator
Работа приложения LoanCalculator
Разработка пользовательского интерфейса
Программирование приложения расчета по займу
Проверка данных
Построение приложения MathCalculator
Разработка пользовательского интерфейса
Программирование приложения MathCalculator
Средства отладки
Дополнительные средства
Перехват ошибок
Приложение LoanCalculator для Web
Исполняемые файлы
VB .NET в работе: создание программы инсталляции для Windows
Резюме
Глава 3. Visual Basic: описание языка
Переменные
Объявление переменных
Типы переменных
Тип данных Byte
Переменные типа Boolean
Строковые переменные
Символьные переменные
Переменные типа Date
Идентификаторы типа данных
Переменные типа Object
Преобразование типов переменных
Контроль точности при преобразовании типов
Типы данных, определяемые пользователем
Проверка типов переменных
Число или строка?
Принудительное объявление переменных
Область видимости переменной
Время жизни переменной
Константы
Массивы
Объявление массивов
Инициализация массивов
Границы массива
Многомерные массивы
Динамические массивы
Ключевое слово Preserve
Массивы массивов
Переменные как объекты
Определение объектов
Форматирование данных
Коды стандартного форматирования
Строки форматирования
Форматирование дат
Управление выполнением программы
Резюме
Глава 4. Процедуры
Модульное программирование
Подпрограммы
Функции
Вызов функций и подпрограмм
Аргументы
Механизм передачи параметров
Аргументы обработчика событий
Передача произвольного числа аргументов
Именованные аргументы
Пользовательские типы данных, возвращаемых функцией
Перегрузка функций
Резюме
Глава 5. Работа с формами
Внешний вид форм
Свойства элемента управления Form
Размещение элементов управления в форме
Последовательность перехода посредством нажатия клавиши табуляции
VB .NET в работе: проект Contacts
Применение свойств Anchor и Dock
События объекта Form
Загрузка формы и вывод ее на экран
Начальная форма
Управление одной формой из другой
Формы и диалоговые окна
VB .NET в работе: проект MultipleForms
Разработка меню
Редактор меню
Свойства объекта MenuItem
Управление меню во время выполнения приложения
Просмотр элементов меню
Создание динамических форм во время выполнения приложения
Семейство Form.Controls
VB .NET в работе: проект DynamicForm
Создание обработчиков событий во время выполнения приложения
Резюме
Глава 6. Основные элементы управления Windows
Элемент TextBox
Основные свойства
Свойства для обработки текста
Выделение текста
Методы для работы с выделенным текстом
Восстановление текста после редактирования
VB .NET в работе: проект TextPad
Перехват нажатий клавиш
Элементы управления ListBox, CheckedListBox и ComboBox
Основные свойства
Семейство Items
VB .NET в работе: проект ListDemo
Поиск
VB .NET в работе: проект ListBoxFind
Элемент управления ComboBox
Элементы управления ScrollBar и TrackBar
Элемент управления ScrollBar
VB .NET в работе: проект Colors
Элемент управления TrackBar
VB .NET в работе: проект Inches
VB .NET в работе: проект TextMargin
Резюме
Глава 7. Усовершенствованные элементы управления Windows
Стандартные диалоговые окна
Стандартные диалоговые окна Open и Font
Использование стандартных диалоговых элементов управления
Диалоговое окно Color
Диалоговое окно Font
Диалоговые окна Open и Save As
VB .NET в работе: методы OpenFile и SaveFile
VB .NET в работе: выборка множества файлов
Диалоговое окно Print
Элемент управления RichTextBox
VB .NET в работе: проект RTFDemo
RTF-код
Свойства элемента управления RichTextBox
Методы элемента управления RichTextBox
Дополнительные возможности форматирования
Копирование и вставка текста
Поиск в элементе управления RichTextBox
Форматирование URL
VB .NET в работе: проект RTFPad
Резюме
ЧАСТЬ 2. Создание собственных объектов
Глава 8. Создание пользовательских классов
Что такое класс
Создание класса Minimal
"Настоящий" класс
Инкапсуляция и абстракция
Наследование
Наследование существующих классов
Полиморфизм
Конструкторы и деструкторы объектов
Кто и что может наследовать
Ключевые слова для членов производных классов
Ключевые слова MyBase и MyClass
Резюме
Глава 9. Создание пользовательских элементов управления
Разработка элементов управления Windows
Расширение функций существующих элементов управления
Создание элемента управления FocusedTextBox
Создание составных элементов управления
VB .NET в работе: элемент управления ColorEdit
Создание элементов управления с пользовательским представлением
VB .NET в работе: элемент управления Label3D
Как генерируются события
Использование пользовательского элемента управления в других проектах
VB .NET в работе: элемент управления Alarm
Разработка элементов управления нестандартной формы
Рисование на стандартных элементах управления
Формирование изображения элементов меню
Формирование изображения элементов списка
Использование элементов управления ActiveX
Резюме
Глава 10. Автоматизация приложений Microsoft Office
Программирование Word
Объекты, представляющие текст
Семейство Documents и объект Document
Проверка правописания
Программирование Excel
Семейство Worksheets и объект Worksheet
Объект Range
Использование математического аппарата Excel
Программирование Outlook
Извлечение информации
Рекурсивное сканирование папки Contacts
Резюме
ЧАСТЬ 3. Базовые рабочие классы
Глава 11. Хранение данных в семействах
Дополнительные возможности массивов
Сортировка массивов
Поиск элементов в массивах
Другие операции с массивами
Ограничения массивов
Семейство ArrayList
Создание семейства ArrayList
Добавление и удаление элементов
Семейство HashTable
VB .NET в работе: проект WordFrequencies
Класс SortedList
Другие семейства
Интерфейсы IEnumerator и IComparer
Перебор элементов семейств
Пользовательская сортировка
Пользовательская сортировка семейства SortedList
Класс Serialization
Сохранение отдельных объектов
Сохранение семейства
Восстановление объектов
Резюме
Глава 12. Работа со строками, символами и датами
Обработка строк и символов
Класс Char
Класс String
Класс StringBuilder
VB .NET в работе: проект StringReversal
VB .NET в работе: проект CountWords
Обработка дат
Класс DateTime
Класс TimeSpan
VB .NET в работе: фиксация времени
Резюме
Глава 13. Работа с файлами и папками
Доступ к файлам и папкам
Класс Directory
Класс File
Класс DirectoryInfo
Класс FileInfo
Класс Path
VB .NET в работе: проект CustomExplorer
Доступ к содержимому файлов
Объект FileStream
Объект StreamWriter
Объект StreamReader
Запись данных в файл
Объект BinaryWriter
Объект BinaryReader
VB .NET в работе: проект RecordSave
Компонент FileSystemWatcher
Свойства
События
VB .NET в работе: проект FileSystemWatcher
Резюме
ЧАСТЬ 4. Программирование вспомогательных элементов
Глава 14. Графика в Visual Basic
Вывод изображений
Объект Image
Копирование изображений через буфер обмена
Рисование при помощи GDI+
Базовые графические объекты
Рисование геометрических фигур
Графические методы
Градиенты
Вырезание
Преобразование координат
Типы преобразования координат
VB .NET в работе: построение графиков функций
Растровые изображения
Определение цветов
Установка значений цветов
Обработка растровых изображений
Резюме
Глава 15. Печать в VB .NET
Объекты, связанные с печатью
PrintDocument
PrintDialog
PageSetupDialog
PrintPreviewDialog
PrintPreviewControl
Свойства принтера и страницы
Геометрия страницы
Примеры печати
Печать табличных данных
Печать простого текста
Печать растровых изображений
Использование элемента управления PrintPreviewControl
Резюме
Глава 16. Обработка ошибок и отладка
Типы ошибок
Ошибки времени разработки
Ошибки времени выполнения
Логические ошибки
Исключения и структурированная обработка исключений
Исследование исключения
Как обработать это исключение
Блок Finally
Настройка обработки ошибок
Создание собственных исключений
Отладка
Точки останова
Пошаговое выполнение программы
Окна Locals и Watch
Резюме
Глава 17. Рекурсивное программирование
Основные понятия
Рекурсия вокруг нас
Простой пример
Ошибочная рекурсия
Рекурсивный просмотр папок
Описание рекурсивной процедуры
Написание реального кода
Как работает стек
Организация стека
Рекурсивное программирование и стек
Передача параметров с помощью стека
Особые случаи, возникающие при использовании рекурсивных методов
Программа, которая никогда не завершится
Когда следует использовать рекурсивные методы
Резюме
ЧАСТЬ 5. Программирование баз данных в VB .NET
Глава 18. Базы данных: архитектура и концепции
Что такое база данных
Реляционные базы данных
База данных Northwind
Понятие отношений
Server Explorer
Работа с таблицами
Отношения, индексы и ограничения
Structured Query Language
Выполнение SQL-инструкций
Запросы на выборку
Вычисляемые поля
Объединения SQL
Запросы на обновление
Query Builder
Интерфейс Query Builder
SQL в работе: вычисление сумм
SQL в работе: подсчет строк
Отбор строк
Запросы с параметрами
Вычисляемые столбцы
Определение левого, правого и внутреннего объединений
Хранимые процедуры
Резюме
Глава 19. Разработка приложений баз данных с помощью ADO .NET
Архитектура ADO .NET
А что же XML?
Создание объекта DataSet
Элемент управления DataGrid
Вывод связанных таблиц
Связывание данных
VB .NET в работе: проект ViewEditCustomers
Связывание сложных элементов управления
Программное управление объектом DataAdapter
Объект Command
Объекты Command и DataReader
VB .NET в работе: проект DataReader
VB .NET в работе: проект StoredProcedure
Резюме
Глава 20. Программирование объектов ADO .NET
Структура объекта DataSet
Навигация по таблицам объекта DataSet
Обновление объекта DataSet
Мастер DataForm
Работа с полями типа Identity
Транзакции
Обновление данных
Версии данных объекта DataRow
Состояния объекта DataRow
Обновление таблиц вручную
Создание и использование пользовательских объектов DataSet
Резюме
Алфавитный указатель
ОТРЫВОК
Проекты Visual Basic
В предыдущей главе были рассмотрены средства разработки Visual Studio .NET, основные элементы управления и принципы событийного программирования. В этой главе мы продолжим изучение средств разработки, построив несколько новых приложений с помощью Visual Basic.
Наша цель - на примере простых приложений научить вас использовать основные конструкции языка. И хотя программные коды этих приложений несложны, они демонстрируют способы создания пользовательского интерфейса, методы проверки данных и обработки ошибок.
Начинающий программист скажет, что сначала следует написать простое, но работающее приложение, а проверку данных можно оставить на потом. Однако продумать способ проверки данных и обработки ошибок программного кода никогда не рано. Для безотказной работы приложения в него необходимо ввести дополнительный программный код, помимо фактически используемого. Правильно сконструированное приложение обнаруживает и обрабатывает все ошибки, в том числе и ошибки пользователя. В настоящей главе рассмотрены основные принципы обработки ошибок (error handling), примен
яемые в простейших приложениях.
Разработка приложения LoanCalculator
Простое и практичное приложение LoanCalculator предназначено для расчета параметров займа. Разработка этого приложения состоит из следующих этапов:
1. Принятие решения о том, что именно должно делать приложение и как оно будет взаимодействовать с пользователем.
2. Разработка пользовательского интерфейса.
3. Написание программного кода.
Работа приложения LoanCalculator
На первом этапе примем решение: пользователь должен иметь возможность указывать сумму займа, процент по нему и срок займа (в месяцах). Для ввода этих значений необходимо предусмотреть в приложении три поля.
Следует каким-то образом указать, вносится платеж в начале или в конце месяца. Ввод информации типа Yes/No или True/False удобно осуществлять путем использования элемента CheckBox, работающего как переключатель. Его установка и сброс происходят в результате щелчка кнопкой мыши. Вводить данные в этот элемент не нужно (установка флажка - простейший способ задания одного из двух возможных значений). На рис. 2.1 показано окно пользовательского интерфейса, соответствующее предъявляемым требованиям. Представленная форма является главной формой проекта LoanCalculator, который хранится в папке настоящей главы на компакт-диске.
После ввода информации в форму щелкните на кнопке Show Payment. Приложение рассчитает месячные платежи и отобразит их в тестовом поле формы. Все действия выполняются подпрограммой обработки события Click кнопки. Функцию расчета месячных платежей именуют Pmt(). Она вызывается так:
MonthlyPayment = Pmt(InterestRate, Periods, Amount, _
FutureValue, Due)
Процент по займу (переменная InterestRate) указывается помесячно. Если процент составляет 16,5, то значение переменной равно 0,165/12. Срок займа в месяцах задается переменной Periods, а сумма займа - переменной Amount. Значение переменной FutureValue (будущее значение займа) равняется 0 (при инвестициях это положительное значение). Последний параметр, Due, указывает срок выплаты. Если он равен 0, платежи поступают в начале месяца, если 1 - в конце.
Значением Due может быть одна из констант - DueDate.BegOfPeriod либо DueDate.EndOfPeriod. Упомянутые константы являются встроенными, ими можно пользоваться, даже не зная их точного значения. В этом и заключается особенность применения именованных констант: достаточно задать только имя константы, и VB сам установит для нее нужное числовое значение. Позже вы увидите, что .NET использует различные константы, которые объединены в группы, называемые перечислениями. Константы, которые применяются в качестве аргумента Due функции Pmt(), принадлежат перечислению DueDate, состоящему из двух
элементов - BegOfPeriod и EndOfPeriod.
Текущее значение займа равно отрицательному значению суммы займа. Это обусловлено тем, что в настоящий момент вы еще не получили деньги, а только собираетесь их занять, так что они пока принадлежат банку. Конечное значение займа равно нулю и отображает стоимость займа после его погашения, то есть сумму, которую вы должны банку (или банк вам) по окончании указанного периода.
Pmt() - это встроенная функция, рассчитывающая месячные платежи на основе пяти значений, указанных в скобках. Значения, передаваемые функции, называют аргументами. Они необходимы функции (процедуре или подпрограмме) для выполнения действий, например, проведения расчетов. Передавая функции разные значения, можно рассчитать параметры различных займов. Функция Pmt() и другие финансовые функции Visual Basic описаны в Приложении А "Встроенные функции" прилагаемого компакт-диска.
Чтобы использовать функцию Pmt(), не нужно знать, как она выполняет расчет платежей. Достаточно того, что она сообщает результат. Для расчета месячных платежей по займу в 25000$ под 14,5% на 48 месяцев при выплатах в последний день месяца можно использовать функцию Pmt():
Console.WriteLine(Pmt(0.145 / 12, 48, -25000, 0, DueDate.EndOfPeriod))
Тогда в окне проверки отобразится значение 689,448821287218 (ниже показано, как ограничить число десятичных знаков двумя - для расчета денежных сумм этого достаточно). Обратите внимание на знак "минус" перед значением суммы. Если его не ввести, результат будет отрицательным. Противоположные знаки значений платежа и займа указывают на противоположные направления денежных потоков. Последние два аргумента функции Pmt() являются необязательными. Если их опустить, то они будут равны нулю. В таком случае вызов функции Pmt() имеет вид
Console.WriteLine(Pmt(0.145 / 12, 48, -25000))
Расчет суммы месячных платежей, заданных параметрами займа, достаточно прост. Все, что нужно знать и понимать - это параметры займа и метод их передачи функции Pmt(). Также необходимо иметь представление о том, как указать процент по займу, чтобы избежать неверных значений. А вот как выполняются расчеты, знать необязательно - Visual Basic выполнит эту работу сам.
Разработка пользовательского интерфейса
После ознакомления с методами расчета месячных платежей можно приступать к разработке пользовательского интерфейса. Для этого создайте новый проект, назовите его LoanCalculator (что значит расчеты по займу), а входящую в него форму - LoanForm. Форму и файлы проекта вы найдете на прилагаемом компакт-диске в папке данной главы.
Выберите шрифт и его размер для текста элементов формы. Хотя мы не собираемся ничего отображать в форме, все ее элементы будут использовать тот же шрифт, что и сама форма. В данном случае форма - это контейнер для элементов. В дальнейшем шрифт элементов можно будет изменить, но разумнее выбрать подходящий шрифт сразу. Не выравнивайте элементы, если планируете изменять их шрифты - замена шрифта нарушит выравнивание.
В приложении расчетов по займу, входящем в компакт-диск, используется шрифт Verdana размером 10 пунктов. Чтобы заменить его, выберите форму с помощью мыши и выполните двойной щелчок на имени свойства Font в окне свойств. Отобразится диалоговое окно Font, в котором можно задать шрифт и его атрибуты.
Рассмотрим конструирование формы (рис. 2.1).
1. Разместите в форме четыре надписи (элемента Label) и установите следующие значения их свойств Text.
Элемент управления Значение свойства Text
Label1 Loan Amount (Сумма займа)
Label2 Duration (months) (Срок в месяцах)
Label3 Interest Rate (Процент по займу)
Label4 Monthly Payment (Месячная плата)
Размер надписей должен быть таким, чтобы поместился весь текст. Изменять стандартные имена элементов Label нет необходимости, поскольку для пользователя будет достаточно отображаемого на них текста, а снабжать эти элементы кодом мы не будем.
2. Возле каждого элемента Label расположите элемент TextBox. Присвойте значения их свойствам Name и Text так, как показано в таблице.
Элемент управления Значение свойства Name Значение свойства Text
TextBox1 txtAmount 25000
TextBox2 txtDuration 48
TextBox3 txtRate 14,5
TextBox4 txt Payment
3. В четвертом элементе TextBox4 будет храниться значение месячной платы. Чтобы пользователь не смог вводить никаких данных в этот элемент, нужно присвоить его свойству ReadOnly значение True. В отличие от пользователей вы должны иметь возможность изменять значение этого свойства в коде. (Мы, конечно, могли задействовать элемент Label, но применение TextBox является более предпочтительным.)
4. Далее поместите в форму элемент CheckBox. По умолчанию значение свойства Text этого элемента - CheckBox1. Оно отображается справа от флажка. Поскольку мы хотим поместить все надписи слева, стандартный вид этого элемента следует изменить.
5. Выделите элемент CheckBox1 (если до этого он не был выбран) и в окне Properties найдите свойство CheckAlign. По умолчанию его значением является MiddleLeft. Открыв меню, вы увидите, что это свойство имеет различные установки, обозначенные прямоугольниками и квадратами. Щелкните на среднем квадрате в правой колонке. После этого на нем в списке свойств появится значение MiddleRight. Первая составляющая значения MiddleRight свойства CheckAlign отвечает за выравнивание элемента CheckBox1 по вертикали, а вторая - по горизонтали. Значение MiddleRight указывает, что элемент CheckBox1 должен быть отцентрирова
н по вертикали и выровнен по правому краю по горизонтали.
6. Выберите элемент CheckBox1, в окне свойств найдите свойство Name и присвойте ему значение chkPayEarly.
7. Измените текст CheckBox1, введя строку Early Payment в поле свойства Text.
8. Поместите элемент Button в нижнем левом углу формы. Назовите эту кнопку bttnShowPayment и отобразите на ней текст Show Payment.
9. И наконец, поместите еще один элемент Button в форму и назовите эту кнопку bttnExit, присвоив свойству Text значение Exit.
Выравнивание элементов
Теперь выровняйте элементы формы. Однако сначала убедитесь, что текст внутри элементов Label виден полностью. Подписи довольно длинные, и, если длина элемента недостаточна, текст может перейти на вторую строку и стать частично невидимым (рис. 2.2).
Совет. Обязательно убедитесь в достаточной длине элементов Label, особенно при использовании нестандартного шрифта. Компьютер может заменить нестандартный шрифт другим. Тогда длина соответствующих надписей увеличится.
Для выравнивания элементов формы LoanForm в Visual Basic применяют команды меню Format.
1. Посредством мыши выделите в форме четыре элемента Label и выровняйте их по левому краю, вызвав команду Format | Align | Lefts. Маркеры всех выделенных элементов управления, кроме одного, будут белыми. Элемент управления, выделенный последним, будет иметь черные маркеры. Относительно этого элемента выравниваются все элементы управления с белыми маркерами. Запомните, что элемент управления, который будет использован как базовый для выравнивания других элементов, следует выделять последним. (Удерживая нажатой клавишу [Ctrl], вы можете выбрать с помощью мыши несколько
элементов управления.)
2. Выберите четыре текстовых поля и выровняйте их по левому краю командой Left подменю Align меню Format. Флажок CheckBox1 при этом не должен быть установлен.
3. Отметив все четыре поля, выровняйте их относительно флажка.
Созданная форма показана на рис. 2.1. Внимательно просмотрите ее и проверьте выравнивание элементов. При создании интерфейса разработчики нередко пренебрегают такими мелочами, как выравнивание, но пользователи их замечают.
Программирование приложения расчета по займу
Запустите приложение и проверьте его работу. Введите несколько значений в поля, установите или сбросьте флажок, проверьте работу встроенных в приложение функциональных средств. До тех пор, пока в приложении отсутствует программный код, щелкать на кнопке бесполезно. Если пользовательский интерфейс вас устраивает, остановите приложение, откройте форму и выполните двойной щелчок на кнопке Show Payment. Откроется окно кода с тремя строками обработчика события Click кнопки ShowPayment.
Private Sub bttnShowPayment_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles bttnShowPayment.Click
End Sub
Выше приведено объявление обработчика события нажатия кнопки Show Payment. Этот код вызывается щелчком на кнопке Show Payment. Над строками объявления обработчика события можно увидеть следующие две строки:
Public Class LoanForm
Inherits System.Windows.Forms.Form
Первая строка создает новый класс для формы проекта, вторая наследует функциональность формы. Эти строки автоматически генерируются интегрированной средой разработки при вставке формы и вносить в них изменения нельзя. Узнав больше о классах и наследовании во второй части книги, вы лучше поймете смысл данных строк.
Поместите указатель между строками Private Sub и End Sub и введите остальные строки кода из листинга 2.1 (Вы не должны дважды вводить первую и последнюю строки, которые содержат объявление обработчика событий.)
Листинг 2.1. Кнопка Show Payment
Private Sub bttnShowPayment_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles bttnShowPayment.Click
Dim Payment As Single
Dim payEarly As DueDate
If chkPayEarly.Checked Then
payEarly = DueDate.BegOfPeriod
Else
payEarly = DueDate.EndOfPeriod
End If
Payment = Pmt(0.01 * txtRate.Text / 12, txtDuration.Text, _
-txtAmount.Text, 0, payEarly)
txtPayment.Text = Payment.ToString("#.00")
End Sub
Окно кода показано на рис. 2.3. Обратите внимание на символ подчеркивания в конце длинной строки: он позволяет разбить одну строку на несколько частей для облегчения просмотра. Подобное соглашение используется в тексте книги для печати длинных строк. Этот же оператор может быть задан одной строкой кода.
Для перевода строки (когда она становится слишком длинной при вводе кода в окне редактора) не обязательно нажимать клавишу [Enter]. Откройте меню Edit и выберите команду Advanced | Word Wrap. По мере необходимости редактор будет автоматически переводить строку. О том, что режим автоматической верстки строк активен, свидетельствует флажок рядом с именем команды Edit | Advanced | Word Wrap. Чтобы отключить данный режим, вызовите эту команду еще раз.
В первой строке кода листинга 2.1 объявляется переменная Payment. Тип переменной указывает, что она используется для хранения чисел с плавающей запятой. Во второй строке объявляется переменная типа DueDate. Данный тип определяет, когда осуществляется плата - в начале либо в конце месяца. Последним аргументом функции Pmt() должна быть переменная того же типа. Ранее в этой главе уже упоминалось, что DueDate является перечислением с двумя значениями: BegOfPeriod и EndOfPeriod. Это означает, что последним аргументом функции Pmt() может быть одно из следующих значений:
DueDate.BegOfPeriod
DueDate.EndOfPeriod
Первой выполняемой строкой кода является оператор If, который осуществляет проверку состояния элемента CheckBox. Если флажок установлен, переменной payEarly присваивается значение DueDate.BegOfPeriod. В противном случае этой же переменной присваивается значение DueDate.EndOfPeriod. Когда флажок установлен, свойство Checked флажка возвращает значение True, если нет - значение False. После присвоения значения переменной payEarly вызывается функция Pmt(), которой передаются в качестве аргументов значения элементов формы.
* Первый аргумент - процент по займу. Так как функция Pmt() может принимать только значения, не превышающие 1, то значение, введенное в поле txtRate, умножается на 0,01. Следовательно значение 14,5 (процент по займу) передается в функцию Pmt() как 0,145. Это значение потом делится на 12 для указания значения месячного процента по займу.
* Второй аргумент - срок погашения займа (в месяцах). Его значение вводится в поле txtDuration.
* Третий аргумент - сумма займа - значение, введенное в поле txtAmount.
* Четвертый аргумент - будущее значение займа - по определению равен нулю.
* Последний аргумент - переменная payEarly, которая получает значение в соответствии со статусом элемента chkPayEarly.
Следующие два оператора преобразуют числовое значение, которое возвращает функция Pmt(), в строку и отображают эту строку в поле элемента TextBox4. Результат форматируется в соответствии с такими параметрами:
Payment.ToString("#.00")
Переменная Payment является числовой, а ко всем числовым значениям может быть применен метод ToString, преобразующий их в строку. Символ # используется для форматирования целой части переменной. Дробная часть округляется до сотых и отделяется от целой части посредством точки. Возвращаемое функцией Pmt() точное значение, скажем 372,2235687646345, перед отображением следует округлить и отформатировать. Поскольку банк не может выплатить сумму меньше цента, такая высокая точность здесь ни к чему. Достаточно указать число с точностью до сотых. Более подробная информация о ф
орматировании числовых (и других) значений содержится в главе 3.
Для отображения возвращаемого функцией Pmt() значения непосредственно в поле элемента txtPayment используйте следующий код:
txtPayment.Text = Pmt(0.01 * txtRate.Text / 12, txtDuration.Text, _
-txtAmount.Text, 0, payEarly)
Приведенная строка присваивает значение, возвращаемое функцией Pmt(), свойству Text элемента управления. Месячная плата отображается в десятичном формате с четырьмя десятичными знаками после запятой (учтите, что этот формат - не самый удачный для отображения денежных значений в долларах).
Совет. Старайтесь всегда использовать метод ToString (либо функцию Format()) для отображения результатов числовых вычислений, так как в большинстве случаев не требуется слишком высокая точность, предусмотренная в Visual Basic. Чаще всего достаточно нескольких цифр после запятой. Помимо обработки числовых значений, метод ToString можно применять для форматирования значений даты и времени. Возможности форматирования метода ToString детальнее обсуждаются в главе 12, а функция Format() описывается в разделе "Функции и операторы VB .NET" на компакт-диске.
Код проекта LoanCalculator на компакт-диске значительно длиннее приведенного здесь. Оператор, рассмотренный в последнем разделе, составляет ту часть проекта, которая необходима для расчета. Пользователь может вводить в элементы формы любые значения, даже те, которые способны "подвесить" программу. В следующем разделе рассмотрены методы проверки корректности данных, введенных пользователем, и методы перехвата и обработки ошибок, позволяющие исправить ошибку ввода и продолжить работу.
Проверка данных
Ввод нечислового значения в поле может привести к аварийному останову программы. В таком случае отобразится сообщение об ошибке. Если в поле txtDuration ввести строку "twenty", то программа выведет сообщение об ошибке (рис. 2.4). Выполнение программы могут прервать и простейшие ошибки ввода. Разумеется, такая работа приложения Windows неприемлема. Приложение должно иметь средства обработки большинства ошибок и информировать о них пользователя. Если ошибка пользователя пройдет незамеченной, то приложение внезапно прекратит работу или без предупреждения выдаст неве
рный результат.
Щелкните на кнопке Break, чтобы открыть окно кода приложения. В приложении должна быть предусмотрена защита от любой ошибки пользователя. Один из методов, позволяющих избежать ошибок ввода, - проверка корректности числовых значений каждого элемента, а в случае ошибки - вывод соответствующего сообщения с предложением повторного ввода. Ниже приведена модифицированная подпрограмма bttnShowPayment_Click(), проверяющая значения каждого поля до начала расчетов.
Листинг 2.2. Модифицированная подпрограмма bttnShowPayment_Click
Private Sub bttnShowPayment_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles bttnShowPayment.Click
Dim Payment As Single
Dim LoanIRate As Single
Dim LoanDuration As Integer
Dim LoanAmount As Integer
'Проверка допустимых значений
If IsNumeric(txtAmount.Text) Then
LoanAmount = txtAmount.Text
Else
MsgBox("Please enter a valid amount ")
Exit Sub
End If
'Проверка величины процента
If IsNumeric(txtRate.Text) Then
LoanIRate = 0.01 * txtRate.Text / 12
Else
MsgBox("Invalid interest rate, please re-enter ")
Exit Sub
End If
'Проверка сроков займа
If IsNumeric(txtDuration.Text) Then
LoanDuration = txtDuration.Text
Else
MsgBox("Please specify the loan's duration as a number of months ")
Exit Sub
End If
' Если все данные введены, приступить к вычислениям
Dim payEarly As DueDate
If chkPayEarly.Checked Then
payEarly = DueDate.BegOfPeriod
Else
payEarly = DueDate.EndOfPeriod
End If
Payment = Pmt(LoanIRate, LoanDuration, -LoanAmount, 0, payEarly)
txtPayment.Text = Payment.ToString("#.00")
End Sub
Первоначально объявляются три переменные для параметров займа: LoanAmount, LoanIRate и LoanDuration. Их значения должны передаваться функции Pmt() в качестве аргументов. Значение каждого поля проверяется конструкцией If. Если число введено корректно, то оно присваивается соответствующей переменной, иначе программа выводит предупреждение и прекращает выполнение. Пользователь затем может изменить ошибочные значения и снова нажать кнопку ShowPayment. Встроенная функция IsNumeric() проверяет, является ли числовое значение переменной корректным, и, если это так, возвращает значение
True (в противном случае - False).
Если в текстовое поле Amount вводится числовое значение (21000 или 21,50), то функция IsNumeric(txtAmount.Text) возвращает значение True, после чего выполняется следующий оператор, который присваивает переменной LoanAmount значение, введенное в поле Amount. Иначе выполняется оператор, идущий за ключевым словом Else. Он выводит в окно сообщений предупреждение об ошибке и осуществляет выход из подпрограммы с помощью оператора Exit Sub так же, как и End Sub.
Запустите модифицированное приложение и проверьте его работу, вводя в поля некорректные значения. Обратите внимание: некорректное значение последнего аргумента ввести невозможно - ввод в элемент CheckBox недопустим. Установка же и сброс флажка корректны всегда. В приложении LoanCalcalculator на компакт-диске использована именно эта версия программы с перехватом ошибок.
Сам расчет месячных платежей занимает в программе одну строку. Еще одна строка используется для отображения результата. В то же время программа проверки ввода данных пользователя весьма обширна. Такая ситуация типична.
Примечание. Приложения в этой книге не содержат полного, готового к использованию кода. В книге рассматриваются различные способы создания кода. Можете применять фрагменты данных примеров в собственном приложении, но, тем не менее, многое вам придется написать самим (в том числе и код обработчика ошибок, о котором вы прочтете далее).
Создание профессиональных приложений
Профессиональное приложение обязательно должно выполнять проверку вводимых данных. Тогда при ошибке ввода данных не происходит ничего страшного: пользователь может повторить ввод или отказаться от использования приложения и поискать другое, более подходящее. Но если пользователь вынужден повторять ввод данных вновь и вновь, ситуация осложняется. Программист обязан гарантировать ввод только корректных данных и работоспособность приложения, несмотря на любые ошибки пользователя.
В приложениях, приведенных в этой книге, программы проверки данных заведомо упрощены, чтобы не загромождать рассмотрения второстепенными деталями. В них демонстрируются специфические приемы работы, которые вы можете использовать в собственных приложениях, однако программу проверки данных придется разрабатывать самостоятельно (а также подпрограммы обработки ошибок, речь о которых пойдет в следующем разделе).
Запустите приложение последний раз и введите неправдоподобно большую сумму займа. Например, попытайтесь определить, во что обойдется оплата национального долга США за 72 месяца с разумными процентами. Разумеется, работа программы снова будет прервана. На этот раз вы увидите иное сообщение об ошибке: Visual Basic укажет на переполнение (рис. 2.5). Программа же остановится при выполнении оператора, в котором значение txtAmount.Text присваивается переменной LoanAmount. Нажмите кнопку [Break], и оператор, вызвавший ошибку, будет выделен.
Совет. Переполнение (overflow) - это число, которое является настолько большим, что программа не может его обработать. Обычно такая ошибка происходит при делении на очень маленькое число. В частности, к ошибке переполнения всегда приводит деление на нуль.
В созданном нами приложении LoanCalculator любое значение суммы займа, превышающее число 2147483647 (наибольшее значение, которое может быть присвоено переменной типа Integer), вызовет ошибку. Этого достаточно для многих задач, но недостаточно, например, для расчета бюджета страны. Из следующей главы станет понятно, что Visual Basic дает возможность использовать данные других типов, которые позволяют присваивать переменным громадные значения (например, представляя значение государственного долга в виде мизерной величины). Если же вы хотите работать с приложением LoanCalculator,
измените объявление переменной LoanAmount на
Dim LoanAmount As Single
Переменным типа Single можно присваивать намного большие значения, чем переменным типа Integer. Кроме того, переменные типа Single могут содержать вещественные значения. Изначально переменную LoanAmount следовало бы объявить как Single (но тогда мы не смогли бы продемонстрировать факт переполнения).
Ошибка переполнения может возникнуть во время проверки правильности данных в коде. Всегда существует вероятность того, что производимые программой расчеты либо другие математические операции приведут к переполнению. Проверка правильности данных в коде здесь не поможет, поскольку заранее не известно, каким будет результат. Нам требуется нечто вроде обработчика ошибок. Это дополнительный код, который обрабатывает ошибки уже после их возникновения. Вы указываете VB, что он не должен прекращать выполнение программы после вывода сообщения об ошибке. Вмес
то этого ему следует определять ошибки и выполнять соответствующие операторы для их обработки. Очевидно, нужно написать эти операторы. Мы приведем примеры кода для отладки ошибок.
Построение приложения MathCalculator
Следующее приложение, математический калькулятор с типичным визуальным интерфейсом, демонстрирует простоту программирования в Visual Basic. Если читатель думает, что написание подобных приложений - слишком сложное дело, то он ошибается. Приложение MathCalculator (рис. 2.6) находится в папке данной главы прилагаемого компакт-диска. Это приложение эмулирует работу карманного калькулятора, выполняя основные арифметические операции. Его структура соответствует обычному калькулятору, но может быть расширена дополнительными функциями. Добавление функций, скажем, для вычисления косинусов или логарифмов, не сложнее выполнения основных арифметических операций.
Разработка пользовательского интерфейса
Средства пользовательского интерфейса приложения просты. Но некоторые усилия при их соЃ··
Эффективная работа: VB.NET (+CD). / Е. Петрусос - СПб: Питер, 2002. - 928 с.
|