This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Visual Basic .NET Подробный справочник языка Объектно-ориентированное программирование в Visual Basic .NET РаботасХМ1иАОО.МЕГ Объектные модели для пакета Microsoft Office XP
Дэн Рамел
DSBDRNE
юграммио! в сродс Windows
ЭКФМ
Visual Basic® .NET Справочник программиста
Dan Rahmel
Visual Basic® .NET Programmer's reference
McGraw-Hill/Osborne
Дэн Рамел
Visual Basic® .NET Справочник программиста
И з да те л ьство ЭКФМ Москва , 2002
ББК 32.97 УДК 681.3 Рамел Д. Visual Basic® .Net. Справочник программиста/Практ. пособ. /Пер. с англ.— М.: Издательство ЭКОМ, 2002.—352 с.: илл. ISBN 5-7163-0101-0
Данный справочник содержит всю необходимую информацию о синтаксисе, операторах, типах данных, обработке ошибок, концепции объектноориентированного программирования и объектных моделях. Рассмотрены новые функции Visual Basic .NET, использование XML и ADO .NET, объектные модели для пакета Microsoft Office XP. Приводятся примеры решений типичных задач и советы профессиональных программистов.
Для кого предназначена эта книга? Как читать эту книгу? Некоторые особенности и замечания
16 16 17
Глава 1. Основные черты Visual Basic .NET
18
Новые элементы VB.NET Изменения в языке Типы данных Интегрированная среда разработки Концепция объектно-ориентированного программирования Основные сборки .NET Framework Типы проектов Выбор типа проекта Обработка ошибок „ Связывание Функции Visual Basic Финансовые Доступ к диску , Математические Дата и время г Строчные :.
18 20 22 25 29 36 38 39 39 47 48 48 49 49 50 50
Глава 2. Коды ASCII/ Unicode
51
Глава 3. Венгерская запись
56
r"V* •
*
Глава 4. Примеры решений типичных задач
58
Чтение файла в массив Загрузка информации из базы данных в массив Заполнение списка данными из массива Рисование часов Выбор цвета фона формы Выбор файла из списка Использование графических функций .NET для отображения рисунков Использование Windows API для воспроизведения звука Отправка сообщений электронной почты через Outlook Центрирование формы Передача параметров исполняемому файлу Отображение списка доступных шрифтов
59 60 61 62 63 64 65 66 68 69 70 71
ГлаваБ.ХМЬ
72
Различия между XML и HTML
73
Visual Basic® .Net. Справочник программиста Возможности XML Структура XML-документов Тэги символьных данных Атрибуты включения пробелов Тэги XML-Link Тэги комментариев Определение типа документа (DTD) Доступ к XML через .NET Framework Написание файла XML Чтение файла XML
Оглавление Implements Imports Input InputBox InputString InStr InStrRev Int Interface...End Interface IPmt IRR Is Is Array IsDate IsDbNull IsError IsNothing "*& — IsNumeric IsReference Join Kill LBound LCase Left Len Like Linelnput Loc Lock...Unlock LOF Log LSet LTrim Me Mid Mid Minute MIRR MkDir Mod Month MonthName MsgBox Namespace...End Namespace Not Now NPer
Оглавление Space Spc Split Sqrt. Static Stop Str StrComp StrConv StrDup StrReverse Structure...End Structure Sub...End Sub Switch SYD Synclock...End Synclock Tab Tan Throw TimeOfDay Timer TimeSerial Time Value Today Trim True Try.. Catch...Finally «/ *•*"*/ .... TypeName UBound UCase Val Value VarType WeekDay -* J WeekDayName While...End While With...End With Write, WriteLine XOR Year Глава 7. Объектные модели
11
Г
:
Т.
•"
:
_
_
COM и VB.NET Обеспечение доступа к объектам СОМ из .NET Использование компонентов .NET Framework в СОМ-приложениях Регистрация компонента вручную
Обзор ADO.NET Объект Data Adapter Объект Connection Объект DataSet BeginEdit метод Clone метод CommandText свойство CommandType свойство Commit метод ConnectionString свойство DataType свойство Delete метод ExecuteNonQuery метод Fill метод GetXml метод NewRow метод Open метод Parameters свойство ParentTable свойство Provider свойство RowState свойство Table свойство WriteXML метод
Activate метод ActiveCell свойство ActiveSheet свойство Active Workbook свойство Add метод AutoFilter метод Calculation свойство Cell свойство Close метод ., Colorlndex свойство Copy метод Delete метод DisplayAlerts свойство FontStyle свойство Formula свойство , FormulaRlCl свойство HorizontalAlignment свойство Insert метод LineStyle свойство Move метод
Name свойство NumberFormat свойство Range о объект .. ScreenUpdating свойство Select метод Value свойство VerticalAlignment свойство Weight свойство
284 285 286 286 287 287 288 288
Глава 10. Объектная модель Word XP
289
ActiveDocument свойство Add метод Alignment свойство ApplyBulletDefault метод Assistant Compare метод ComputeStatistics метод FirstLinelndent свойство Font объект Height свойство InsertBefore метод Leftlndent свойство LineSpacing свойство ListParagraphs свойство MoveDown метод MoveLeft метод MoveRight метод MoveUp метод Name свойство Open метод Paragraphs коллекция Rightlndent свойство Selection объект Shading свойство SpaceAfter свойство SpaceBefore свойство TypeBackspace метод TypeText метод Width свойство
Глава 12. Объектная модель Internet Explorer ....................................................... 334
Back метод .............................................................................................................................................................. . ....... 337 Document объект .................. , ............................ . ....................................................................................................... 337 Href свойство ................................................................................................................................................................ 338 Item метод ........................... . ........................................................................................................................................... Length свойство ......................................................................................................................................................... 340 OnMouseOver событие ........................................................................................................................................ 341 Submit метод ................................................................................................................................................................ 3
Глава 13. Объектная модель ASP.NET ............................................................................ 343
ContentType свойство .......................................................................................................................................... 346 Cookies свойство .. ...................................................................................................................................................... 346 Expires свойство ........................................................................................................................................................ 347 Form свойство .............................................................................................................................................................. 347 QueryString свойство ............................................................................................................................................ 348 ScriptTimeout свойство ....................................................................................................................................... 349 ServerVariables свойство .................................................................................................................................. 349 SessionID свойство ................................................................................................................................................... 350 URLEncode метод .................................................................................................................................................... 351 Write метод .................................................................................................................................................................
Дэн Рамел (Dan Rahmel) — программист с четырнадцатилетним стажем разработки информационных систем и клиент/серверных приложений с использованием Visual Basic, ASP, C++ и SQL Server. Он является автором нескольких книг, включая Visual Basic Programmer's Reference, первое и второе издание, Building Web Database Application with Visual Studio, Teach Yourself Database Programming in 24 Hours и Developing ClientServer Applications with Visual Basic. Кроме того, он активно сотрудничает с компьютерными журналами DBMS, Internet Advisor и American Programmer.
Благодарности Мне было очень приятно работать над новым изданием, чему в немалой степени способствовало тесное сотрудничество с настоящими профессионалами из издательства Осборн. Я хотел бы выразить признательность тем из них, с кем общался непосредственно (Jim Schachterle, Tim Madrid, Laura Stone, Greg Guntle, Ricard Adin, Robert Campbell)), а также всем остальных, кто внес свой вклад в создание этой книги. Также я хотел бы поблагодарить своих родных и друзей (David Rahmel, Don Murphy, Greg Mickey, John Taylor, Juan Leonffy, Ed Gildred, Weld O'Connor) за безоговорочную поддержку, и в особенности Дэвида Рамела за его дельные предложения и активное участие в подготовке нового издания. Но более всего я благодарен читателям, чей интерес является мощным стимулом для всех нас, кто занят в книжной индустрии. Моя особая благодарность Кристоферу Лопесу (Christopher Lopez) и Симону Уолку (Simon Walke), приславшим свои предложения и замечания по поводу первого издания. Работая над книгой, важно сознавать, что твои усилия не напрасны. Еще раз спасибо.
Введение Добро пожаловать в новое издание «Справочника программиста по Visual Basic.NET». Мне было очень приятно работать над этой книгой прежде всего благодаря ее долговечности. Несколько лет назад, когда издательство Osborn впервые обратилось ко мне, я усомнился в необходимости подобной книги. В самом деле, кому нужен справочник при том объеме онлайновой информации, которая включена в VB? Совместно с издательством мы разработали концепцию, которая могла бы существенно дополнить имеющуюся документацию по Visual Basic. Очевидно, что включение примеров, объектных моделей, таблиц кодов и перекрестных ссылок в справочник небольшого формата повысило бы привлекательность книги в глазах читателя. За минувшие годы Visual Basic существенно усложнился, поэтому, работая над новым изданием, я и мои коллеги из Osborn приложили все усилия, чтобы привести книгу в соответствие с современными требованиями.
Для кого предназначена эта книга? Поскольку Visual Basic.NET представляет собой совершенно новый мир, я хотел бы надеяться, что эта книга поможет вам освоиться в среде .NET с ее поистине неограниченными возможностями. Я написал еще одну книгу «.NET Programmer's Reference» (ISBN 0-07-219466-9), посвященную библиотекам классов .NET Framework. Если вы сочтете этот справочник полезным, возможно, вас заинтересует и вторая книга как руководство по программированию. Книга, которую вы держите в руках, содержит справочную информацию по семейству программных продуктов Visual Basic/VBA/VBScript. Хотя справочник рассчитан на читателей, имеющих некоторый опыт в программировании, не исключено, что именно для новичков она окажется просто незаменимой. Имея это в виду, я постарался снабдить все разделы перекрестными ссылками.
Как читать эту книгу? Работая над книгой, я стремился изложить материл таким образом, чтобы предельно упростить его использование при разработке проектов. Все функции и утверждения перечислены в алфавитном порядке в главе 6. Если при-
Введение
17
мерно известно, какая команда требуется, можно найти ее в кратком справочнике, чтобы просмотреть описание, уточнить синтаксис или воспользоваться перекрестными ссылками, указывающими на сходные функции. Если вы имели дело с предыдущими версиями Visual Basic, ознакомьтесь с главой 1, где описываются изменения, внесенные в .NET версию, включая нововведения, не указанные в документации языка.
Некоторые особенности и замечания Возможно, самой привлекательной чертой этой книги являются примеры кодирования, которые приводятся для каждой команды. Учитывая, что программисты редко обращаются к справочникам из чистого любопытства, я постарался показать, как используется та или иная команда в реальном контексте. Каждому элементу языка сопутствует простой пример. Этот подход получил дальнейшее развитие в главе 4, где приведены пошаговые процедуры, выполняющие распространенные операции, с которыми часто сталкиваются программисты. Теперь, чтобы решить подобную задачу, вам не придется напрягать память. Достаточно заглянуть в соответствующий раздел справочника и следовать приведенным там указаниям. Еще одним достоинством этого справочника является включение объектных моделей, приведенных в главах 7-13. Объектные модели, разработанные Microsoft и воспроизведенные в большинстве книг, представляют собой хитросплетение объектов, где невозможно понять, какой объект является единичным, а какой - коллекцией. Совсем иначе обстоит дело в этой книге. Каждая схема содержит только один уровень объектной модели, а отличительными признаками коллекций являются их представление (в виде колоды карт) и имя, указанное во множественном числе. Имя единичного объекта приведено ниже в скобках. Объектные модели могут оказаться неоценимым подспорьем при создании проектов Visual Basic/VBA. В .NET Framework, как вы, возможно, заметили, объектные модели играют едва ли не более важную роль, чем используемый язык программирования. По этой причине можно только приветствовать любые усовершенствования, которые способствуют пониманию объектных моделей (Excel, PowerPoint или любой другой). Я надеюсь, что вы пришлете мне свои предложения или сведения об ошибках, если таковые найдутся. Страница, посвященная этой книге, размещается в Web-узле Coherent Data. Надеюсь, вы найдете время ее посетить.
Основные черты Visual Basic .NET Изменения, сопровождавшие преобразование предыдущей версии Visual Basic в VB.NET, слишком значительны, чтобы охватить их в рамках справочника. Вместо исполнительной среды (runtime), существовавшей в Visual Basic, появилась универсальная система разработки, использующая промежуточный код MSIL (Microsoft Intermediate Language) и компилятор времени выполнения JT (Just-In-Time). Кроме того, Visual Basic ныне интегрирован в единую среду разработки IDE (Integrated Development Environment) вместе с другими языками Visual Studio. По этой причине в книге рассматриваются только принципиальные изменения, с которыми может столкнуться разработчик при переходе к VB.NET. Это ни в коей мере не охватывает всех аспектов, связанных с освоением новой системы. Необходимо также учесть, что Visual Studio.NET обладает всеми функциональными возможностями .NET Framework. Чтобы оценить все преимущества, вытекающие из этого факта, разработчик должен воспринимать VB.NET как совершенно новую систему, а не очередную версию Visual Basic.
Новые элементы VB.NET VB.NET существенно отличается от предыдущих версий Visual Basic. Основные различия представлены ниже: •
Интеграция в Visual Studio.NET. Как и другие языки, входящие в Visual Studio, Visual Basic теперь интегрирован в единую среду разработки, использующую одни и те же окна, меню и элементы управления независимо от языка программирования (см. раздел «Интегрированная среда разработки» далее в этой главе).
•
Компиляция кода в MSIL. В отличие от предыдущих версий Visual Basic, исходный код теперь компилируется в метаязык, называемый Microsoft Intermediate Language (MSIL), который функционирует аналогично
Глава 1. Основный чсргм Visual Basic .NET
19
байтовому коду Java Virtual Machine. Во время выполнения MSIL преобразуется в машинный код с помощью компилятора JT (Just-In-Time). •
Добавление возможностей .NET Framework. Благодаря интеграции с развитой объектной средой, называемой .NET Framework, в VB.NET доступны все процедуры операционной системы Windows. Объекты .NET Framework заменяют традиционные элементы VB (формы и элементы управления), вызовы Win32 API (Application Programming Interface) и создание объектов с помощью MFC (Microsoft Foundation Classes).
•
Изменения в языке. Visual Basic изменился незначительно, в основном за счет добавления новых ключевых слов и функций (см. раздел «Изменения в языке» далее в этой главе).
•
Расширение типов данных. Увеличился размер целочисленных типов, и были усовершенствованы некоторые другие типы данных (см. раздел «Типы данных» далее в этой главе).
•
Объектно-ориентированное программирование. В VB.NET полностью реализованы принципы объектно-ориентированного программирования, включая наследование, перегрузку и полиморфизм (см. раздел «Концепция объектно-ориентированного программирования» далее в этой главе).
• Добавление многопоточных возможностей. VB.NET поддерживает многопоточную обработку данных, включая создание, управление и установку приоритета. •
Создание консольных приложений. Теперь в Visual Basic можно создавать приложения, которые запускаются с консоли или из командной строки (MS-DOS), не требуя пользовательского интерфейса.
• Использование служб Windows NT. Службами называются процедуры, работающие в фоновом режиме и выполняющие различные вспомогательные функции: от мониторинга батарейки переносного компьютера до предоставления услуг FTP-сервера. Службы NT могут выполняться в операционных системах NT 4, Windows 2000 и Windows XP. •
Добавление Web-служб. Как и службы NT, Web-службы работают в фоновом режиме на сервере, но взаимодействие с ними осуществляется через протоколы Интернета. Web-служба может быть запущена с удаленного компьютера с помощью URL-адреса. \ • Поддержка ADO.NET. ADO.NET представляет собой усовершенствованную версию ADO (ActiveX Data Object), которая включает полную поддержку расширенного языка разметки (XML), отсоединенных наборов данных и схем XML.
20
Глава 1. Основные черты Visual Basic .NET
• Структурированная обработка ошибок. VB.NET включает структурированную обработку исключений (в виде конструкции Try...Catch), которая давно поддерживается такими языками, как C++ (см. раздел «Обработка ошибок» далее в этой главе). •
Создание серверных элементов управления. VB.NET позволяет создавать серверные элементы управления, которые выполняются на сервере IIS (Internet Information Server). В результате их выполнения создается код HTML (Hypertext Markup Language), который может быть вставлен в Web-страницу, пересылаемую браузеру.
•
Расширение связывания данных. Хотя Visual Basic поддерживал привязку данных к элементам управления формы, начиная с версии 3, в VB.NET эта возможность распространяется и на Web-формы.
Изменения в языке Если говорить о языке как таковом, Visual Basic изменился не более чем на пять процентов. Большинство ключевых слов, утверждений и функций по-прежнему доступны, хотя предлагается несколько иной способ их использования (например, вместо функции MsgBox теперь используется метод MessageBox.Show). Основные изменения языка представлены ниже: •
Исключены функции Atn, Sgn и Sqr. Вместо них используются методы Atan, Sign и Sqrt, размещающиеся в классе System.Math.
• Исключены функции Circle и Line. Вместо них используются методы DrawEllipse и DrawLine соответственно, размещающиеся в классе System.Drawing.Graphics. •
Исключены функции Date и Time. Эти функции заменены свойствами Today и TimeOf Day соответственно.
•
Исключены функции Date$ и Time$. Эти функции заменены свойствами DateString и TimeString соответственно.
•
Исключена команда Debug.Print. Эта команда заменена методами Write, Writelf, WriteLine и WriteLinelf, которые размещаются в классе System.Diagnostic.Debug. Обычно вместо команды Debug.Print(myStr) используется Console.WriteLine(myStr).
• Больше не поддерживаются функции Def. В VB.NET не поддерживаются функции DefBool, DefByte, DefCur, DefDate, DefDbl, DefDec, Deflnt, DefLng, DefObj, DefSng, DefStr и DefVar.
Глава 1. Основные черты Visual Basic .NET
21
•
Исключен оператор DoEvents. Вместо него используется метод DoEvents, который размещается в классе System.Windows.Forms.Application.
•
Исключены значения Empty и Null. Вместо них используется Nothing.
• Исключено утверждение GoSub. •
Исключена функция IsEmpty. Эта функция заменена функцией IsNothing.
• Исключена функция IsMissing. В VB.NET все необязательные аргументы должны иметь заданные по умолчанию значения, что делает ненужной функцию IsMissing, определявшую, передано ли значение аргумента. •
Исключены методы IsNull и IsObject. Вместо них используются методы IsDbNull и IsReference, размещающиеся в классе Microsoft. VisualBasic.Information.
•
Исключены функции LSet и RSet. Эти функции заменены на методы PadRight и PadLef t, размещающиеся в классе System.String.
•
Исключены функции Pset и Scale. В VB.NET нет прямого эквивалента этим функциям.
• Исключены функции Rnd и Round. Вместо них используются методы Rnd и Round, размещающиеся в классе System.Math. •
Исключено утверждение Set. Объектные ссылки теперь присваиваются с помощью оператора равно (=).
•
Исключена команда Туре. Эта команда использовалась для определения пользовательских типов данных (UDT). Теперь вместо нее используется ключевое слово Structure.
•
Исключено утверждение Wend. Утверждение Wend, использовавшееся для завершения цикла While, заменено на утверждение End While.
•
Исключены утверждения Property Get, Property Let и Property Set. Вместо них используется структура Property...End Property.
• Исключены функции Open #, Close #, Put, Set и Width. Эти функции заменены функциями FileOpen, FileClose, FilePut, FileSet и FileWidth соответственно. •
Исключена функция Name. Вместо нее используется функция Rename.
• Добавлены условные утверждения AndAlso и OrElse. Обеспечивают проверку условия с «коротким замыканием»
Глава 1. Основные черты Visual Basic .NET
22
Типы данных VB.NET использует практически те же типы данных, что и Visual Basic. Существенные изменения коснулись только целочисленных типов Integer и Long, размер которых увеличился вдвое. Это связано со значительным увеличением мощности микропроцессоров, имевшим место в последнее десятилетие. Основные изменения типов данных включают: •
Изменение границ массивов. Хотя в Visual Basic 6 нижняя граница массива по умолчанию равнялась нулю, это значение можно было изменить с помощью утверждения Option Case. В VB.NET индексация массивов всегда начинается с нуля.
•
Исключение типа данных Variant. Теперь вместо Variant для необъявленных типов данных по умолчанию используется тип Object. Это изменение никак не влияет на процесс кодирования.
• Возможность объявления нескольких переменных. Теперь переменные одного и того же типа (например, Dim. I, j, k As Integer) не требуют отдельного объявления. В следующей таблице приведен весь набор типов данных VB.NET, а также их характеристики, включая размер в байтах и тип CLR, определяющий размещение данного типа в пространстве имен. Кроме того, таблица содержит столбец, где указаны типы данных Visual Basic б, соответствующие типам данных VB.NET. Тип Тип CLR VB.NET
Размер (байт)
Тип VB 6 Примечания
Boolean System.Boolean
2
Boolean
Булево значение True или False.
Byte
System.Byte
1
Byte
Однобайтовая переменная с диапазоном значений от 0 до 255.
Char
System.Char
8
N/A
Символ Unicode. Диапазон значений:0-65536
N/A
N/A
8
Currency В VB.NET отсутствует тип данных Currency. Вместо него теперь используется тип Decimal.
Глава 1. Основные черты Visual Basic .NET
Тип Тип CLR VB.NET
Размер Тип (байт) VB 6
23
Примечания
SystemLWEme
L6
N/А
Decimal SysteraDecimal
8
Decimal B VB.NET размер данных типа Decimal увеличился до 16 байтов. Диапазон значений: ± 79,228,162, 514, 264, 337,593,543,950,335 для целых чисел и ± 7.9228162514264337593543 950335 для дробных.
Double
SysteraDouble
4
Double
Содержит число с плавающей точкой двойной точности, принимающее значения в диапазоне: от -1.79769313486231Е +308 до - 4.94065645841247Е-324 для отрицательных величин и от 4.94065645841247Е-324 до 1.79769313486231Е+308 для положительных величин.
Integer
System.Int32
8
Long
В VB.NET размер типа Integer увеличился с 2 до 4 байтов. Диапазон значений: от -2,147,483,648 до 2,147,483,647.
Long
System.Int64
4
N/A
В VB.NET размер типа Long увеличился с 4 до 8 байтов. Диапазон значений: от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807.
Date
Переменная типа да та/время, принимающая значения от 1 января 1 года до 31 декабря 9999 года. В Visual Basic 6 для хранения даты/времени использовался тип Double. Преобразование даты/времени из одного типа в другой осуществляется с помощью методов ToDouble и FromOADate.
Глава 1. Основные черты Visual Basic .NET
24
Тип Тип CLR VB.NET
Размер Тип (байт) VB 6
Примечания
Object
System.Object
Obj ect
Содержит объектную ссылку.
Short
System.Intl6
Integer
В VB.NET тип данных Short соответствует типу Integer в предыдущей версии Visual Basic. Диапазон значений: от -32.768 до 32.767.
Single
System.Single
Single
Содержит число с плавающей точкой. Диапазон значений: от -3.402823Е +38 до - 1.401298Е-45 для отрицательных величин и от 1.401298Е-45 до 3.402823Е +38 для положительных величин
String
System.String
Пере- String менный
VB.NET более не поддерживает строки фиксированной длины. Вместо них можно воспользоваться массивами переменных типа Byte или Char. Строка может содержать от 0 до 2 миллиардов символов.
N/A
N/A
Пере- Variant Тип данных Variant, позволяюменный щий содержать любые типы данных, исключен из VB.NET. Теперь для тех же целей используется тип Object.
4
В VB.NET добавлено несколько новых операторов, выполняющих побитовые операции над переменными и значениями. В отличие от операторов And, Or, Xor и Not, использовавших ранее как для логических, так и побитовых операций, эти операторы предназначены только для поразрядных преобразований. Следующая таблица содержит список новых операторов с указанием соответствующих операторов Visual Basic 6. VB.NET
Visual Basic 6
BitAnd (для побитовых операций)
And
BitOr (для побитовых операций)
Or
Глава 1. Основные черты Visual Basic .NET
25
VB.NET
Visual Basic 6
BitXor (для побитовых операций)
Хог
BitNot (для побитовых операций)
Not Eqv Imp
Not и Or (например, (Not A) Or B)
Интегрированная среда разработки Интегрированная среда разработки IDE (Integrated Development Environment) позволила объединить под единым интерфейсом все языки, входящие в Visual Studio. На рис. 1-1 показано типичное приложение Windows, представленное в окне IDE. Экран разделен на несколько панелей, размеры которых можно изменять. Каждая панель может включать несколько именованных вкладок или окон. NET [design] - DataForm.vb [Design]
File
fdtt
view
Project
|p - ffi - Ш ^ £$
Burfd
Pefaug
Л % ';r
Dga
Format
Tools
о - ; • - ,P - Ц
, Debug
[|:. myUnearGradJentBrush
»rm.vb[DesignJ j Р
i I j;i 0 Solution *vewinTest'(l project) ffl- El References 1-й AssemMylnfo.vb
iI Рис. 1 -1. Интегрированная среда разработки (IDE), используемая в Visual Studio Экран IDE включает следующие части: •
Левая сторона. Вдоль левой стороны экрана располагаются раскрывающиеся меню Server Explorer и ToolBox. Список Server Explorer используется
Глава 1. Основные черты Visual Basic .NET
26
для выбора источников и адаптеров данных. Панель ToolBox содержит все стандартные элементы управления UI (флажки, кнопки и другие). Кроме того, в этой области экрана может отображаться структура документа (Document Outline). •
Центр. На центральной панели представлен текущий документ. Это может быть форма, страница кода, Web-страница, браузер объектов или справка.
•
Низ. Внизу экрана располагается панель, где могут отображаться несколько вкладок, включая Output, Debugging, Dynamic help search results, Command, Find Symbol Results и Breakpoints.
• Правая сторона. Правая сторона окна содержит две панели. В нижней панели размещаются две вкладки Properties и Favorites. В верхней панели может отображаться несколько вкладок, включая Solution Explorer, Class View, Resource View, Macro Explorer и Dynamic Help index. В IDE значительно возросло количество команд, доступных на панели инструментов. Одним из наиболее существенных изменений является поле со списком Solution Configuration (рис. 1-2), позволяющее указать, что произойдет при нажатии на кнопку Start. Например, если выбран вариант Release, будет сгенерирован исполняемый модуль или компонент, не содержащий отладочной информации. DumpTy
Рис. 1 -2. Поле со списком доступных конфигураций Примечание. Если при выполнении приложения оказывается, что отладочная информация недоступна, проверьте содержимое поля Solution Configuration. Возможно, что сохранилась установка Release и, как следствие, любая попытка активизировать параметры отладки игнорируется. miuH№»iHmuiHHtHttt<«tiMtim»ttii»»mMtiMttitf!aituiuutitiitit
L
*ми
м««««*к«т«»««»««я«я««м«™»»?^^
и
ttwttttt-mttKVMituvaatttmtttiiiiiiHiiiiit^UHt*
Список поля Solution Configuration обеспечивает доступ к функции Configuration Manager, что позволяет настраивать параметры отладки, среды и построения.
Глава 1. Основные черты Visual Basic .NET
27
Браузер объектов Браузер объектов представляет собой инструмент VB.NET, который используется для просмотра объектных моделей (включая библиотеки .NET Framework), импортированных в текущий проект. На рис. 1-3 показано окно Object Browser, которое открывается по команде Other Windows в меню View, а также с помощью кнопки на панели инструментов или клавиши [ F2 |. Окно браузера объектов содержит три панели: Objects, Members и Search. В поле со списком Browse указано имя библиотеки, компоненты которой отображаются на панелях окна. Object Browser j En^pty Index Entry | ataForiri.vb | Dat2rorm.vb[pes;gri] ] form l.vb [Design] Browse:;:- Selected Components
» Customise... Igi •* >% * \ <£j* *>ф.. 0Ц*-:.
Objects Ш"O Interop.Excel_l_4 Ш-»О Interop.Office_2_l Ш—О Interop.VBIDE_5_3 Ш-"О Microsoft Visual Basic.NET Runtime EB"*O mscorlib Й-a stdole Ш--О System Ш-*О System.Data В --О System.Drawing I 5 {} System.Drawing I i ф--^* Bitmap
П Ccrf:rnand -Vindovj ^ Find Symbol Results [ Ш Output ] % Index Result:. iEftl Breakpoints |
Рис. 1 -3. Окно просмотра объектов На панели Objects представлены в алфавитном порядке все доступные объекты и коллекции. В главах 7-13 вы ознакомитесь с объектными моделями приложений Microsoft Office и других компонент. Использование этих модели совместно с браузером объектов позволяет создавать практически любые объектно-ориентированные решения. Панель Members содержит свойства, поля, события и методы, являющиеся членами объекта, выделенного на панели Objects. Каждый член помечен значком, определяющим его тип. Внизу диалогового окна располагается
28
Глава 1. Основные черты Visual Basic .NET
область, где отображаются параметры выделенного элемента. Для свойства это сведения о типе данных, для метода - это описание аргументов и возвращаемое значение. Панель Search скрыта до активизации поиска, после чего она появляется под окном браузера объектов. Чтобы осуществить поиск, достаточно щелкнуть на кнопке Find (кнопка с изображение бинокля). Все элементы, представленные в окне Object Browser, являются библиотеками объектов, присвоенными текущему проекту. Это не значит, что в системе не могут быть зарегистрированы другие библиотеки. Например, Excel добавляет объектные библиотеки Excel, но не добавляет библиотеки Word, так как последние обычно не используются в проектах Excel. Чтобы добавить в проект другие библиотеки, можно воспользоваться командой Project/Add Reference. Эта команда (в зависимости от используемого приложения) может присутствовать в различных меню. Все библиотеки объектов, включенные в проект, становятся доступными для просмотра в окне Object Browser.
Комбинации клавиш Хотя состав меню IDE может меняться в зависимости от языка, на котором ведется разработка, большинство команд остаются неизменными. Следующий список содержит комбинации клавиш для наиболее распространенных команд: Комбинация клавиш
Назначение Найти символ Добавить существующий элемент. Выделить все. Исследовать процесс отладки. Добавить прерывание. Найти Вызов динамической справки Запустить выполнение без отладки Перейти (номер строки) Заменить Создать файл Открыть файл
Глава 1. Основные черты Visual Basic .NET
Комбинация клавиш
29
Назначение Печать Сохранить элемент Добавить новый элемент Построить текущий проект Найти в файлах Очистить все точки прерывания Заменить в файлах Создать проект Открыть проект Сохранить все Преобразовать в прописные Преобразовать в строчные Повторить Отменить Вызов справки Искать дальше Перейти в окно параметров (Properties) • Запуск выполнения Просмотр кода Включить точки прерывания Перейти Войти Перейти в полноэкранный режим
Концепция объектно-ориентированного программирования Благодаря значительным изменениям, внесенным в последнюю версию, программирование на Visual Basic приобрело черты, свойственные таким языкам, как C++ и Java. VB.NET представляет собой объектно-ориентированную среду с иерархической структурой классов, которая имеет доступ ко всем функциям .NET Framework . В предыдущих версиях Visual Basic возможности объектно-ориентированного программирования ограничивались созданием и использовани-
30
Глава 1. Основные черты Visual Basic .NET
ем компонентов COM (Component Object Model). В VB.NET применение принципов объектно-ориентированного программирования является необходимым условием разработки приложений. Все языки Visual Studio поддерживают три основных принципа объектно-ориентированного программирования: наследование, полиморфизм и перегрузку. В большинстве своем реализации этих принципов осуществляется на уровне определений классов и их членов. Например, если один класс наследует от другого, родительский класс указывается в заголовке с помощью ключевого слова Inherits.
Наследование Класс представляет собой совокупность связанных между собой данных, методов их обработки и событий. С позиций наследования класс может быть дочерним (child) или родительским (parent). Дочерний класс наследует характеристики родительского класса, включая свойства, методы, поля данных и события. Например, класс NewChildClass, приведенный на следующей схеме, наследует все члены родительского класса MyClass за исключением метода MyDraw, который создается заново, замещая исходный.
—
метод myDraw свойство myGreeting >
NewChildClass метод myDraw (замещенный) свойство myGreeting
Наследование обеспечивает использование существующих объектов без повторного программирования. Дочерний класс может быть расширен за счет добавления новых членов и адаптирован к конкретным нуждам, поскольку унаследованные свойства и методы могут быть замещены или отключены. В качестве простого примера наследования рассмотрим класс прямоугольника, который рисует прямоугольную фигуру и перемещает ее по экрану. Можно создать дочерний класс в виде скругленного прямоугольника,
Глава 1. Основные черты Visual Basic .NET
31
который наследует поведение родительского класса, включая перемещение и изменение размеров. Чтобы обеспечить закругление углов, в новом классе нужно заменить метод построения прямоугольника и добавить свойства, определяющие параметры закругления. Так как класс скругленного прямоугольника является подклассом прямоугольника, любой объект, созданный на его основе, может быть передан методу, предназначенному для прямоугольника. Дополнительная информация (о закруглении) просто игнорируется, и объект трактуется как обычный прямоугольник. Это позволяет программисту создавать дочерние классы для существующих классов, добавлять в них данные и методы и продолжать использовать объект со старыми процедурами, ориентированными на родительский класс. В Visual Basic при определении нового класса, наследуемого (или производного) от существующего, используется ключевое слово Inherits. Например: Public Class MyComponent Inherits System.ComponentModel.Component
Этот код создает новый компонент, наследующий все свойства, методы, события и поля класса System.ComponentModel.Component. Определение компонента может быть расширено по сравнению с исходным классом, чтобы обеспечить необходимые качества создаваемых объектов. Наследование может осуществляться различным образом. В VB.NET имеется три типа классов, определяющих способ наследования: •
Стандартный. Обеспечивает наследование всех членов.
• Абстрактный. Класс, который не образует экземпляров, но может использоваться в качестве родительского или предоставлять базовые методы для других объектов. Зачастую члены абстрактного класса только объявляются, но не реализуются из-за невозможности стандартного применения. Реализация таких членов возлагается на дочерние классы. Определение абстрактного класса включает модификатор Mustlnherit, указывающий, что этот класс используется только как родительский. •
Конкретный. Этот тип классов идентифицируется модификатором Notlnheritable, который указывает, что данный класс не может быть унаследован. Иначе говоря, он должен использоваться в том виде, в котором задан.
При создании нового класса тип класса указывается в его определении. Существует три набора модификаторов, используемых для этой цели:
32
Глава 1. Основные черты Visual Basic .NET
• Public, Private, Protected, Friend и Protected Friend. Модификатор Public обеспечивает доступ к объектам класса без ограничений, тогда как Private делает их невидимыми за пределами сборки. Protected ограничивает доступ базовым и производным классами. Friend означает, что объекты класса доступны только из сборки, содержащей объявление класса. Protected Friend гарантирует доступ, обеспечиваемый обоими модификаторами Protected и Friend. •
Shadow. Определяет класс, замещающий уже существующий класс в пространстве имен. Тем самым как бы обеспечивается операция перегрузки (см. раздел «Перегрузка» далее в этой главе), но в отношении класса, а не метода, свойства или другого члена.
• Mustlnherit, Notlnheritable. Модификатор Mustlnherit означает, что для использования класса необходимо создать дочерний класс, а Notlnheritable запрещает наследование данного класса. В определении класса может быть указан только один модификатор из приведенных наборов (например, модификаторы Mustlnherit и Notlnheritable не могут одновременно присутствовать в одном и том же определении). Каждый из модификаторов определяет правила наследования или доступ к объектам класса. Внутри класса могут иметься члены (методы, свойства или события), модифицирующие эффект наследования. Это так называемые виртуальные члены, которые принадлежат классу или интерфейсу, не входящему в цепочку наследования текущего класса. Например, в .NET Framework имеется ряд объектов, определенных через корневой объект Object.MarshalByRefObject. Эти классы размещаются в иерархии классов отдельно от источников происхождения своих членов. Виртуальные члены содержат ссылки на исходное размещение. Примечание. В документации .NET часто приводятся примеры на языке С# без ссылок на этот язык. Например, в определениях классов нередко встречается модификатор sealed, соответствующий модификатору Notlnheritable в VB. Аналогичная проблема, когда независимо от языка программирования выдается информация, ориентированная на С#, возможна и в среде .NET (например, в System.Ref lection). Поэтому, если вы не можете найти какое-либо ключевое слово в руководстве по Visual Basic, обратитесь к документации С#. Все неабстрактные классы должны иметь хотя бы один конструктор. Во многих случаях конструктор дочернего класса требует вызова конструк-
Глава 1. Основные черты Visual Basic .NET
33
тора родительского класса. Если посмотреть на код, сгенерированный VB для новой формы, можно увидеть такое утверждение: Public Sub New() MyBase.New() Конструктор базового класса вызывается как часть процесса инициализации экземпляра объекта. Если конструктор дочернего класса не определен, VB.NET активизирует конструктор родительского класса.
Полиморфизм Полиморфизм позволяет нескольким классам, имеющим различные имена, обращаться к одним и тем же методам и свойствам. Например, если для рисования прямоугольника, овала и скругленного прямоугольника используется метод DrawQ, можно написать процедуру таким образом, чтобы она воспринимала любой из этих объектов и рисовала фигуру, не заботясь о типе конкретного объекта. На приведенной ниже схеме представлен метод DrawQ, предназначенный для трех объектов, созданных на базе трех различных классов (Rectangle, RoundedRectangle, RoundedRectangle): Выполнить метод myDraw
1
Rectangle
Oval
метод myDraw
метод myDraw - свойство myGreeting
RoundedRectangle
- свойство myGreeting
метод myDraw - свойство myGreeting В предыдущих версиях Visual Basic полиморфизм обеспечивался с помощью интерфейсов. В VB.NET поддерживается полиморфизм, базирующийся как на наследовании, так и на интерфейсе. При выборе типа полиморфизма можно воспользоваться следующими рекомендациями: •
Если предполагается расширить базовый класс, лучше воспользоваться наследованием.
•
Для нескольких реализаций, имеющих между собой мало общего, лучше воспользоваться интерфейсом.
2 - Visual Basic .Net. Справочник программиста
34
Глава 1. Основные черты Visual Basic .NET
Полиморфизм, базирующийся на наследовании. Этот тип полиморфизма используется в тех случаях, когда несколько различных классов являются производными от одного родительского класса, причем каждый класс содержит либо унаследованную, либо переопределенную версию исходного метода. Довольно часто абстрактные классы выполняют ту же роль, что и интерфейс. Абстрактные классы используются в следующих ситуациях: •
Если требуется несколько версий компонента. Каждый класс обеспечивается полным контролем версии через структуру сборки.
• Если используются большие функциональные блоки. Так как абстрактный класс может включать хотя бы частичную реализацию программы, он более удобен, чем интерфейс, для больших структур. Полиморфизм, базирующийся на интерфейсе. Можно построить интерфейс, представляющий члены одного или более классов, или создать несколько интерфейсов, соответствующих одним и тем же базовым членам, которые могут быть использованы в полиморфической системе. В отличие от Visual Basic 6, где интерфейс был обычным классом, в VB.NET имеется ключевое слово Interface, позволяющее определить новый интерфейс. Интерфейс наследует все члены базового класса. Полиморфизм, основанный на интерфейсе, используется если: • Требуется некоторая гибкость после публикации. Хотя интерфейс нельзя изменять, возможны обновления интерфейса, предотвращающие аварийное завершение кода, использующего интерфейс. При наследовании изменения базового класса приведут к нежелательным проблемам для всех классов, производных от него. •
Объекты не связаны между собой. В тех случаях, когда создается класс из различных, не связанных между собой объектов, использование интерфейса является более эффективным.
• Не нужна реализация. В тех случаях, когда нет необходимости в наследовании реализации из базового класса, лучше воспользоваться интерфейсом. •
При использовании структуры. Структуры не могут наследоваться из класса, но могут быть реализованы в интерфейсе.
Интерфейс не может быть изменен после публикации и должен быть реализован в полном соответствии со своим определением. Можно сказать, что интерфейс представляет собой своего рода договор между издателем интерфейса (который обязуется не изменять его) и пользователем (который берет на себя полную реализацию интерфейса).
Глава 1. Основные черты Visual Basic .NET
35
Для определения интерфейсов используется ключевое слово Interface, a для включения в другие классы или интерфейсы — ключевые слова Inherits или Implements. Хотя класс может наследовать только от одного базового класса, он может реализовывать несколько различных интерфейсов. Во многих отношениях интерфейс напоминает абстрактный класс. Единичный полиморфизм реализуется примерно так: Public Class myCursor Inherits Cursor ' Добавьте код для переопределения, перегрузки или расширения членов, ' унаследованных от базового класса [объявление переменных, свойств, методов и событий] End Class Для реализации нескольких интерфейсов используется код, аналогичный следующему: Interface myComboBox Inherits myTextBoxl, myLJstBox End Interface
Перегрузка Перегрузка позволяет определить несколько методов с одним и тем же именем, но с разными аргументами. Исходя из списка аргументов, переданного методу, и возвращаемого им значения, компилятор автоматически определяет, какой из методов нужно вызвать. На следующей схеме приведен класс, содержащий четыре перегружаемых определения метода myDraw. MyClass метод myDraw метод myDraw(myStr As String) метод myDraw(mylnt As Integer) -\ метод myDraw(myDate As DateTime) Перегрузка преимущественно используется при определении конструкторов, когда нужно обеспечить различные способы создания экземпляра объекта. Например, класс Cursor в .NET Framework имеет четыре конструктора:
36
Глава 1. Основные черты Visual Basic .NET // Constructor public Cursor(System.String fileName) public Cursor(System.lntPtr handle) public Cursor(System.lO.Stream stream) public Cursor(System.Type type, _ System.String resource)
Аргумент каждого из конструкторов класса Cursor указывает на место размещения изображения указателя. Несмотря на различие в аргументах, все эти методы выполняют одну и ту же функцию: инициализирует указатель мыши в соответствии с заданными аргументами. Перегрузки позволяет упростить определение класса за счет использования одного метода для решения определенного типа задач. К тому же это избавляет пользователя от необходимости создавать многочисленные методы для выполнения одной и той же функции, но с некоторыми различиями.
Основные сворки .NET Framework .NET Framework включает в себя множество процедур, управляющих всеми аспектами деятельности операционной системы Windows и выполнением приложений. Процедуры сгруппированы в файлы, называемые сборками. Visual Studio хранит сборки .NET Framework в 30 библиотеках динамической компоновки (DLL), которые размещаются в папке .NET системного каталога. В Windows 2000, например, путь к этой папке может иметь вид: c:\WinNT\Microsoft.NET\Framework\v1.0.2914 Последнее имя соответствует каталогу с текущей версией .NET Framework, где размещаются следующие файлы сборок: • •
Каждый из этих файлов содержит несколько классов. Для просмотра соответствующих пространств имен можно воспользоваться программой MSIL Disassembler, которая преобразует пространство имен в иерархическую структуру, подобную той, что отображается в окне проводника Windows. Например, чтобы просмотреть класс System.Windows.Forms, нужно выполнить следующую команду, запускающую Disassembler: ildasm После того как Disassembler активизируется, можно открыть любой файл сборки. Если затем щелкнуть дважды на элементе Manifest, в окне Notepad отобразится манифест сборки. Основная библиотека сборок .NET Framework называется mscorlib.dll и размещается в папке Framework: c:\WinNT\Microsoft.NET\Framework\v1.0.2914\mscorlib.dll Библиотеки классов, используемые несколькими приложениями, могут быть зарегистрированы в системе как глобальные. Все глобальные сборки размещаются в каталоге \Assembly: c:\WinNT\Assembly
38
Глава 1. Основные черты Visual Basic .NET
Библиотеки, работающие с ASP.NET, должны размещаться в подкаталоге \bin каталога приложения, которое их использует. Например: C:\inetpub\wwwroot\HelloNetWorld\bin
Типы проектов VB.NET поддерживает значительно больше различных типов приложений, чем предыдущие версии Visual Basic. В связи с этим число доступных типов проектов увеличилось до восьми: •
Windows Application. Стандартное приложение Windows с формами, модулями и диалоговыми окнами.
•
Class Library. В VB.NET можно создавать классы (как на базе существующих, так и произвольные), предназначенные для использования другими программами.
• Windows Control Library. VB.NET предоставляет возможность создавать элементы управления, доступные в таких средах разработки, как Visual Studio IDE или Excel VBA. •
ASP.NET Web Application. Проект, содержащий набор страниц Active Server Pages.NET (ASPX) и соответствующий код, обеспечивающий функционирование HTML-совместимых (то есть, независимых от браузера) приложений.
• ASP.NET Web Service. Служба, поддерживающая протоколы Интернета, активизация и доступ к которой осуществляется через запросы HTTP. •
Web Control Library. B VB.NET можно создавать элементы управления Web (обеспечивающие интерфейс с пользователем и другие функции), которые выполняются на сервере. В частности, это может быть Web-страница, сохраненная как элемент управления Web.
• Console Application. Стандартное приложение, которое запускается с консоли. Все параметры, указанные в командной строке, передаются приложению как массив строковых аргументов. •
Windows Service. Служба Windows NT, выполняющаяся как фоновая задача на сервере, где установлена операционная система Windows NT, Windows 2000 или Windows XP.
Помимо перечисленных выше, существует еще два типа проектов (Empty Project и Empty Web Project), не имеющих ни исходных документов (пустых форм или шаблонов кода), ни ссылок на библиотеки классов. Эти типы
Глава 1. Основные черты Visual Basic .NET
39
позволяют начать проект с чистого листа, но особенно удобны, когда нужно преобразовать существующий проект (например, приложение) в другой тип проекта (например, библиотеку классов). Конкретные параметры новой библиотеки классов могут быть указаны в пустом проекте.
Выбор типа проекта Разнообразие типов проектов, имеющихся в VB.NET, затрудняет выбор подходящего решения. Проблема осложняется еще и тем, что изменить что-либо в дальнейшем не всегда возможно. Следовательно, чем удачнее сделанный вначале выбор, тем вернее, что проект будет закончен в срок и не выйдет за рамки бюджета. Обычно в больших и средних проектах используются несколько стандартных типов. Так, например, коммерческий Web-узел нуждается в элементах управления Web, Web-службах и технологии ASP.NET. Хотя выбор фрагментов, включаемых в проект, зависит от конкретного приложения, каждый фрагмент должен в точности соответствовать своему назначению. В следующей таблице представлены наборы характеристик, упрощающие выбор типа проекта. Проанализировав проект на соответствие этой таблице, можно найти оптимальное решение. Тип проекта
UI?
Автономный?
Web?
Совместимый с 98 и ME?
Рас ширяемый?
Windows Application
Да Нет
Нет
Да
Нет
Class Library
Да Нет
Да
Да
Да
Windows Control Library
Да
Нет
Да
ASP.NET Web Application
Да Нет
Нет
Да Да
Да Нет
Нет
Да Нет Нет Нет
Да Нет
ASP.NET Web Service Web Control Library Console Application
Да Нет
Windows Service
Нет
Нет Да
Да Нет
Да
Нет
Да Нет
Да
Да
Обработка ошибок Помимо традиционной обработки ошибок, использовавшейся в предыдущих версиях языка (On Error Resume Next и т.п.), VB.NET включает но-
40
Глава 1. Основные черты Visual Basic .NET
вый, более совершенный метод, называемый структурной обработкой исключений. Суть его состоит в том, что обработка ошибок локализуется в определенном блоке кода, например, в процедуре записи в файл. При этом можно отслеживать заданные типы ошибок и выполнять необходимые действия по их устранению. При возникновении ошибки система передает управление обработчику ошибок. Если в программе нет соответствующей процедуры, Visual Basic выдает сообщение, где предлагается выйти из приложения в связи с его аварийным завершением. Чтобы предотвратить подобную ситуацию, следует предусмотреть обработку возможных ошибок в каждой программе, службе или компоненте. Существует три типа ошибок, с которыми сталкивается любой программист: синтаксические, ошибки выполнения и логические. Синтаксические ошибки возникают вследствие опечаток в ключевых словах языка или неправильного использования утверждений. Они обнаруживаются на стадии компиляции и не нуждаются в процедурах обработки ошибок. Другие два типа ошибок возникают в процессе выполнения: •
Ошибки выполнения. Эти ошибки являются следствием неправильной адресации ресурсов, включая попытки доступа к несуществующим файлам, использование неинициализированных объектов, чтение за пределами массива или коллекции и тому подобное.
•
Логические ошибки. Исключения этого типа обычно возникают вследствие непреднамеренных действий пользователя, которые приводят к аварийному завершению программы. Например, если ввести ноль в качестве значения, которое служит знаменателем при делении, произойдет ошибка. Такие ошибки довольно сложно обнаружить, поэтому регистрация ошибок в процедуре обработки может существенно упростить жизнь программисту.
Хотя, используя традиционный подход, можно перехватить вышеуказанные ошибки и предотвратить аварийное завершение программы, структурированная обработка исключений позволяет сделать это более изящно.
Структурированная обработка ошибок В основе структурированной обработки ошибок лежит конструкция Try...Catch...Finally, которая давно уже вошла в другие языки, включая C++. VB.NET поддерживает усовершенствованную версию этого оператора, позволяющую перехватывать различные типы исключений и выполнять блоки кода, предназначенные для их обработки.
Глава 1. Основные черты Visual Basic .NET
41
В простейшем случае ключевое слово Catch может использоваться само по себе (без сопутствующего блока кода), чтобы просто проигнорировать ошибку. Например: Dim a, b, с As Integer а =100 b=0 Try c = a/b Catch End Try При отсутствии ключевого слова Try появится сообщение об ошибке типа «An unhandled exception of type 'System.OverflowException' occurred in VBWinText.exe» и программа завершит работу. Чтобы реализовать обработчик ошибок, утверждения Catch и Finally должны содержать блоки кода, представляющие собой реакцию программы на возникшую ошибку. Блоки кода. Оператор структурированной обработки исключений включает блоки кода подобно тому, как это делается в условном операторе If...Then...Else. Но прежде чем приступать к обработке ошибок, необходимо извлечь информацию, предоставленную исключением: Dim a, b, с As Integer а = 100 b=0 Try c = a/b Catch myEx As Exception MessageBox.Show(myEx.ToSrtingO) Finally Ме55адеВох.51км("Выполнение завершено") End Try Свойства объекта myEx (такие как Message) позволяют установить причину ошибки. Предложение Finally содержит блок кода, который должен быть выполнен независимо от того, имела ли место ошибка. Обычно это действия по закрытию файлов, сохранению изменений или уничтожению объектов. 1ШППЩЩ|Ш111»ППШТО|1.Ш11№П'|1Г|ГГГГ||||
Примечание. Исключения типа lOException и EndOf StreamException автоматически перехватываются системой для первичной обработки. Все остальные типы исключений сразу же передаются обработчику ошибок без какой-либо предварительной обработки.
42
Глава 1. Основные черты Visual Basic .NET
Если исключение идентифицировано, но его обработка невозможна, можно выйти из структуры Try..., воспользовавшись утверждением Exit Try внутри Catch. В результате будет пропущен любой код, содержащийся в утверждении Finally. Использование фильтров. Утверждение Catch позволяет не только извлечь сведения о возникшей ошибке из объекта Exception, но и указать конкретную ошибку, которую нужно обнаружить. Для фильтрации ошибок используется ключевое слово When, которое обеспечивает проверку условия и выполнение следующего за ним кода. Поскольку структура Try... может содержать несколько утверждений Catch, можно вначале отфильтровать специфические ошибки, а затем выполнить общую обработку ошибок. Например: Dim a, b, с As Integer а=100 b=0 Try c = a/b Catch myEx As Exception When b = 0 Ме5задеВох.5[юм("Деление на ноль") Catch myEx As Exception MessageBox.Show(myEx.ToSrting()) Finally MessageBox.Show("BbinoflH6HHe завершено") End Try Как видно из примера, простое добавление утверждений Catch позволяет перехватить и обработать несколько типов ошибок. Класс Exception. Объекты, созданные на базе класса Exception (как и объект Err при неструктурированной обработке), содержат информацию об ошибке, включая позицию в коде, где возникла ошибка, тип ошибки и ее причины. Объект Exception включает следующие свойства: Свойство
Описание
HelpLink
Содержит ссылку на файл справки, соответствующий данной ошибке.
Hresult Message
Уникальное числовое значение, присвоенное данному исключению. Содержит текст сообщения об ошибке.
Глава 1. Основные черты Visual Basic .NET
43
Свойство
Описание
Source
Содержит имя объекта или сборки, где возникла ошибка.
StackTrace
Содержит список методов, отображающий последовательность (стек) вызовов, которые привели к ошибке.
TargetSite
Содержит метод, в котором произошла ошибка. Если стек вызовов доступен, это имя будет находиться вверху.
В утверждении Catch объект, воспринимающий информацию об исключении, должен базироваться на классе Exception или производном от него. В .NET Framework существует целый ряд производных классов, позволяющих перехватить специфические ошибки, включая ApplicationException, CodeDomSerializerException, InvalidPrinterException, lOException, IsolatedStorageException, PathTooLongException, CoockieException, ProtocolViolationException,WebException,MissingManifestResourceException, SUDSGeneratorException, SUDSParserException, SystemException, UriFormatException и SoapException.
Неструктурированная обработка ошибок В VB.NET по-прежнему доступна неструктурированная обработка ошибок, которая осуществляется с помощью утверждения On Error. Однако за ее использование приходится расплачиваться как быстродействием системы, так и ресурсами. Оптимальным применением неструктурированной обработки является дополнительный контроль ошибок в программах, использующих структурированные обработчики. То есть, ошибка, пропущенная последними, будет перехвачена неструктурированным обработчиком без аварийного завершения и выхода из программы. Хотя метод (или процедура) может содержать любой тип обработчика ошибок, он не может содержать оба. Поэтому следует поместить неструктурированный обработчик на более высокий уровень в иерархии вызовов, а структурированный - на более низкий. Тогда любая ошибка, ускользнувшая от обработчика ошибок конкретного метода, будет перехвачена на более высоком уровне неструктурированным обработчиком. Команда On Error
Описание
On Error Goto destination
При возникновении ошибки осуществляет переход к строке кода, определенной меткой destination.
44
Глава 1. Основные черты Visual Basic .NET
Команда On Error
Описание
On Error Goto —1 или On Error Goto 0
Отключает неструктурированный обработчик ошибок в текущей процедуре
On Error Resume Next
При возникновении ошибки управление передается следующей строке, а ошибка игнорируется.
Коды ошибок Visual Basic позволяет перехватить и идентифицировать практически все ошибки, которые возникают при выполнении программы. Тем не менее для исправления ошибок и обращения к технической поддержке необходимо четко понимать, что именно произошло. Следующая таблица содержит коды всех ошибок, перехватываемых Visual Basic, и их краткое описание, возвращаемое функцией ErrorToString(). Это описание обычно используется для выдачи сообщений об ошибках или для регистрации ошибок в файле. Номер
Описание
ошибки
3 5 6 7 9 10 11 13 14 16 17 18 20 28
Инструкция Return без GoSub. Неправильный вызов процедуры или аргумент. Переполнение. Не хватает памяти. Индекс вне заданного диапазона. Этот массив имеет фиксированную длину или временно заблокирован. Деление на ноль. Несоответствие типа. Выход за пределы строки. Слишком сложное выражение. Невозможно выполнить требуемую операцию. Прерывание пользователя. Оператор Resume, не связанный с обработкой ошибки. В стеке не хватает памяти.
Глава 1. Основные черты Visual Basic .NET Номер ошибки
Описание
35
Не определена процедура Sub или Function.
47 48
Слишком много приложений обращается к DLL. Ошибка при загрузке DLL.
49
Неправильное соглашение о вызове DLL.
51
Внутренняя ошибка.
52
Неправильное имя файла или номер.
53
Файл не найден.
55
Файл уже открыт.
57
Ошибка ввода/вывода.
58
Файл уже существует.
59
Неправильная длина записи.
61
Переполнение диска.
62
Попытка чтения за пределами файла.
63
Неправильный номер записи.
67 68
45
Слишком много файлов. Устройство недоступно.
70
Запрещен доступ.
71 74
Диск не готов. Нельзя указывать другой диск при переименовании.
75
Ошибка при доступе к каталогу/файлу.
76
Путь не найден.
91
Не задана объектная переменная или переменная блока With.
92 93
Цикл For не инициализирован. Недопустимый макет строки.
94
Недопустимое использование Null.
96
Не принимаются события, так как объект уже выдал максимальное число событий, поддерживаемое обработчиками.
97 321
Нельзя вызвать функцию Friend для объекта, не являющимся экземпляром определяющего класса. Недопустимый формат файла.
322 325
Не удается создать временный файл. Недопустимый формат в файле ресурса.
46 Номер ошибки
Глава 1. Основные черты Visual Basic .NET Описание
380
Недопустимое значение свойства.
381
Недопустимый индекс массива свойств.
383
Инструкция Set не поддерживается (свойство доступно только на чтение).
385
Необходимо указать индекс массива свойств.
387
Инструкция Set запрещена.
393
Инструкция Get не поддерживается во время выполнения.
394
Инструкция Get не поддерживается (свойство доступно только для записи).
422
Свойство не найдено.
423
Свойство или метод не найдены.
424
Требуется объект.
429
Компонент ActiveX не может создать объект.
430
Класс не поддерживает Automation.
432
Имя файла или класса не найдено во время операции Automation.
438 440
Объект не поддерживает это свойство или метод. Ошибка Automation.
442
Потеряна связь удаленного процесса с библиотекой типов или библиотекой объектов. Щелкните на кнопке ОК, чтобы удалить ссылку.
443
Объект Automation не имеет заданного по умолчанию значения.
445
Объект не поддерживает эту операцию.
446
Объект не поддерживает именованные аргументы.
447
Объект не поддерживает текущие национальные стандарты.
448
Именованный аргумент не найден.
449
Аргумент является обязательным.
450
Неправильное количество аргументов или недопустимое присвоение свойства.
451
Объект не является коллекцией.
452
Недопустимый порядковый номер.
453
Указанная функция DLL не найдена.
454
Не найден код ресурса.
Глава 1. Основные черты Visual Basic .NET Номер ошибки
Описание
455
Ошибка блокировки кода ресурса.
47
457
Этот ключ уже присвоен элементу данной коллекции.
458
Переменная используют тип Automation, не поддерживаемый в Visual Basic.
459
Объект или класс не поддерживает набор событий.
460
Недопустимый формат буфера обмена.
481
Недопустимый рисунок.
482
Ошибка принтера.
735
Не удается сохранить файл в папке TEMP
744
Искомый текст не найден.
746
Слишком длинные замещающие строки.
31001
Не хватает памяти.
31004
Объект отсутствует.
31018 31027 31032
Класс не задан. Не удается активизировать объект. Не удается создать внедренный объект.
31036
Ошибка сохранения файла.
31037
Ошибка загрузки файла.
Связывание Процесс, когда компилятор обрабатывает объектную ссылку, чтобы определить объект, на который она указывает, называется связыванием. Обычно связывание происходит на стадии компиляции. Этот тип связывания, называемый ранним (или статическим), используется при создании объектов с помощью ключевого слова New. Процесс связывания может быть отложен на время выполнения. Такое связывание называется поздним (или динамическим), поскольку тип объектной ссылки, содержащейся в переменной, не известен до момента выполнения. Примечание. Утверждение Option Strict, указанное в заголовке приложения или компонента, предотвращает позднее связывание. Если этот параметр задан, утверждения, реализующие позднее связывание, вызовут ошибку при компиляции.
48
Глава 1. Основные черты Visual Basic .NET
Позднее связывание обеспечивается методом CreateObjectQ, который генерирует объектные ссылки. Переменные, содержащие ссылки на объекты позднего связывания, должны иметь тип Object (System.Object). Свойства, методы, поля и события, определенные для таких объектов, также связываются в процессе выполнения. Примечание. В ASP.NET для создания объектов позднего связывания можно также воспользоваться методом Server.CreateObjectQ. Так как во время компиляции имя и тип объекта неизвестны, компилятор не может выполнить проверку типов данных. Такая проверка уменьшает вероятность ошибок в процессе выполнения и повышает быстродействие, поскольку отпадает необходимость в аналогичной проверке перед самым выполнением. Следует также отметить, что в Visual Basic 6 для присвоения переменной объектной ссылки требовался оператор Set. Например: Set myObj = CreateObject("Excel.Application") Теперь для той же самой операции используется обычный знак равенства: myObj = CreateObject("Excel.Application") Позднее связывание выполняется только над классами, но не интерфейсами.
Функции Visual Basic Учитывая разнообразие функций, предлагаемых Visual Basic, поиск нужной команды может оказаться довольно сложным. Чтобы упростить этот процесс, ниже приведен список, содержащий функции Visual Basic, сгруппированные по следующим категориям: финансовые, доступ к диску, математические, дата/время и строковые. Обнаружив в этом списке подходящую команду, вы можете обратиться к справочнику, где приведено описание команды и даются ссылки на другие функции, выполняющие аналогичные задачи.
Финансовые Visual Basic включает следующие финансовые функции:
Функции Visual Basic
49
DDB
FV
NPer
PV
FormatCurrency
IPmt
NPV
Rate
FormatNumber
IPR
PMT
SLN
FormatPercent
MIRR
PPmt
SYD
Доступ к диску Список функций Visual Basic, используемых для доступа к диску: ChDir
FileDateTime
InputString
Rename
ChDrive
FileGet
Kill
Reset
CurDir
FileLen
Linelnput
RmDir
Dir
FileOpen
Loc
Seek
Environ
FilePut
Lock.„Unlock
SetAttr
EOF
FileWidth
LOF
Shell
SileAttr
FreeFile
MkDir
Spc
FileClose
GetAttr
Print
Write
FileCopy
Input
PrintLine
WriteLine
Математические Список математических функций Visual Basic:
+=
Cos
Not
+
-=
CSng
Oct
-
/=
Exp
Or
/
\=
False
OrElse
Abs
Fix
Randomize
<>
And
FormatNumber
Rnd
=
AndAlso
FormatPersentage
Round
>
Atan
Hex
Sign
>=
CDbl
Int
Sin
\
CDec
IsNumeric
Sqrt
^=z
Глава 1. Основные черты Visual Basic .NET
50
CInt
Log
Tan
CLng
Mod
XOR
Дата и время Функции Visual Basic, имеющие отношение к дате и времени: CVDate
Hour
TimeSerial
DateAdd
IsDate
TimeString
DateDiff
Minute
TimeValue
DatePart
Month
Today
DateSerial
MonthValue
WeekDay
DateString
Now
WeekDayName
DateValue
Second
Year
Day
TimeOfDay
FormatDateTime
Timer
Строчные Функции Visual Basic, предназначенные для обработки строк:
& &=
InStr
Option Compare StrConv
InStrRev
Replace
StrDup
+
Join
Right
StrReverse
Chr
LCase
Rtrim
Tab
ChrW
Left
Space
Trim
CStr
Len
Split
Ucase
Filter
LTrim
Str
Val
Format
Mid
StrComp
Глава 2 Коды ASCII/ Unicode При работе над сложным программным проектом часто возникает необходимость доступа к символам в том формате, в каком они хранятся в компьютере. Традиционно соответствие между символом и его числовым представлением определяется стандартом ASCII (например, заглавная буква А хранится как число 65). В ASCII для хранения одного символа требуется 1 байт или 8 битов памяти. В новом стандарте Unicode значения первых 256 символов идентичны стандарту ASCII, но на каждый символ отводится 2 байта (16 битов), чтобы вместить дополнительные символы, входящие в различные (не английские) алфавиты. В следующей таблице представлены числовые значения всех символов, указанные как в десятичном, так и шестнадцатеричном формате. Некоторые значения не имеют символьного представления (например, коды ASCII меньше 8) и используются как управляющие. В этих случаях столбец «Символ» остается пустым. Помимо этого, в стандарте HTTP для адресов URL предусмотрен ряд символов, которые должны быть специальным образом закодированы. Например, адрес URL может выглядеть следующим образом: http://www. microsoitcom/myquery/Name=John%20Smith. Символ «%» указывает, что значение 20 является шестнадцатиричным, что соответствует десятичному 32. Можно воспользоваться столбцом «Шестнадцатиричный код» следующей таблицы, чтобы определить, какие символы включены в URL или как закодировать их вручную. Десятичный код 0 1 2 3
Глава 3 Венгерская запись Разобраться в сложной программе совсем непросто, особенно если она написана давно или другим программистом. В подобной ситуации помогла бы любая методика, делающая код более понятным. Программист по имени Чарльз Симонаи (Charles Simonyi) изобрел прием, известный как венгерская запись. В соответствии с ним к именам переменных и объектов добавляется содержательный префикс. Например, значение свойства Name для формы может включать трехсимвольный префикс frm, за которым следует имя объекта, набранное с заглавной буквы. Тогда, встретив в коде программы словосочетания типа frmMain.Show (где Main— имя объекта), программист сможет легко идентифицировать элемент, к которому они относятся. При последовательном применении венгерская запись существенно повышает читабельность кода. Кроме того, она значительно упрощает совместную разработку программ. Приведенный ниже список содержит стандартные префиксы для распространенных элементов пользовательского интерфейса, а также для переменных и структур: Элементы пользовательского интерфейса
Пример имени
Animated Button
aniControl
Checkbox
chkControl
Class ComboBox
clsClassname cboControl
CommandButton DataControl
cmdControl datControl
DataGrid DirListBox DriveListBox
grdMygrid dlbControl drbControl
FileListBox Form Frame
flbControl frmForm fraControl
Глава 3. Венгерская запись
Элементы пользовательского интерфейса
Пример имени
Hscrollbar Image Item Label Line Listbox Listview Menu OLEControl OptionButton PictureBox Remote Data Control Shape TextBox Timer Treeview Vscrollbar
Constant Currency Date/Time Decimal Double Flag Long Flag Short Integer Return Code Single
57
Глава 4 Примеры решенийтипичных задач В этом разделе рассматриваются несколько типичных задач, с которыми обычно сталкиваются программисты. Изучив упрощенный, но вполне работоспособный пример, вы сможете на его основе быстро создать нужный код. Приведенные ниже примеры носят по возможности общий характер, чтобы их можно было легко модифицировать с учетом конкретной ситуации. Для краткости большинство фрагментов кода не содержит длинных комментариев. Кроме того, определения событий, обычно длинные и громоздкие (например, Private Sub cmdReadFile_Click(ByVal sender As System Object, ByVal e As System.Event Args) Handles cmdReadFile.Click), сокращены (например, Sub cmdReadFile_Click()). Тем не менее при написании программ рекомендуется использовать длинные заголовки, сгенерированные Visual Basic. Примеры включают решения следующих задач: •
Чтение файла в массив.
•
Загрузка информации из базы данных в массив.
• Заполнение списка данными из массива. • Рисование часов. •
Выбор цвета фона формы.
• Отображение списка файлов в диалоговом окне. • •
Использование библиотеки .NET для отображения рисунков. Использование системы DirectSound для воспроизведения звукового файла.
• Отправка сообщений электронной почты через Outlook. • Центрирование формы. • •
Чтение файла в массив Visual Basic включает встроенные возможности, позволяющие читать текстовые файлы по строкам. После того как строка считана, ее можно разбить на поля, воспользовавшись функцией Split(). В качестве разделителей полей используются различные символы (запятые, позиции табуляции и другие). Большинство приложений, работающих с табличной информацией, могут сохранять данные в текстовом формате с разделителями в виде запятых (обычно эти файлы имеют расширение .csv). 1. Воспользуйтесь текстовым редактором (например, Notepad), чтобы ввести следующий текст и сохранить его в файле vbrl.csv в корневом каталоге: Joe,Girch,10 John,Smith, 11 Phil,Stewart,12 Dirk, Lumper, 13 2. Создайте новый проект Windows Application в Visual Basic. 3. Добавьте командную кнопку и определите свойство Name для кнопки как cmdReadfile. 4. Введите следующий код события Click для кнопки: SubcmdReadFile_Click() ' Создать файловый поток для чтения из файла Dim myFS As New IO.RIeStream("c:\vbr1 .csv", _ IO.RleMode.Open, IO.FileAccess.Read) ' Открыть StreamReader для ввода Dim r As New lO.StreamReader(myFS) Dim i As Integer Dim rnyLine, tempStr As String 1 Определить массивы для текстовых и числовых данных Dim myLJneStr() As String, a$( 100), b${ 100) Dim c( 100) As Integer i=0 myLine= r.ReadLine Do While Not (myLine Is Nothing) myLineStr = myLine.SplitC',") a(i)= myLJneStr{0) : b(i)= mylJneStr(l) c(i) = Val(myUneStr(2))
60
Глава 4. Примеры решений типичных задач myLJne= r.ReadLJne i+=1 Loop End Sub
5. Выполните приложение. В процессе выполнения кода информация из.текстового файла загружается в три массива. Этим все и ограничивается, поскольку обработка данных зависит от конкретного проекта. Обратите внимание, что для формирования третьей переменной используется функция ValQ, преобразующая текстовые данные в числовые (в данном случае Integer).
Загрузка информации из базы данных в массив Для доступа к базам данных обычно используются запросы, обеспечивающие эффективный способ отбора и сортировки информации. В некоторых ситуациях, однако, когда требуется небольшой объем данных, проще воспользоваться массивом. В этом примере показано, как загрузить информацию из базы данных Northwind в расширяющийся массив с помощью объектов ADO.NET. Имя базы данных Northwind зависит от приложений Microsoft Office, установленных на компьютере. В данном случае используется база данных, входящая в комплект FrontPage (FPNWIND.MDB). Если вы не знаете, где расположена база данных Northwind в вашей системе, попробуйте найти ее, воспользовавшись критерием поиска *NWIND.MDB 1. Создайте новый проект Windows Application в Visual Basic. 2. В заголовок формы, которая отобразится по умолчанию, введите следующее: Inports System.Data.OleDb 3. Добавьте командную кнопку и укажите в свойстве Name значение cmdReadDB. 4. Введите следующий код для события Click для кнопки: Sub cmdReadDB_Click() Dim myConn As OleDbConnection Dim myCmd As OleDbCommand Dim myReader As OleDbDataReader Dim myConnStr As String
Глава 4. I Ьимоиы IXMJIOHHH гимичнмх чпдач
61
Dim myArray(O) As String Dim i As Integer myConnStr = "Provider=" & _ "Microsoft.Jet.OLEDB.4.0;Password=;"&_ "User ID=Admin;DataSource=" & "C:\myData\FPNWIND.MDB;" _ "Mode=Share Deny None;" myConn = New OleDbConnection(myConnStr) myCmd.CommandType = CommandType.Text myCmd.CommandText = "Select * from Customers" myCmd.Connection = myConn myConn.Open() myReader = myCmd.ExecuteReader() Do While myReader.Read() myArray(i) = myReaderlContactName ReDim Preserve myArray(Ubound(myArray) +1) i+=1 Loop МздВох("Найдено" & I &" записей") myConn.Close() End Sub 5. Выполните приложение.
Заполнение списка данными из массива = При программировании довольно часто возникает необходимость транспортировать данные из массива в такие элементы управления, как поле со списком (ComboBox). В этом примере текстовые элементы, сгенерированные случайным образом, помещаются в массив данных, который затем копируется в поле со списком. 1. Создайте новый проект Windows Application в Visual Basic. 2. Добавьте в форму элемент управления ComboBox и укажите в свойстве Name значение cboMyCombo. 3. Добавьте командную кнопку и укажите в свойстве Name значение cmdMakeCombo. 4. Введите следующий код события Click для кнопки:
62
Глава 4. Примеры решений типичных задач Sub MakeCombo_Click() Dim myArray(10) As String Dim i As Integer Fori = 0to9 myArray(i) = "ID:" & Rnd() * 100 Next For i = 0 to UBound(myArray) -1 cboMyCombo.ltems.Add(myArray(i)). Next End Sub
5. Выполните приложение.
вание часов Элемент управления PictureBox включает графическую среду, которая в сочетании с графическими возможностями .NET — позволяет рисовать практически любые объекты. Этот пример демонстрирует рисование часов с использованием таймера, тригонометрических функций и преобразования времени (часов/минут/секунд) в графические координаты. Для правильного функционирования часов необходимо, чтобы система была настроена на отображение 12, а не 24 часов в сутках. 1. Создайте новый проект Windows Application в Visual Basic. 2. Добавьте в форму элемент управления Timer. 3. Добавьте командную кнопку и укажите в свойстве Name значение cmdClock. 4. Добавьте в форму элемент управления PictureBox и определите свойство Name как pbxClock 5. Создайте новую процедуру для формы с именем DrawHand и введите следующий код: Sub DrawHand(ByVal myGraphics As Graphics, _ ByVal myPen As Pen, ByVal ex As Integer, ByVal cy As Integer, ByVal num As Integer, _ ByVal rad As Integer) Dim x, у As Integer x = rad * Math.Sin((num * Math.PI)/30) у = rad * Math.Cos((num * Math.PI) /30}
Глава 4. Примеры решений типичных задач
63
myGraphics.DrawLine(myPen, ex, су, сх + х, _
су-у) End Sub 6. Введите следующий код для события Tick элемента управления Timer: SubTimer1_Tick() Dim сх, су, rad As Integer cx=100:cy= 100: rad = 80 Dim myGraphics As System.Drawing.Graphics myGraphics = pbxClock.CreateGraphics() myGraphics. FillElipse(Brushers.White, _ ex - rad, cy - rad, rad * 2, rad * 2) myGraphics.DrawElipse(Pens.Yellow, _ ex - rad, cy - rad, rad * 2, rad * 2) DrawHandfmyGraphics, Pens.Red, ex, cy, _ Hour(Now) * 5, rad * 0.6) DrawHand(myGraphics, Pens.Green, ex, cy, _ Minute(Now), rad * 0.9) DrawHand(myGraphics, Pens.Blue, ex, cy, _ Second(Now), rad) MyGraphics.DisposeO End Sub 7. Введите следующий код для события Click для кнопки: SubcmdClock_Click() Timerl. Enabled = True
End Sub 8. Для свойства Interval элемента управления Timer установите значение 1000 (чтобы таймер активизировался каждую секунду). 9. Выполните приложение.
Выбор цвета фона формы Visual Basic включает диалоговое окно, которое предоставляет стандартный интерфейс для выбора цвета и возвращает значение в формате RGB.
64
Глава 4. Примеры решений типичных задач
В следующем примере показано, как задать цвет для фона формы. 1. Создайте новый проект Windows Application в Visual Basic. 2. Добавьте командную кнопку и укажите в свойстве Name значение cmdSelectColor. 3. Введите следующий код для события Click для кнопки: Sub cmdSelectColor_Click() Dim myCoIorDlog As New ColorDialogO Dim result As DialogResult ' Настройка цвета myColorDlog.AllowFullOpen = True myCoIorDlog.Color = System. Drawing.Color.Blue result = myColorDlog.ShowDialogO If result = DialogResult.OKThen Form 1 .ActiveForm. BackColor = MyColorDlog.Color End If End Sub 4. Выполните приложение и щелкните на кнопке. После того как пользователь выберет цвет и щелкнет на кнопке ОК, цвет фона формы изменится. Обратите внимание, что цвет элементов управления также изменится, поскольку они являются дочерними по отношению к форме.
Выбор файла из списка Класс диалоговых окон имеет производные классы, предназначенные для открытия и сохранения файлов. В следующем примере демонстрируется использование диалогового окна Open для отображения списка файлов, имеющих расширение .dat. После того как пользователь выбрал файл и щелкнул на кнопке ОК, программа проверяет, существует ли данный файл, и выдает соответствующее сообщение. 1. Создайте новый проект Windows Application в Visual Basic. 2. Добавьте элемент управления TextBox и укажите в свойстве Name значение txtRleName 3. Добавьте командную кнопку и укажите в свойстве Name значение cmdBrowse.
Глава 4. Примеры решений типичных задач
65
4. Введите следующий код для события Click для кнопки: Sub cmdBrowse_Click() Dim myFileDlog As New OpenFileDialog() myFileDlog.lnitialDirectory = "c:\" myFileDlog.Filter = "All Files (*.*)| *.*"&_ " | Data Rles (*.dat) | *.dat" myFileDlog. Filterlndex = 2 myRleDlog.RestoreDirectory = True If myFileDlog.ShowDialogO = _ DialogResult.OKThen If Dir(myRleDlog.RleName) <>"" Then МздВох("Файл существует:" & _ myRleDlog.RleName, _ MsgBoxStyle. Information) Bse МздВох("Файл не найден", MsgBoxStyle.Critical) End If End If End Sub 4. Выполните приложение. При использовании диалоговых окон можно также воспользоваться дополнительными флажками и параметрами, перечисленными в документации Visual Basic.
Использование графических функций .NET для отображения рисунков В этом примере показано, как с помощью объекта Image загрузить изображение, повернуть его на 180 градусов и сохранить изменения в файле другого типа. Из приведенного кода видно, насколько просто создать процедуру, модифицирующую графический файл. 1. Создайте новый проект Windows Application в Visual Basic. 2. Добавьте командную кнопку и укажите в свойстве Name значение cmdSimpleBitmap. 3. Добавьте в форму элемент управления PictureBox и укажите в свойстве Name значение pbxlmage. 3 - Visual Basic .Net. Справочник программиста
66
Глава 4. Примеры решений типичных задач
4. Введите следующий код для события Click для кнопки: Sub cmdSimpleBitmap_Click() Dim mylmage As Image Dim myGraphics As System.Drawing.Graphics myGraphics = pbxSimpleBitmap.CreateGraphics() mylmage = lmage.FromFile("c:\bottichelli.jpg") mylmage.RotateFlip( _ RotateFlipType.Rotatel SOFlipNone) myGraphics.Drawlmage(mylmage, 0,0) mylmage.Save("c:\bottichelli.bmp") End Sub 4. Выполните приложение. В этом примере предполагается, что в корневом каталоге имеется файл botichelli.jpg. Вместо него можно указать любой другой файл формата BMP, GIF или JPEG. Модифицированный файл затем сохраняется в корневом каталоге под именем botichelli.bmp.
Использование Windows API воспроизведения звука В приложениях Visual Basic часто используются звуковые сигналы или фоновый звук, воспроизводящие звуковые файлы (обычно это файлы с расширением .wav). Хотя .NET Framework поддерживает только функцию Веер(), интерфейс с библиотеками СОМ обеспечивает полный доступ к аудио системе DirectSound — одной из технологий DirectX, доступных для мультимедийных приложений. DirectX включает следующие компоненты: •
DirectDraw. Обеспечивает быстрый доступ к оборудованию для воспроизведения игр, мультимедиа и анимации.
• DirectSD. Включает оптимизированные процедуры, обеспечивающие трехмерные эффекты. • DirectSound. Позволяет воспроизводить синхронные и асинхронные звуковые файлы, смешивать звуковые каналы и добавлять цифровые эффекты (эхо, хор и другие). •
DirectMusic. Обеспечивает расширенную поддержку форматов MIDI и WAV, что (в сочетании с аккордами, стилями и другими музыкальными данными) позволяет создавать музыку в динамике.
Глава 4. Примеры решений типичных задач
67
• DirectShow. Поддерживает медиа потоки, такие как отображение ASFлиний и воспроизведение DVD-содержания. • DirectPlay. Сетевые процедуры, позволяющие создавать приложения для нескольких игроков, включая игры в сети, через модем или Интернет. • Directlnput. Обеспечивает общий интерфейс для устройств ввода (таких как джойстик), а также использование более сложных, специфических устройств. В следующем примере демонстрируется использование системы DirectSound для воспроизведения файла типа WAV. Звуковой файл копируется во вторичный, а не в первичный буфер (который редко применяется напрямую). Первичный буфер является смешанным каналом, предназначенным для вывода данных. Если первичный буфер может быть только один, вторичных буферов может быть столько, сколько позволяют доступная память (RAM) и возможности процессора. Эти буферы могут затем использоваться для вывода информации через первичный канал. Следует учесть, что с каждой новой версией DirectX кардинально меняются многие аспекты доступа к интерфейсу. Этот пример, протестированный для DirectX 8, может не работать с другими версиями DirectX. 1. Создайте новый проект Windows Application в Visual Basic. 2. В меню Project щелкните на команде Add Reference. 3. В диалоговом окне Add References откройте вкладку СОМ и добавьте в проект элемент DirectX 8 for Visual Basic Type Library. Если вы впервые обращаетесь к этой библиотеке, появится диалоговое окно с предложением создать для нее обертку (wrapper). Щелкните на кнопке Yes, чтобы создать обертку типа .NET-to-COM. 4. В области General Declarations главной формы введите следующий код: Imports DxVBLibA 5. Добавьте командную кнопку и в свойстве Name укажите значение cmdPlaySound. 6. Введите следующий код для события Click для кнопки: Private Sub cmdPlaySound_Ciick() Dim myDSound As DirectSoundS Dim myBufDesc As New DSBUFFERDESCO Dim DBAs New DirectX8() Dim myBuffer As DirectSoundSecondaryBufferS 3'
68
Глава 4. Примеры решений типичных задач mybufdesc.guidSDAIgorithm = _ AUDIOCONSTANTS.GUID_DS3DALG_DEFAULT myDSound = D8.DirectSoundCreate(vbNullString) myBuffer = myDSound.CreateSoundBufferFromRle( _ "c:\winnt\media\Windows Logon Sound.wav", _ mybufdesc) 1 Перед воспроизведением звука для текущего окна ' должен быть задан CooperativeLevel myDSound.SetCooperativeLevel( _ Me.Handle.Tolnt32, CONST_DSSCLFLAGS.DSSCL_NORMAL) my Buffer. Play( _ CONST_DSBP~LAYFLAGS.DSBPLAY_DEFAULT) End Sub
7. Выполните приложение. Так как в примере используется конкретный файл в папке Media, возможно, вам придется изменить путь, чтобы указать файл типа .wav, имеющийся на вашем компьютере.
Отправка сообщений электронной почты через Outlook В Visual Basic довольно часто возникает необходимость в отправке сообщений электронной почты. Хотя MAPI (Messaging API) позволяет программировать пересылку сообщений любого типа, само программирование является довольно сложным. Проще воспользоваться Outlook, a сообщения, созданные таким образом, будут добавлены в папку Sent Items для последующей отправки. 1. Создайте новый проект Windows Application в Visual Basic. 2. В меню Project щелкните на команде Add Reference. 3. Воспользуйтесь вкладкой СОМ диалогового окна Add References, чтобы включить последнюю версию объектной модели Microsoft Outlook. 4. Добавьте следующий код в заголовок формы, заданной по умолчанию: Imports Outlook 5. Добавьте командную кнопку и в свойстве Name укажите значение cmdOutlookMail. 6. Введите следующий код для события Click для кнопки:
Глава 4. Примеры решений типичных задач
69
Sub cmdOutlookMail_Click() Dim objOutlook As New Outlook.Application() Dim objltem As Mailltem objltem = objOutlook.Createltem( _ OlltemType.olMailltem) With objltem .Subject = "VB.NETProgRef" .To = "[email protected]" .CC = "[email protected]" .Body = "I found this book useful" .Attachment.Add("c:\autoexec.bat") .Send() End With MsgBox("Mail sent.") End Sub 7. Выполните приложение. В этом примере предполагается, что в корневом каталоге имеется файл autoexec.bat. Адреса электронной почты заданы в интернетовском формате, но можно воспользоваться и стандартными именами (например, John Doe) из адресной книги — как это делается при отправке почты из Outlook.
Центрирование формы Обычно диалоговые окна нуждаются в центрировании относительно экрана. Данный пример извлекает из Windows размеры экрана и перемещает текущую форму в нужное положение. 1. Создайте новый проект Windows Application в Visual Basic. 2. Добавьте командную кнопку и в свойстве Name укажите значение cmdCenterForm. 3. Введите следующий код для события Click для кнопки: Private Sub cmdCenterForm_Click() Dim screenRect, formRect As Rectangle Dim ex, cy As Integer Dim sx, sy As Integer screenRect = Screen.PrimaryScreen.Boundsf) formRect = Forml .ActiveFormt. Bounds
70
Глава 4. Примеры решений типичных задач ' Определить центр экрана sx = screenRect.Width / 2 sy = screenRect.Height / 2 1 Определить центр формы сх = (formRect.Width / 2) + formRect.Left су = (formRect. Height/ 2) + formRect.Top 1 Сместить форму на нужное расстояние formRect.Offset(sx - сх, sy - су) Forml .ActiveForm.SetBounds(formRect.Left, _ formRect.Top, formRect.Width, formRect. Height)
End Sub 4. Выполните приложение.
Передача параметров исполняемому файлу Программы, запускаемые из среды Windows, могут включать параметры командной строки или имена файлов, перетащенных на значок исполняемого файла. Функция Command возвращает строку параметров, переданных файлу типа ЕХЕ. Этот пример извлекает строку параметров, преобразует ее в массив с помощью функции SplitQ и выдает сообщение, в котором указано число переданных параметров. 1. Создайте новый проект Windows Application в Visual Basic. 2. Введите следующий код для события Load для главной формы: Private Sub Form_Load() Dim fieldDelim As String = " Dim myCommands As String Dim myArgs() As String myCommands = Command() myArgs = myCommands.Split( _ fieldDelim.ToCharArray) МздВох("Исполняемому файлу был передано " & Umbound(myArgs) & _ " параметров") End Sub 3. Воспользуйтесь командой Build в меню Build, чтобы создать исполняемый файл.
Глава 4. Примеры решений типичных задач
71
4. В Windows перетащите любой файл на созданный исполняемый файл. В процессе выполнения программа определит число параметров, переданных приложению, и отобразит его в окне сообщения.
Отображение списка доступных шрифтов Свойство InstalledFontCollection позволяет определить, какие шрифты доступны для заданного устройства. В следующем примере показано, как извлечь из системы экранные шрифты и добавить их в качестве элементов в поле со списком, предназначенное для выбора шрифта. 1. Создайте новый проект Windows Application в Visual Basic. 2. Добавьте в форму элемент управления ComboBox и укажите в свойстве Name значение cboMyCombo. 3. Добавьте командную кнопку и укажите в свойстве Name значение cmdListFonts. 4. Введите следующий код для события Click для кнопки: Sub cmdListFonts_Click() DimmylnstalledFontsAsNew _ System.Drawing.Text.lnstalledFontCollection() Dim i As Integer For i = 0 to _ mylnstalledFonts.Families.Length -1 cboMyCombo.ltems.Add( _ MylnstalledFonts.Families(i).GetName(1)) Next End Sub
5. Выполните приложение.
Глава 5 XML Расширенный язык разметки XML (Extensible Markup Language) представляет собой формат хранения структурированных машинно-независимых данных. Этот стандарт был разработан консорциумом WC3 (World Wide Web Consortium) для упрощения обмена информацией между различными системами и приложениями. Microsoft включил XML практически во все области разработки Visual Studio. В частности, новая технология ADO.NET использует XML в качестве промежуточного формата при обмене данными между поставщиком и потребителем информации, а также для хранения любых источников данных, которые могут использоваться поставщиками. Для VB-разработчиков появление XML явилось настоящим подарком. С помощью синтаксического анализатора XML, предложенного Microsoft, можно легко читать, создавать и модифицировать иерархические файлы данных, ориентированные на человеческое восприятие. Это означает, что любое приложение может использовать файлы XML в качестве стандартного формата для хранения документов вместо громоздких произвольно структурированных двоичных или текстовых файлов. Подобно HTML, файлы XML можно открывать, просматривать и редактировать с помощью обычного текстового редактора. В этой главе дается общее представление об XML и излагаются основные принципы, которые могут послужить отправной точка для построения структурированных файлов с нуля. Вот пример очень простого XML-документа: Eyesand Ears <JerseyNumber>52 Zippy <JerseyNumber>7 <Деат>
Глава 5. XML
73
Первая строка кода идентифицирует файл как документ XML и объявляет используемую версию языка. За ней следует первый элемент <Теат>, являющийся корневым для документа. Корневой элемент содержит два вложенных элемента, соответствующих двум игрокам команды. Как видите, синтаксически этот файл напоминает формат HTML. В этой главе предполагается, что вы знакомы с нынешним стандартом HTML. Поскольку между HTML и XML существует тесная связь, многие уже известные вам правила HTML применимы к документам XML (включая общую структуру, разметку, определение элементов и тому подобное).
Различия между XML и HTML Файлы XML используют многие из правил, характерных для HTML. Собственно, при необходимости файл HTML можно без особых усилий преобразовать в XML. Тем не менее между этими двумя форматами имеется ряд существенных отличий, приведенных ниже. •
Все тэги должны быть парными. Некоторые тэги HTML (например, тэг абзаца <р>) не требуют закрывающего тэга (то есть, тэга р>). В XML все тэги должны быть открыты и закрыты.
• Документ должен включать раздел заголовка. В XML в начале документа должен располагаться заголовок, где указывается схема, которая используется для проверки содержащихся в файле данных. • Значения атрибутов должны быть заключены в кавычки. В HTML, если значение атрибута не содержит пробелов, можно опустить кавычки (например, IMG SRC=MyPict.GIF). В XML использование кавычек является обязательным (например, IMG SRC="MyPict.GIF"). • Внешние ресурсы должны быть объявлены в отдельных блоках. В HTML внешние ресурсы (например, GIF-файл в тэге IMG SRC) могут быть указаны в любом месте документа. В XML ссылки на файлы должны быть объявлены в отдельных блоках в начале документа. Если на них нужно сослаться в документе, вместо URL (как в HTML) используется имя ссылки на внешний ресурс. Примечание: Помимо парных тэгов, существует специальный формат тэгов, которые называются пустыми. Эти тэги не включают содержание и кодируются как один тэг, за именем которого следует прямой слеш, например: .
74
Глава 5. XML
Возможности XML Несмотря на сходство между двумя языками разметки, XML служит совершенно иным целям. Если документы HTML предназначены для отображения в броузере, документы XML представляют собой структурированные файлы данных самого широкого назначения. Такие файлы либо используются для отображения нестандартным образом, либо в качестве поставщиков данных. Как формат обмена данными XML имеет следующие преимущества. • Общий протокол с HTML. По умолчанию файлы XML пересылаются с помощью того же протокола HTTP, который используется для файлов HTML. Использование протокола HTTP позволяет пересылать XML-данные через защищенные сети. • Возможность частичной загрузки при переходе к определенной позиции документа. Чтобы перейти к определенному месту документа HTML, он должен быть полностью загружен. В XML возможна выборочная загрузка, пересылающая только нужную часть файла. •
Взаимодействие с SGML. SGML представляет собой исходный стандарт, на основе которого возник HTML. Документ, полностью соответствующий стандарту XML, будет также соответствовать стандарту SGML и может использоваться большинством программ, базирующихся на SGML.
•
Синтаксический XML-анализатор. Microsoft бесплатно предоставляет синтаксический XML-анализатор, который входит в комплект .NET, a также доступен как элемент управления ActiveX. Использование анализатора упрощает доступ к файлам XML из практически любой программы.
• Поддержка в ADO.NET. В добавление к прочим возможностям XML, ADO.NET предоставляет средства для экспорта любых данных в формате XML. • Стилевые таблицы XML. XML поддерживает новый тип стилевых таблиц, который называется XS (Extensible Styles). XS представляет собой более мощный, чем HTML, стандарт, известный как каскадные таблицы стилей уровня 1 или CSS1. • Использование стандарта Unicode. Хотя XML все еще поддерживает 8-битовый формат ASCII для текстовых файлов, рекомендуемым стандартом является Unicode. Благодаря этому стандарту файлы XML могут использоваться в приложениях, работающих с данными, содержащими международные наборы символов.
Глава 5. XML •
75
Структурированные запросы. Поскольку документ XML содержит структурированные данные, к ним можно применять фильтры, используя поля и типы данных в критериях отбора.
Структура XML документов Документы XML могут храниться в одном из следующих форматов: текстовый файл Unicode (по умолчанию), текстовый файл ASCII или двоичный файл. Двоичные файлы чаще всего используются для хранения изображений и другой неструктурированной информации. Документы XML имеют жесткую структуру, включающую следующие части: •
Заголовок. В заголовке указывается, что документ является файлом XML, и идентифицируется версия XML. Кроме того, заголовок может содержать установки, определяющие DTD, и другие характеристики документа. • Корневой элемент. Это основной элемент документа, внутри которого (между начальным и конечным тэгами) размещаются все остальные элементы. • Элементы. Фрагменты документа, содержащие данные, заключенные между начальным и конечными тэгами. Заголовок документа XML содержит сведения о типе документа и стандарте, которому он должен соответствовать. Заголовок размещается в начале файла и имеет следующий вид: Документы XML состоят из элементов. Например, элемент, определяющий прозвище (Nickname), может иметь следующий вид: Eyes and Ears Каждый документ XML может иметь только один корневой элемент. Это значит, что следующий документ является неправильным: My 1stheading.My another heading. Внутри корневого элемента может содержаться неограниченное число вложенных элементов. То есть, оба элемента, приведенные выше, должны находиться внутри корневого элемента.
76
Глава 5. XML My 1st heading.My another heading.
Аналогичное правило, касающееся корневого элемента, существует и в HTML. Абсолютно вся информация, содержащаяся в файле HTML, должна размещаться внутри парного тега . Помимо элементов, описывающих поля данных, в XML имеется несколько тэгов и атрибутов, имеющих специальное назначение.
Тэги символьных данных Тэг CDATA предназначен для включения в документ символьных данных. Эти данные могут содержать такие символы, как кавычки, не требуя специальных символов (escape characters) для их выделения. Например:
Testing of "character data" system. ]]> Атрибуты включения пробелов Атрибут XML-SPACE управляет включением в документ последовательности пробелов. Если задана установка Preserve, то в окончательную версию документа включаются все пробелы. По умолчанию включается только один пробел. Следующий пример демонстрирует использование этого атрибута: <1_> Начальные пробелы игнорируются. !_> XML-Space="PRESERVE"> Пробелы сохраняются.1_> XML-Space="DEFAULT'> Пробелы игнорируютсяХ/О
Тэги XML-Link XML обладает гораздо более развитыми возможностями по созданию связей, чем HTML. Помимо обычных гиперссылок, XML позволяет использовать двусторонние связи (работающие в двух направлениях) или многоцелевые связи (обеспечивающие переход к нескольким объектам). В XML связи делятся на два типа: • •
Простые. Это гиперссылки, аналогичные тем, что используются в HTML. Расширенные. Расширенные связи позволяют устанавливать связь с несколькими объектами (или источниками), а также размещать информацию о связях вне документа. Размещение связей в отдельном файле упрощает их сопровождение.
Простая связь определяется так же, как и обычная связь HTML. Например:
Глава 5. XML
77
myLJnk Эта же связь может быть определена с помощью тэга LINK, как показано в следующем примере: < UNK="SIMPLE" HREF="http://www.w3c.org/XML">myLink Определение расширенной связи может быть отделено от ее применения в документе. Например, следующая связь может использоваться в обоих направлениях: < LINK="EXTENDED" ROLE="sibling"> < LOCATOR HREF="#firstPara"TITLE="Number1"/> < LOCATOR HREF="#secondPara"TITLE="Number2"/> Тогда в основном тексте документа XML объекты перехода будут идентифицироваться с помощью атрибута ID: < Р ID="firstPara">This is the start. < P ID="secondPara">This is the end.
Тэги комментариев Комментарии в XML играют ту же роль, что и в HTML. Однако, используя комментарии, будьте осторожны. Для большинства синтаксических XML-анализаторов комментарии не относятся к информации, которая подлежит перезаписи. Поэтому, если файл XML прочитан, обработан анализатором, а затем сохранен в другом месте, комментарии скорей всего будут утеряны. Вот пример использования комментария в XML.