    Воронцов С. И., Храмов И. А. 
    Microsoft Visual Basic 5.0: 
    ActiveX, DLL, Internet и другие ... 

    Microsoft Visual Basic — сегодня самая популярная в мире система проектирования 
приложений для Windows. 
    В предлагаемой книге в первых главах дается обзор возможностей, которыми 
сегодня располагает разработчик в Visual Basic. Освещаются основные положения 
реализованной в Visual Basic модели событийно-управляемого программирования, 
кратко рассматриваются элементы языка Visual Basic, общие шаги процедур 
визуального проектирования, создания интерфейса приложения и написания 
программного кода. Далее описываются простые и расширенные возможности доступа 
и работы с данными: работа с данными через элемент управления Data и через 
интерфейс DАО. Освещается объектная модель и реализованные в DАО возможности 
программирования доступа к данным. 
    Подробно рассматривается в книге и такой важный раздел создания приложений 
(о котором часто "забывают"), как построение отчетов для распечатки твердых 
копий документов. Ряд глав книги адресуется достаточно искушенным 
разработчикам. Здесь подробно обсуждаются животрепещущие вопросы, волнующие 
сегодня программиста, но которые в значительной мере обделены вниманием в 
литературе. Это такие темы, как: создание и работа с библиотеками динамической 
компоновки (DLL); применение прогрессивной технологии СОМ (Компонентная 
Объектная Модель); создание компонентов AciiyeX — элементов управления, 
документов и программных компонентов; реализация в Visual Basic возможностей 
построения средств доступа и работы в Internet и внутренних сетях; 
инструментарий для создания дистрибутивных пакетов для тиражирования программ. 

    Ответственный за выпуск С. Иванов 
    Макет и верстка С. Тарасов 
    Обложка А. Микляев 
    ISBN 5-85954-072-8	© "СОЛОН" 1998 
    © Воронцов С. И., Храмов И. А. 


    Предисловие  3

    Предисловие 

    Microsoft Visual Basic — сегодня самая популярная в мире система 
проектирования приложений для Windows. Среда Visual Basic может с успехом 
использоваться начинающими пользователями для познания секретов 
программирования и увлекательных занятий по созданию несложных (поначалу) 
приложений и, в то же время, предоставляет мощные инструменты разработки 
опытным программистам. Чрезвычайно развитые справочная система, средства 
обучения, мастера и программы-надстройки позволяют при построении приложения и 
работе в Visual Basic найти выход из любой ситуации и получить ответ на пюбой 
вопрос. Начинать работать с Visual Basic можно практически с любым уровнем подготовки. 
    Шесть лет назад Microsoft Corporation совершила революцию в подходах к 
разработке приложений. Свершилось невероятное: начинающие программисты 
получили возможность писать программы для Windows! Как результат 
популярность профессии программиста возросла до небес и сегодня в мире только 
на Visual Basic работают, по оценке Microsoft, четыре миллиона программистов, 
с невиданной до этого производительностью создавая решения на любой вкус — от 
программ, обслуживающих рутинные операции ввода данных, цо сложных 
информационных коммуникационных систем. 
    Visual Basic версии 5.0 предоставляет широкую гамму инструментальных 
средств, среди которых все необходимое для себя найдет как начинающий 
программист, возможно, лишь недавно решивший попробовать что-то создать (для 
него есть редакции Standard и Learning), так и "зубр" в программировании 
(редакции Professional и Enterprise). Новичок, например, сможет с помощью 
мастера Application Wizard для начала создать первую версию приложения, на 
примере которого затем можно будет изучить азы визуального программирования и 
подходы Visual Basic. Перед опытным мастером возможности в Visual Basic вообще 
безграничны: это и создание собственных компонентов ActiveX, и работа с 
широким диапазоном данных, и реализация технологий Internet, и, наконец, 
доступ к самым сокровенным возможностям Windows. 
    В предлагаемой книге в первых главах дается обзор возможностей, которыми 
сегодня располагает разработчик в Visual Basic. Описываются основные положения 
реализованной в Visual Basic модели событийно-управляемого программирования, 
кратко рассматриваются элементы языка Visual Basic, общие шаги процедур 
визуального проектирования и создания интерфейса приложения и написания 
программного кода. Далее описываются простые и расширенные возможности доступа 
и работы с данными, а также подробно рассматривается такой важный раздел 
создания приложений, как построение отчетов для распечатки твердых копий 
документов. 
    Главы с 6-ой по 12-ю адресуются достаточно искушенным разработчикам. Здесь 
подробно излагаются "животрепещущие" вопросы, волнующие сегодня программиста: 
создание и работа с библиотеками динамической компоновки (DLL); дается обзор 
прогрессивной технологии СОМ (Компонентная Объектная Модель); подробно 
описываются шаги создания компонентов ActiveX — элементов управления, 
документов и программных компонентов; рассматриваются реализованные в Visual 
Basic возможности построения средств доступа и работы в Internet и внутренних 
сетях; описываются средства создания дистрибутивных пакетов для тиражирования 
разрабатываемых проектов Visual Basic. 

4  Событийно-управляемое программирование

    Глава 1.   Введение в Visual Basic 

    В этой главе тезисно описываются некоторые из базовых концепций Visual 
Basic. В сра нии с процедурной моделью структурного программирования 
представлена реализован в Visual Basic 5 событийно-управляемая модель. Далее 
рассматриваются общие и процедур визуального проектирования, создания 
интерфейса приложения, написав отладки программного кода, компиляции 
приложения. Материал этой и следующей гл позволит читателю быстро начать 
строить простые приложения, которые в дальней! можно будет развивать и совершенствовать. 

    1.1. Событийно-управляемое программирование 

    В традиционной, или процедурной, модели приложение управляет 
последовательность! которой выполняются части программного кода. Выполнение 
приложения начинаете первой строки кода и следует стандартным путем через 
приложение; программные прс дуры вызываются по мере необходимости. 
    Visual Basic происходит из языка структурного программирования BASIC. В 
нем, однако, рег зуется событийно-управляемая модель программирования. В 
событийно-управляемом npk жении выполнение не следует предопределенным путем. 
Вместо этого програк отрабатывает различные разделы кода в ответ на события. 
События могут быть вызв; действиями пользователя, сообщениями от системы или 
другого приложения или самим п ложением. Последовательность выполнения кода 
определяется последовательностью со тий. Следовательно, поток выполнения кода 
приложения в каждом сеансе будет другим. 
    Существенная часть событийно-управляемого программирования состоит в 
написании да, призванного отвечать на возможные события, которые могут 
происходить в приложен Visual Basic для реализации событийно-управляемой 
модели предоставляет все необхо, мые средства. 
    На следующей иллюстрации показаны некоторые действия, генерирующие 
события, которые можно отвечать, написав и ассоциировав с ними программный 
код. Эти собьп могут происходить в любом порядке. 

    Ввод значения в поле 


    Рис. 1.1. Инициирование событий. 

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

    IF Событие THEN Действие, 

    где Действие — программная процедура, определенная разработчиком, либо 
некоторс умолчательное действие Visual Basic. 

    Глава 1. Введение в Visual Basic	5 

    1.2. Редакции Visual Basic 5 

    Visual Basic версии 5 доступен.Емщех^редакциях, каждая из которых 
обеспечивает определенный набор инструментов разработки. 

    Standard Edition	Visual Basic Standard Edition позволяет создавать достаточно 
    мощные приложения для Microsoft Windows 95 и Windows NT. Эта редакция 
включает все встроенные элементы управления Visual Basic, включая связанные 
(data-bound) элементы управления. 
    
    Professional Edition	Редакция Professional обеспечивает 
полно-функциональный набор инструментальных средств для разработки 
профессиональных решений, предназначенных для тиражирования. Она включает все 
возможности Standard Edition плюс дополнительные элементы управления ActiveX, 
включая элементы'управгю^ ния~для Internet и генератор отчетов Crystal Reports 
для Visual Basic (рассматривается в главе 5). " 

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

    Enterprise Edition	Редакция Enterprise позволяет создавать распределенные 
приложения силами группы разработчиков. Она обеспечивает все возможности 
редакции Professional и включает также дополнительные функции, такие, как 
Automation Manager, Component Manager, инструментальные средства управления 
базами данных и Microsoft Visual SourceSafe — проект-ориентированная система 
управления версиями продуктов. 

    1.3. Создание приложений в Visual Basic 

    Создание приложения в Visual Basic включает следующие два базовых шага: 
    1. Построение пользовательского интерфейса приложения. 
    2. Написание программного кода, который отвечает на действия, 
предпринимаемые в пользовательском интерфейсе. 

    1.3.1. Разработка интерфейса пользователя 

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

    1.3.2. Использование панели элементов 

    Используя панель элементов, разработчик рисует или помещает в форму 
элементы управления, создавая визуальные компоненты приложения. Панель 
элементов содержит встро

6

    Создание приложений в Visual Bas, енные элементы управления Visual Basic и 
подключенные элементы управления Active или любые внедряемые объекты, которые 
разработчик добавил к проекту. Если пане/ элементов закрыта, ее можно открыть, 
щелкнув соответствующую кнопку панели инстр ментов либо выбрав команду Toolbox 
в меню View. Панель элементов доступна только t время разработки. 

    Рис. 1.2. Панель элементов Visual Basic (умолчательная компоновка изменена). 

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

    Добавление элементов управления к панели элементов 

    Панель элементов может быть расширена добавлением к ней элементов 
управления Acl veX. Дополнительные элементы управления ActiveX доступны в 
редакциях Visual Bas Professional и Enterprise. Можно также подключать 
элементы управления ActiveX сторонни разработчиков или свои собственные. 
    Чтобы добавить элемент управления ActiveX к панели элементов: 
    1. В меню Project выбрать команду Components или ввести <Ctrl + Т>. Visual 
Basic выводит на экран окно диалога Components (рис. 1.3). 
    2. На вкладке Controls установить флажок элемента управления, который 
требуется по,с ключить к проекту, и затем щелкнуть ОК или Применить. 
    Visual Basic добавляет элемент управления к панели элементов. 

    Именование элементов управления 

    При именовании элементов управления рекомендуется следовать стандартным 
соглашен ям именования пользовательского интерфейса и элементов управления. 
Это позволяв упростить чтение и отладку программного кода. В именах элементов 
управления удобн проставлять префикс, однозначно указывающий на тип (класс) 
этого объекта. Ниже приве дены рекомендуемые соглашения для некоторых 
элементов управления Visual Basic. 

    Тип элемента управления	Префикс	Пример 

    AniButton	ani	aniMailBox 
    CheckBox	chk	chkReadOnly 
    ComboBox	cbo	cboRussian 
    CommandButton	cmd	cmdExit 
    CommonDialog	dig	dlgFileOpen 

    Элемент управления (используется в процедурах, когда конкретный тип не определен)	ctr	ctrUnknown 

    re Глава 1. Введение в Visual Basic	7 

    Components 

    Controls I Designers ) Insertabie Objects 

    [V] Microsoft Internet Controls 
    LJ Microsoft Internet Transfer Control 5.0 
    П Microsoft MAPI Controls 5.0 
    U Microsoft Masked Edit Control 5,0 
    i ] Microsoft Multimedia Control 5.0 
    G Microsoft Outline Control 
    LJ Microsoft PictureClip Control 5.0 
    П Microsoft Rich Textbox Control 5.0 
    С Microsoft Syslnfo Control 5.0 
    ,3 
    Microsoft Tabbed Dialog Con1 
    JJ    M    jrr 
    «-_ ! aaa '"'     fe-_   2B 
    L^] 
    П Microsoft Windows Common Controls 5,0 П Microsoft Windows Common 
Controls-2 5.0 V1 Microsoft Winsock Control 5.0 LJ RealAudio ActiveX Control Library 
    Microsoft Tabbed Dialog Control 5.0 —— ————— Location:    С: 
\WINDOW5\5YSTEM\TABCTL32. OCX 
    Browse,,. 
    ^J     $~~ Selected Items Only 
    OK 
    Отмена 
    Применить 

    Рис. 1.3. Окно диалога Components. 

    Тип элемента управления	Префикс	Пример 

    Data control	dat	datOrders 
    Data-bound ComboBox	dbcbo	dbcboLanguage 
    Data-bound Grid	dbgrd	dbgrdQueryResult 
    Data-bound list box	dblst	dblstSchetType 
    Directory. ListBox	dir	dirSource 
    Drive ListBox	drv	drvSource 
    File ListBox	fil	filSource 
    Form	frm	frmSchet 
    Frame	fra	fraLanguage 
    Gauge	gau	gauStatus 
    Grid	grd	grdTovar 
    Horizontal ScrollBar	hsb	hsbVolume Image	img	imglcon 
    Label	Ibl	IblHelp 
    Line	lin	linVertical 
    ListBox	1st	IstOrder 

    MAPI message	mpm	mpmSentMessage 

8

    Создание приложений в Visual Ba 
    Тип элемента управления	Префикс	Пример 
    MCI	mci	mciVideo 
    MDI Child Form	mdi	mdiNote 
    Menu	mnu	mnuFileOpen 
    MS FlexGrid	msg	msgClients 
    MS Tab	mst	mstFirst 
    OLE	ole	oleWorksheet 
    Outline	out	outOrgChart 
    Picture	pic	picVGA 
    PictureClip	clp	cIpToolbar 
    Shape	shp	shpCircle 
    Spin	spn	spnPages 
    TextBox	txt	txtFlO 
    Timer	tmr	tmrAlarm 
    UpDown	upd	updDirection 
    Vertical ScrollBar	vsb	vsbRate 
    Slider	sld	sldScale 
    ImageList	ils	ilsAlllcons 
    Toolbar	tlb	tlbActions 
    StatusBar	sta	staDateTime 
    ListView	Ivw	IvwHeadings 
    ProgressBar	prg	prgLoadFile 
    RichTextBox	rtf	rtfReport 
    V 

    Работа с объектами и классами 

    Объект — комбинация кода и данных, которая обрабатывается как единица. 
Объект мо» быть элементом приложения, таким как элемент управления или форма. 
Он может так представлять все приложение. 
    Класс— шаблон для объекта, точно так же, как чертеж на синьке — шаблон для 
детали и дома". Все объекты создаются как идентичные копии, или экземпляры, их 
класса. После то Kaj<jgjiH^O3,qaHbjj^cy^LyecTBYtgT как отдельные объекты, их 
свойства могут быть изменен причем этйТГзмёнёнйя никак не воздействуют ни на 
сам класс, ни на другие экземпляры. 
    В Visual Basic каждый объект также определен классом. Элементы управления 
в пане элементов представляют классы. Когда элемент управления размещается на 
форме, соз,с ется объект класса этого элемента управления. 
    Использование свойств и методов объекта 
    Все объекты имеют свойства и методы. Свойства — значения, которые 
устанавливают для определения вида и поведения объекта. Методы — программные 
процедуры, обесп чивающие выполнение объектом некоторых предопределенных действий. 
    Например, форма обеспечивает метод Show, который обусловливает вывод формы 
на экран.
    Главное преимущество работы с объектами в том, что объекты обеспечивают 
программнь код, который уже не требуется писать разработчику. Ему просто нужно 
установить свойст! объекта и вызвать методы объекта, чтобы побудить объект 
выполнить требуемые функци 

    Глава 1. Введение в Visual Basic 9 

    1.3.3. Работа со свойствами 

    При формировании пользовательского интерфейса приложения Visual Basic для 
создаваемых объектов необходимо установить свойства. 
    'Многие свойства могут быть установлены во время разработки. Чтобы 
установить эти свойства, можно использовать окно свойств или страницы свойств 
(окно Property Pages). 

    Примечание: Информацию относительно создания страниц свойств см. в разделе 
"Создание страниц свойств" в главе 9 "Создание элементов управления ActiveX". 

    "Чтобы обратиться к окну свойств, нужно нажать кнопку Properties на панели 
инструментов либо щелкнуть правой кнопкой мыши объект и затем выбрать 
Properties, либо в меню View 
    - выбрать команду Properties Window, либо нажать клавишу_<Р4>. Если в 
форме выделено несколько объектов, в окне свойств выводятся'тблько свойства, 
общие для всех выделен-1ных элементов управления. Любые изменения, проведенные 
в свойстве, применяются ко 1всем элементам управления. На рис. 1.4 сравните 
количество свойств в_категории Арреа-псе, выводимых при выборе одного элемента 
управления (часть А) и группы элементов правления (часть Б). 

    :d 

    Рис. 1.4. Окно свойств при выборе одного и нескольких элементов управления. 

    В Appearance 
    Appearance 
    iBackColor 
    Caption 
    DisabledPicture 
    DownPicture 
    MaskColor 
    Style UseMaskColor 
    ,1-3D 
    Command 1 .(None) ""7     ~"J~~ '(None) 
    Ц &HQOCDCQCQ& (None) 0 - Standard False 
    И 
    i нрреагапсе 
    BackColor В Behavior 
    DragMode 
    Enabled 
    OLEDropMode 
    RightToLeft 
    TabStop 
    Visible 
    1 -3D 
    0 - Manual 
    True 
    0 - None 
    False 
    True 
    True 

    10 Создание приложений в Visual В, 

    Чтобы выбрать несколько элементов управления, нужно щелкнуть на полотне 
форк растянуть мышью область вокруг этих элементов управления. 
    В период выполнения установить или отобрать значения свойств можно, 
написав охл ствующий программный код. В следующем фрагменте для текстового 
поля txtData уста ливается полужирный стиль шрифта. 
    txtData.Font.Bold =  True   '   Устанавливает  полужирный  текст Этот 
оператор устанавливает значение свойства Text текстового поля txtData: 
    txtData.Text  =   "Visual   Basic   5"   '   Установка   значения   свойства 
    ^слдимя свойства опустить, устанавливается умолчательное свойство 
элемента^пра ния. Например, умолчательное свойство текстового поля 
—"свойствоText, умолчатель свойство надписи (Label) — свойство Caption.     
    В следующем фрагменте устанавливаются умолчательные свойства Text и 
Caption текстового поля и надписи: 
    txtData = "Установка свойства Text или текстового поля" IblData = 
"Установка свойства Caption надписи" 
    Получение значений свойств в период выполнения 
    Чтобы получить значение свойства в период выполнения, можно использовать 
приме следующий код: 
    Dim sName As  String sName  =  txtName.Text 

    1.3.4. Работа с меню 

    Функциональность приложения можно расширять, добавляя к нему систему меню. 
Mi обеспечивают пользователей удобным способом доступа и выполнения команд. 
    Menu Editor — интерактивный инструмент, который позволяет создавать и 
изменять мен минимумом программирования. С помощью Menu Editor можно добавлять 
новые команд существующим меню, заменять существующие команды меню на команды 
разработчика, здавать новые меню и строки меню, изменять и удалять 
существующие меню и строки мен 
    Чтобы создать меню для формы: 
    1. Нажать кнопку Menu Editor на панели инструментов (или выбрать команду 
Menu Editi меню Tools или ввести с клавиатуры <Ctrl + Е>), чтобы вывести на 
экран окно диал Menu Editor. 
    2. В поле Caption ввести имя меню или команды, которое должно появиться в 
строке ме 
    3. Используя кнопки со стрелками вверх и вниз, можно изменять позицию 
элемента мен списке. 
    4. Используя кнопки со стрелками влево и вправо, можно создавать уровни 
команд Mei Команда без многоточия (без смещения) — название меню в строке меню. 
    5. При установке флажка Checked команда меню получает пометку (то есть 
состояние умолчанию — см. команду "С графикой" на рис. 1.5). 
    6. Установив или сняв флажок Enabled, можно включить или отключить команду 
(см. ком ду "Отправить сообщение"). 
    7. Список Shortcut содержит выборы для назначения командам меню клавиш 
быстр^ доступа. 


    12     

    Написание программного KOI 

    В этом разделе показано, как создавать процедуры обработки событий и общие 
процедур рассматривается область определения процедур и использование окна 
Object Brows* Здесь также обсуждаются различные типы данных, доступные в 
Visual Basic, объявлени областъ_дпределения и период существования переменных. 

    1.4.1. Создание процедур 

    В Visual Basic имеется два типа процедур: процедуры обработки событий и 
общие процедур 

    Процедуры обработки событий 

    Visual Basic автоматически вызывает процедуры обработки событий в ответ на 
действия клавиатуры, мышью или системные действия. Например, командные кнопки 
имеют проц дуру обработки события Click (щелчок мыши). Код, который помещается 
в процеду[ обработки события Click, будет выполнен, когда пользователь щелкнет кнопку. 
    Чтобы открыть окно редактирования кода, нужно дважды щелкнутъ элемент 
управления и/ форму или выбрать команду Code в меню View. 
    Каждый элемент управления имеет фиксированный набор процедур обработки 
событ!/ (для каждого поддерживаемого объектом события). Эти процедуры для 
каждого элемет управления перечислены в раскрывающемся списке Procedure в окне кода. 

    IP Project! - Form'1 (Code) 
    Form 
    •*•      Load 
    Priuate Sub cndOK_Clicg^« MsgBox "UisualgJH J^djSub_____________ Deactivate 
    DragDrop Drag Over 
    r,   •	f.   ..   r-          .       .., GotFocus Priuate Sub Form_Load( ЫТ№ 
    KeyDown 
    End   Sub	KeyPress 
    KeuUp Link Close 
    
    Рис. 1.6. Список Procedure для кнопки. 

    Следующий фрагмент кода — процедура обработки события Click для командной 
кнопю cmdOK: 

    Private  Sub  cmdOK_Click() 
    MsgBox   "Visual   Basic"   '   Открыть   окно   сообщения End  Sub 


    Общие процедуры 

    Общие процедуры — процедуры Sub или Function, создаваемые для выполнения 
опреде ленных задач. В отличие от процедур обработки событий, чтобы выполнить 
общую проце дуру, ее нужно явно вызвать. 
    Чтобы создать общую процедуру, следует открыть окно кода и выбрать Add 
Procedure i меню Tools. Можно также создать новую процедуру, печатая на пустой 
строке в окне код; заголовок процедуры Sub, сопровождаемый именем процедуры. 
Если в нескольких

    Глава 1. Введение в Visual Basic 13 

процедурах обработки события имеется дублирование кода, этот код можно 
поместить в общую г' процедуру и затем вызывать общую процедуру из процедур 
обработки событий. 
    (Процедуры Sub 
    Процедуры Sub не возвращают_аыачений — они только выполняют некоторую 
обработку [или действие. Вызвать процедуру Sub можно, специфицируя только имя 
процедувы_или '• .используя оператор Call с именем процедуры и параметрами. Например: 
    h 
    all   sortList("namel") 
    z Если используется оператор Call, список параметров следует заключить в 
круглые скобки. - Если Call опускается, опустить нужно также скобки вокруг 
списка параметров. /         ~~~-~""~ Процедуры Function 
    1 Процедуры Function выполняют действие и возвращают значения. В следующем 
фрагменте процедура Function получает число и возвращает квадрат этого числа. 
    i  Function   Square(I   As   Integer)   As   Integer I        Square  
=1*1 End  Function 
    Если требуется сохранить возвращаемое значение, при вызове функции 
необходимо использовать круглые скобки, как в следующем операторе: 
    j   =  Square (5) 
    Если круглые скобки опущены, возвращаемое значение {можно ^""РИДПРШТЫ^П^ 
4ft l~"vPg1
    """———•——••"""——•••?iijiL.        ...i^.-.	at If   -"••''" '"''• 
••-:-..•!•-•• '      ' '        '       -            *"    '"^V, -,   n«,t     
      -К1..Л.,.              ",«-.-• «•'*>|i"f"*1"**lw~!''"*.'V •'-*">№-'• 
1W*"'"**1'"'1™'                 """———"""""        ™"""                        
  T-J^^^ 
    дать его в,пейШШЙЩь Это может быть полезно, если'требуется лишь выполнить 
обработку, связанную с функцией. Например:	~——      - -   ---... 
    Square   5 
    Примечание: Процедуры Sub и Function могут принимать и изменять параметры. 
Чтобы определить параметры как необязательные, можно использовать ключевое 
слово Optional. 

    1.4.2. Область определения программного кода 

    I Кроме добавления кода к модулю, ассоциированному с формой, можно также 
объявлять процедуры в стандартных модулях. Стандартные модули сод^жахтрлькр 
код Visual Basic; они предназначены для хранения кода, который не 
привязывается к определенной форме. 
    Процеду?ьм\логут быть объявлены как Private или Public. Процедуры Private 
могут вызывать-ся"только друг!Гм"й"1г1^Цеду'ра"|МЙТ]йзмёщённь1ми выданной 
форме, модуле или классе. 
    1    Процедуры Public в модуле форме становятся методами формы. Такую 
процедуру можно вызвать отовсюду в приложении, специфицируя имена процедуры и формы. 
    Процедуры Publjc^^ni^cjHHbie_BgTajjfla^HjC^M_M^c^ne, доступны из любого 
места в приложении и могут вызываться специфицированием только имени процедуры. 
    Ниже объявляется процедура Public: 

    Public   Sub   Prod () 
    End  Sub 
    Если эта процедура объявлена в модуле формы, вызывается она следующим образом: 
    Forml. Prod 
    V 

    14 Написание программного кода

    Если процедура объявлена в стандартном модуле, вызывается она так: 

    Prod 

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

    Modulel.Procl 

    Окно Object Browser 

    После того, как к приложению добавлен некоторый программный код, в окне 
Object Brov можно увидеть все созданные процедуры, быстро перейти к 
определенной процедуре вставить вызов процедуры в текст программы в окне кода. 
    В окне Object Browser показаны классы, доступные из всех объектных 
библиотек, подк ценных к проекту. 
    Чтобы вывести на экран Object Browser, нужно нажать <F2>, либо нажать 
кнопку ОЬ Browser на панели инструментов, либо выбрать команду Object Browser 
в меню View. 
    На следующей иллюстрации показаны компоненты Object Browser. 

    n, Projectl - Microsoft Visual Basic [design] - [Object Browser] 
    L.lDix] 0 File   Edit   View   Project   Format   Debug   Bun   j_0ols   
Add-Ins   Window   Help   _-1 ff I XJ 
    -13. 
    & B,| * 
    SI    ю 
    * 
    Проект/ 
    ^ библиотека «* '.—.J—J JSb*— _JLJ 
    ЗМь!	,___ 
    Members of Classr	? Компоненты 
    Й1 gsUser -\ Свойство 
    Forml 
    =» ShowDate 
    класса 4=) Copy 
    Private Class Class 1 Member of Proiectl 
    /Панель \   описания 
    View Definition 
    Find Whole Word Only Group Members Show Hidden Members : References... Properties,,, 
    f Hejp 
    Dockable 
    Hide 

    Рис. 1.7. Окно Object Browser и контекстное меню Object Browser. 

    i. Глава 1. Введение в Visual Basic	15 


    1.4.3. Переменные, константы и типы данных 

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

    Для объявления переменной используется оператор Dim. В следующем операторе 
объявляется переменная iCounter типа Integer. 

    Dim  iCounter  As   Integer 

    Хотя Visual Basic позволяет использовать необъявленные переменные, текст 
кода будет проще в отладке и сопровождении, если все переменные объявлять 
явно. Чтобы не забывать делать объявления переменных, нужно в раздел General 
Declarations формы или модуля ввести оператор Option Explicit. После этого при 
попытке использовать необъявленную переменную Visual Basic вернет ошибку компиляции. 
    Чтобы оператор Option Explicit автоматически включался во всех новых проектах: 
    1. В меню Tools выбрать команду Options. 
    2. В окне диалога Options открыть вкладку Editor и установить флажок 
Require Variable Declaration. Нажать ОК. 

    Объявление констант 

    Константы объявляются оператором Const. Значение объявленной константы 
изменять нельзя. 
    В следующем операторе объявляется константа PI типа Single: 

    Const   PI   As   Single   =3.14 

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

    iResult   =  MsgBox   ("Продолжить?",   vbYesNo) 
    If  iResult  =  vbYes  Then '   Некоторое  действие 
    End If 

    1.4.4. Использование типов данных 

    Тип данного переменной определяет тип информации, которую может хранить 
переменная, и интервал возможных значений. Например, если требуется, чтобы 
переменная действовала как счетчик для цикла, ей можно назначить тип данного Integer. 
    Visual Basic обеспечивает несколько числовых типов данных — Integer 
(целое), Long (длинное целое), Single (число с плавающей точкой одинарной 
точности), Double (число с плавающей точкой двойной точности), Decimal 
(масштабируемое целое) и Currency (денежный тип). Использование числового типа 
данных обычно требует меньшего количества памяти, чем тип Variant. Числовые 
типы данных приведены в следующей таблице: 

    Тип	_                                                        Размер области 

    Описание данных	памяти 
    Используется для денежных или фиксированных расчетов Р	с десятичными 
дробями, при которых важна точность. Диа-           я б " пазон значений — 
_____ от -922,337,203,685,477.5808 до 922,337,203,685,477.5807. 

    16     Написание программного KOI 

    Тип данных	Описание	Размер облает памяти 

    Double	Число с плавающей точкой двойной точности. Диапазон отрицательных 
значений — от -1.7976931 3486232Е308 до -4.94065645841 247Е-324. Положительные 
   значения    варьируют    в    диапазоне    от 4.94065645841 247Е-324 до 1. 
7976931 3486232Е308.	8 байт 
    Integer	Малые целые числа. Диапазон от -32,768 до 32,767.	2 байта 
    Long	Большие целые числа. Диапазон от -2,147,483,648 до 2,147,483,647.	4 байта 
    Decimal	(масштабируемое целое) ± 79 228 162 514 264 337 593 543 950 335 
без дробной части; ±7,9228162514264337593543950335 с 28 знаками справа от 
запятой;   минимальное  ненулевое  значение   имеет  вид 
±0,0000000000000000000000000001.  В настоящее время поддерживается 
использование типа данных Decimal только в пределах типа Variant, то есть 
описать переменную с типом Decimal невозможно. Пользователь, однако, имеет 
возможность создать переменную типа Variant с подтипом Decimal с помощью 
функции CDec.	14 байт 
    Single	Число с плавающей точкой одинарной точности. Диапазон отрицательных 
значений — от -3.402823Е38 до -1.401298Е-45. Диапазон положительных значений — 
от 1.401298Е-45 до 3.402823Е38.	4 байта 

    Если переменная будет содержать двоичные данные, ее нужно объявить как 
массив тиг данных Byte. Использование переменных Byte для хранения двоичных 
данных позволж сохранить их во время преобразований формата. Например, когда 
переменные Strir преобразуются из формата ANSI в Unicode, любые двоичные 
данные в переменной разр шаются. Visual Basic может автоматически 
преобразовывать данные из ANSI в Unicode пр 
    •   чтении из файлов; 
    •   записи в файлы; 
    •   вызовах DLL; 
    •   вызовах методов и свойств объектов. 
    Все операции, которые работают с целыми числами, работают также с типом 
данных Byt< за исключением унарного минуса. Так как Byte — беззнаковый тип 
данных с интервалом О 255, он не может представлять отрицательное число. 
Поэтому перед выполнением оперг ций с унарным минусом Visual Basic сначала 
переводит Byte в целое число со знаком. 
    Если переменная всегда будет содержать только строковые данные, ее нужно 
объявит типа String: 

    Private   S  As   String 

    После этого переменной можно присваивать строковые значения и 
манипулировать ек используя строковые функции: 

    S  =   "Database" S   =  Left (S,   4) 

    Существует два типа строковых значений: 

    'а   Глава 1. Введение в Visual Basic	17 

    строки переменной длины, которые могут содержать приблизительно до 2 
миллиардов (2   ) си"мво~лов; 
    •  строки постоянной длины, которые могут содержать от 1 до приблизительно 
64К (216) I       символов. 
    '	О Примечание: Не допускается использование в модулях класса строк 
постоянной длины, описанных с ключевым словом Public. 
    По умолчанию, строковая переменная или параметр — строка переменной длины; 
строка увеличивается или сокращается по мере присвоения ей новых данных. 
    Синтаксис объявления строки фиксированной длины следующий: 
String * размер 

    Например, объявить строку, длина которой всегда будет 50 символов, можно 
следующим образом: 

    Dim  strName  As   String   *   50 

    Если такой переменной присваивается меньше чем 50 символов, strName до 50 
символов дополняется_пробела.м.и. Если переменной присваивается слишком 
длинная строка, Visual BisTcfnpocTo усекает лишние символы. 
    Так как строки фиксированной длины дополняются замыкающими пробелами, при 
работе с ними могут быть полезны функции Trim и RTrim, которые удаляют лишние пробелы. 
    Строки фиксированной длины в стандартных модулях могут быть объявлены как 
Public или Private. В модулях форм, отчетов и классов такие переменные должны 
объявляться только как Private. 
    Если имеется переменная, которая будет содержать только значения типа 
Истина/Ложь, Да/Нет или Вкл/Выкл, то для этой переменной можно объявить тип 
данных Boolean. Значение по умолчанию для этого типа — False. В следующем 
примере переменная blnRunning типа Boolean сохраняет значение Да/Нет: 

    Dim blnRunning  As   Boolean 
    '   Проверить,   проигрывается  ли  трек :	If   CDPlayer.Direction  =   1  
 Then 
    blnRunning  =   True End  if 

    Значение даты и времени может содержаться как в специальном 8-байтовом 
типе данных Date, так и в переменных Variant. Приемы работы с датами одинаковы 
для дат, сохраненных в обоих типах данных. Диапазон представляемых дат — от 1 
января 100 г. до 31 декабря 9999 г. 
    При преобразованиях других числовых типов данных в Date значения слева от 
десятичного знака представляют информацию даты, в то время как значения справа 
представляют время. Полночь представляет число 0, полдень — 0.5. Отрицательные 
целые числа представляют даты до 30 декабря 1899 года. 
    06bjiCTHbj^egeMeHHbie_xpaHflTcgjsaK 32-разрядные (4-байтовые]| адреса, 
указыва_ющие_на      А объекты внутри приложения или внутри некоторого другого приложения. 
    С переменной, JOJбJЫ5влeниflй..J<a)<_.Qbject, впоследствии может быть 
ассоциирован (с помощью оператора Set) адрес любого существующего объекта, 
распознаваемого приложением: 

    '   Объявить   объектную  переменную 

    Dim  objDb  As   Object 

    '   Ассоциировать   переменную  с   объектом  -   базой данных 

    Set   objDb  =  OpenDatabase("с:\office\sample\dbl.mdb") 

    18 Написание программного кос 

    При объявлении объектных переменных нужно стараться использовать 
определена классы (такие, как TextBox вместо Control или, в предыдущем случае, 
Database вмес Object) вместо общего типа Object. Visual Basic может разрешать 
адресацию свойств методов объектов с определенными типами еще до обращения к 
ним. Это позволя< приложению в период выполнения работать быстрее. 
Определенные классы объект) можно увидеть в окне Object Browser. 
    При работе с объектами других приложений вместо использования типов 
Variant или Obje лучше объявлять объекты под таким типом, как они приведены в 
списке Классы в OKI Object Browser. Это гарантирует, что Visual Basic 
распознает определенный тип объект правильно разрешив адресацию в период выполнения. 
    Переменная Variant способна хранить все определенные системой типы данных. 
Выполня-преобразования между этими типами данных нет необходимости — при 
взаимных присв ениях переменных Variant Visual Basic автоматически выполняет 
любое необходимое пр образование. Например: 

    Dim VarVariant        '   Variant   по  умолчанию 

    VarVariant  =   "2"   '   VarVariant   содержит   "2"    (односимвольная   
строка). 
    VarVariant  = VarVariant  +  3   '   VarVariant  теперь   содержит  
числовое значение  5 
    VarVariant   =   "Visual   Basic   "   &'VarVariant   '   VarVariant   
теперь   содержим 
    '    "Visual   Basic   5"    (строка) 
    Хотя с переменными Variant можно выполнять операции, не задумываясь о виде 
данны который они содержат, с этим типом данных связаны некоторые нюансы, 
которые следуе всегда иметь в виду: 
    •   при выполнении с данными Variant арифметических операций или функций 
переменнь Variant должны содержать нечто, что может интерпретироваться как число; 
    •   при сцеплении строк нужно использовать операцию & вместо операции +. 
    Если при объявлении переменной ее тип данного не указывается, переменная 
получает jv Variant. Однако, тип данного Variant требует большего количества 
памяти, нежели другу типы данных. Если требуется создать компактный и быстрый 
код, необходимо, где возмог но, использовать явные типы данных. 
    Каждую переменную рекомендуется описывать на отдельной строке, чтобы 
избежать пут; ницы, которая, например, будет иметь место в следующем фрагменте: 
    '    sFname   получит   тип  Variant, Dim  sFname,   sLname  As   String 
    a   sLname-String: 
    '   Вместо   этого  лучше   сделать   так: Dim  sFname  As   String Dim  
sLname  As   String 

    Преобразование типов данных 

    В случае необходимости Visual Basic подстраивает типы данных. Например, 
если строкова переменная используется в арифметическом выражении, Visual 
Basic, если возможнс преобразует строковую переменную в числовое значение. 
    Если строка представляет числовое значение, ее можно присвоить числовой 
переменно* Точно так же можно присвоить числовое значение строковой 
переменной. Например, в след^ ющей процедуре происходит неоднократное 
преобразование строки в число и наоборот: 

    Private   Sub   Commandl_Click () Dim  intX  As   Integer Dim   strY  As   String 

    Глава 1. Введение в Visual Basic	19 

    strY  =   "100.23" 
    intX  =   strY  '   Присвоить   строку  числовой  переменной 
    Textl.Text   =   intX '   Напечатать   значение  целой 
    '   переменной  в   первом  поле 
    Texts.Text  =  Cos(strY)    '   Напечатать   косинус  числа   в   третьем  поле 
    strY  =  Cos (strY)	'   Передать   косинус  в   строковую
'   переменную             
	Text2.Text   =   strY '   Напечатать   значение   строковой 
    '   переменной  во   втором  поле      End  Sub 

    Visual Basic автоматически преобразует переменные к соответствующему типу 
данных. Все же использовать обмен строк и чисел следует с осторожностью: 
пересылка нечислового строкового значения в числовую переменную обусловит 
ошибку. В случае присвоения строкового значения числовой переменной строковая 
переменная или константа в качестве десятичного разделителя должна содержать 
символ, указанный в настройке Язык и стан-     дарты Панели управления 
Windows. Если в настройке указана запятая и вместо запятой 1     ввести точку, 
последует ошибка периода выполнения (это легко проверить, поэкспериментировав 
со значением "100.23"). 
    В следующем фрагменте кода показано, как Visual Basic добавляет 1 к 
значению в текстовом поле: 

    Dim  iNewRate  As   Integer 
    txtRate.Text  =   "5" iNewRate  =  txtRate.Text   +   1 

    Visual Basic обеспечивает несколько функций, которые можно использовать 
для явного преобразования значений в определенный тип данного. Например, чтобы 
преобразовать значение в Currency, можно воспользоваться функцией CCur: 
    Summa   =  CCur(Kol   *   Cena) 

    Функция преобразования        Преобразует выражение в 

    Cbool	Boolean _______CByte________________Byte_______ 
    CCur	Currency _______CDate      _____   _______Date      _____ 
    CDbl	Double 
    Clnt	Integer 
    CLng	Long 
    ________CSng________________Single_______ 
    ________CStr________________String_______ 
    ____CVar _______      _____Variant_______ 
    ________CVErr________________Error_______ 

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


    20 Написание программного кода

    1.4.5. Область определения переменных 

    Область определения и видимости переменной определяет, где и когда 
переменная може-быть распознана. Область определения переменной зависит от 
того, где переменная объ явлена (в процедуре, форме или модуле) и как 
переменная объявлена (как Public ил1 Private). 

    Переменные уровня процедуры	foj/lYfi%& 

    Переменная, объявленная в процедуре, распознается только внутри этой 
процедуры. В следующем примере переменная описывается внутри процедуры с типом Integer: 

    Dim  iTest  As   Integer 


    Переменные уровня формы 

    Переменные, объявленные внутри раздела General Declarations формы, могут 
быть Private или Public. 
    Переменные Private доступны всем процедурам внутри формы, но невидимы для 
любоР процедуры вне формы. 
    Переменные Public доступны всему приложению как свойство формы. При 
доступе к Public переменной уровня формы внИГформы ее необходимо 
квалифицировать именем фор_мы. 
    Например: 
    Public fTotal As Integer frm.fTotal = 4 
    Объявление в форме Использование вне формы 
    Переменные уровня стандартного модуля 
    Переменные, объявленные внутри раздела General Declarations модуля, могут 
быть Private или Public. 
    Переменные Private доступны только внутри модуля. 
    Переменные Public доступны в любом месте приложения. К Public переменной 
уровня модуля можно обратиться, специфицируя только_имя переменной. Например: 
    '   Объявление   переменной  в  модуле Public  giTest  As   Integer 
    '   Использование  переменной  вне  модуля giTest   =   5 
    '   Одно  и  то  же  имя   переменной  используется   в   нескольких  
модулях Modulel.giTest  =  5 

    1.4.6. Период существования переменных 

    Период существования переменной означает, как долго переменная является доступной. 
    Определяется период существования переменной тем, где переменная объявлена 
(в процедуре или модуле) и как она объявлена (как Static или не Static). 

    Переменные уровня процедуры 

    Переменная уровня процедуры доступна, пока работает процедура. При 
повторном вызове процедуры переменная повторно инициализируется. 

    Глава 1. Введение в Visual Basic	21 

    Есл^требуется^чтд&ы переменная сохраняла свое значение и повторно не 
инициализировалась, ее следует объявлять как Static*.	" "~™ —«~—... — . 
    Переменные, объявленные как Static, все же доступны только данной 
процедуре; однако переменные сохраняют свои значения весь период 
вьТполнёнйя"приложения. "" 
    В следующем фрагменте переменная iRetryCount сохраняет свое значение при 
каждом вызове процедуры Prod. Переменная iValue каждый раз восстанавливается в 0: 

    Sub  Prod () 
    Static iRetryCount As Integer 
    Dim iValue As Integer 
    iRetryCount = iRetryCount + 1 End Sub 


    Переменные уровня формы 

    Переменные, объявленные на уровне формы, поддерживаются до тех пор, пока 
объектная переменная.ф_о?м.ьше.&/дет установлена в Nothing. Пока этого не 
произойдет, переменные уровня формы сохраняют свои значения даже при выгрузке формы. 
    При установке переменной формы в Nothing переменные очищаются и 
выполндехся^ааЙЫ; тие Terminate .форм**** 
    В следующем операторе объектная переменная формы Form2 устанавливается в Nothing: 
    ;   Set   Form2   =  Nothing 

    Переменные уровня стандартного модуля 

    Переменные, объявленные на уровне модуля, доступны в течение всего времени 
выполнения приложения. 

    1.5. Обработка вводимой информации и управление ошибками 

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

    1.5.1. Средства отладки приложения 

    Visual Basic обеспечивает интерактивные инструментальные средства для 
нахождения ошибок выполнения и ошибок в логике программы. 
    Ко всем средствам отладки можно обратиться, используя меню Debug и View 
или панель инструментов Debug. 
    Средства отладки Visual Basic включают: 

    22	Обработка вводимой информации и управление ошибкам! 

    i View  Eroject   Fgrrnat   Debug   R.jn 
    -6 <*1 ?s <±з i: П P P <ftf 
    Toggle Breakpoint —I 
    Step Into—I Step Over —I Step Out—J 
    L, 
    О iJi-'J'111-1- oru'/v^cr 
    Immediate Window    Ctrl+G 
    L Call Stack Quick Watch         Q L— Wat с h Wi n d ow	П Locals Window — 
Immediate Window           |?3 watch Window Locals Window                      
   ^ Cay stack... 
    Ctri+L Prn»i-h Fynlnrw	ri-i-l-i-R 
    il        Debug  Run   Tools   Add-lns   Window   Hell 
    •«I Step Into	F8 tl Step Over                         5hift+F8 
    *1 Step Out	Ctrl+Shift+F8 Run To Cursor 
    add Watch,,. 
    6V Quick Watch... 
    Shift+F9 
    —	LEefauK]	<:Wrongnrniber of argun Object 
    —	Actwe Control	Hottrmg                        Control 
    —	Appearance	1                               Integer 
    ' ...)       •& loggle Breakpoint	F9 gear АУ Breakpoints   Ctrl+Shift+F9 
    Ф Set Mext Statement	Ctrl+F9 ^ Show Ne^t Statement 
    .jd 

    Рис. 1.8. Средства отладки Visual Basic. 

    Инструмент отладки	Назначение 
    Точка останова (Toggle Breakpoint)	Установка точки останова. Определяет 
строку в окне редактора кода, в которой Visual Basic приостанавливает 
выполнение приложения. Установить точку останова можно во время разработки или 
в период выполнения, находясь в режиме останова (Break Mode). 
    Шаг с заходом (Step Into)	Выполняет следующую исполняемую строку кода 
приложения с заходом в процедуры. 
    Шаг с обходом (Step Over)	Выполняет следующую исполняемую строку кода 
приложения без захода в процедуры. 
    Шаг с выходом (Step Out)	Выполняет остаток текущей процедуры и 
останавливает выполнение на следующей строке в вызывающей процедуре. 
    Контрольное значение (Quick Watch)	Выводит текущее значение выражения, в 
то время как приложение находится в режиме останова. 
    Стек вызова (Call Stack)	В режиме останова открывает окно диалога Стек 
вызова (Call Stack), в котором показаны все вызванные, но не завершенные 
(отложенные) процедуры. 

   Глава 1. Введение в Visual Basic	23 

    -,	Инструмент отладки	Назначение             __                 ____ 
    1	Выражения	Выражения наблюдения (контрольные) используются для конт
    :	наблюдения	роля в окне Watches отдельных переменных или выражений. 
    J	Значение каждого выражения наблюдения в точках останова 
    1	обновляется. 
    I     ——————————————— ————————————————————————————————————— 
    1     Окно Immediate	В режиме останова можно тестировать исполняемый оператор, 
    печатая его непосредственно в окне Immediate. Visual Basic 
    1	выполняёТоператор немедленно. В это же окно направляется 
    ,,j     ______________вывод CjieD^op^Debug^Print.___________________ 
    Окно Locals	В этом окне автоматически выводятся все объявленные в теку
    1р     ______________ щей процедуре переменные вместе с их значениями._____ 

    1.5.2. Обработка данных поля 

    •     Некоторые ошибки ввода данных можно предотвращать и тем самым 
улучшать работу приложения, проверяя и подтверждая правильность информации по 
мере ее ввода в поля I     и другие элементы управления. 

    Ограничение выборов с помощью элементов управления 

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

    Свойство MaxLength 

    Свойство MaxLength определяет максимальную длину строки в текстовом поле. 
    J    Система подает звуковой сигнал, когда пользователь пробует ввести 
строку, которая пре-з|    вышает максимальную длину. Если требуется вывести на 
экран сообщение об ошибке, следует обрабат^ь1ват^ь]йажати§.клавиши в.србытии 
KeyPress (параметр KeyAscii). 

    Свойства Locked 

    Свойство Locked определяет, может ли пользователь изменять данные в 
текстовом поле. '     Если Locked — True, пользователи могут только 
просматривать и копировать данные поля. 

    i     Использование события KeyPress для проверки данных 

    Для проверки данных по мере их ввода пользователем можно использовать 
события KeyPress, KeyDown и KeyUp. В качестве реакции можно запрещать 
пользователю ввод некоторых символов (например, ограничивать ввод данных 
исключительно числовыми значениями) либо изменять данные непосредственно при 
вводе (например, преобразовывать все символы в верхний регистр). 
    Событие KeyPress происходит всякий раз, когда пользователь вводит 
стандартный символ ASCII. 
    Событие не включает большинство специальных символов, таких, как 
функциональные клавиши, клавиши перемещения курсора или клавиша Delete. Чтобы 
отвечать на нажатие этих клавиш, нужно использовать события KeyDown и KeyUp. 

    24 Обработка вводимой информации и управление ошибкам 

    В следующем фрагменте вводимые пользователем символы переводятся в верхний регистр 

    Sub  Textl_KeyPress(KeyAscii  As   Integer) KeyAscii   =  
Asc(UCase(Chr(KeyAscii))) End  Sub 
    Эта процедура события KeyPress запрещает пользователям вводить в текстовое 
пог любые символы, кроме числовых значений: 
    Private   Sub   Textl_KeyPress(KeyAscii  As   Integer) Sub   Private   
Textl_KeyPress    (KeyAscii   Как   Integer) 
    If  KeyAscii   <>   8   Then   '   Допускается  возврат  на  один  символ 
    '   либр   ввод   только  цифр 
    If   Chr(KeyAscii)   <   "О"   Or  Chr(KeyAscii)   >   "9"   Then KeyAscii 
  =   0   '   Установить   символ  к  пустому  значению Веер End   If End  If 
End   Sub 

    1.5.3. Управление интерфейсом и информацией формы 

    В дополнение к использованию методов уровня поля для проверки данных 
непосредствен но при вводе можно написать процедуры, которые будут проверять 
данные одновременн во всех полях формы. Ниже описываются поддерживаемые Visual 
Basic методы проверк правильности ввода уровня формы. 

    Деактивация кнопки ОК 

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

    Фамилия     Степанков 
    № счета 
    JOQ1836-AKJ 
    Отмена 

    Рис. 1.9. Отключение кнопки в форме. 

    Чтобы тестировать каждое нажатие клавиши при вводе данных в форму, следует 
устано вить в Тгие^свойство KeyPreview формы. После этого событие клавиатуры 
сначала буде получать форма, а затем уже элемент управления. 
    В следующем фрагменте кода кнопка ОК активируется, только если все 
текстовые поле имеют вхождения: 

    Private   Sub   Form_Load() 
    Me.KeyPreview = True 
    cmdOK.Enabled = False End Sub 
    Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer) ' Активирует 
кнопку ОК, только если все поля имеют вхождения 

    Глава 1. Введение в Visual Basic__________________________25 

    Dim curControl As Control For Each curControlTn Controls *Tf" TypeOf 
"cTTrContTroT Ts Text Box Then 
    If curControl.Text = "" Then ' Поле не заполнено 
    cradOK.Enabled = False ' Деактивировать кнопку OK 1         Exit Sub End If 
    ' Если нужно, таким образом можно проконтролировать и другие типы ' 
элементов управления 
    :     End If     'Л,-'-	'  -        • - •    ,  ';,,у^,,Г;^.. , •/' • 
    Next 
    ' Во всех полях имеется информация cmdOK.Enabled = True End Sub 

    Проверка всех полей в форме 

    Простой способ проверить одновременно все поля в форме — поместить код 
проверки правильности ввода в событие Click кнопки ОК. 
    В этом сценарии приложение позволяет пользователю закончить заполнение 
формы и затем проверяет все поля. Приложение устанавливает фокус на первое 
поле, которое ч   содержит недостоверные данные. 
    Например, в следующем фрагменте на наличие числового значения проверяются 
числовые поля в форме, содержащей номер отдела и номер сектора служащего: 

    Private   Sub  cradOK_Click()	/-                                   • 
    If  Not    (IsNumeric(txtOtdelNo.Text) )    Then	tyWflArVU/l/Q   j/^f,   
l^Afr MsgBox   "Неверный  номер   отдела"                                      
  '             / txtOtdelNo.SetFocus ELseLf Not   
(rsffumeczcC^JfC^ec-ircy-f-A^.jre'^^^   УЛ^^ 
    ^^S5^. 
    txtSectorNo.SetFocus i    Else !      MsgBox "Данные верны" 
    Unload Me ;    End If !  End Sub 

    Использование События QueryUnload 

    Событие QueryUnload происходит непосредственно перед событием Unload, 
когда форма выгружается. 
    Событие QueryUnload позволяет определить, как было инициировано событие 
Unload, и в случа^_необходимости^ртмёнять'собь1тие Unload. Это полезно, когда 
пользователь не завершил" ввод^данных на форме или когда требуется запросить 
пользователя сохранить изменения перед закрытием формы. 
    Событие QueryUnload имеет следующие два параметра: 
    •  параметр UnloadMode указывает, как было инициировано событие Unload; 
    •  параметр Cancel отменяет событие Unload. Если Cancel установлено в 
True, приложение остается в состоянии, какое было перед инициированием 
выгрузки формы. 
    В следующем фрагменте событие Unload отменяется, а пользователю перед 
закрытием формы выводится дополнительный запрос: 

    26 Обработка вводимой информации и управление ошибкам 

    Private Sub Form_QueryUnload(Cancel As Integer, _ 
    UnloadMode As Integer) Dim iResult As Integer 
    iResult = МздВохС'Вы уверены, что хотите выйти?", vbYesNo) If iResult = 
vbNo Then 
    Cancel = True End If End Sub 

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

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

    Понятие процесса управления ошибками 

    Процесс обработки ошибок включает следующие три шага: 
    1. Установить код перехвата ошибки, который определит, куда поток 
обработки выполни переход, когда будет возвращена ошибка. 
    2. Написать код обработки ошибок. 
    3. Выйти из процедуры обработки ошибок. 
    Оператор On Error GoTo позволяет перехватить ошибку и определяет, где 
продолжит выполнение, когда возвращается ошибка. Если возвращается ошибка 
периода выполнена поток обработки переходит к метке, обозначенной в операторе 
On Error GoTo. Процедур обработки ошибок выполняет код, содержащий оператор 
Resume, который указывает, гд продолжить обработку. 
    В следующем фрагменте показано, как использовать операторы On Error GoTo и Resume. 

    Private   Sub  Commandl_Click() 
    Dim AppName  As   String 
    On  Error   GoTo   CheckError 
    AppName  =   InputBox ("Введите  имя  приложения") 
    Shell  AppName Exit   Sub 
    CheckError: 
    I    f  Err.Number  =   53   Then   '   Файл  не   найден sgBox   
"Приложение   не   найдено" 
    If  MsgBox("Попытаться   еще  раз?",   vbYesNo)   =  vbYes   Then AppName  
=   InputBox("Введите  имя   приложения") Resume   '   Новая  попытка Else 
    Resume  Next   '   Выполнить   следующий  оператор End  If Else 
    MsgBox   "   Неизвестная   ошибка   " End  If End  Sub 

    В коде обработки ошибок для контроля номера произошедшей ошибки, очистки 
значени! ошибки или инициирования ошибки используются свойства и методы 
объекта Err. 

    Глава 1. Введение в Visual Basic	27 


    Свойства объекта Err 

    Свойство Number — целое число, которое указывает последнюю произошедшую 
ошибку. Для определения возвращаемых ошибок следует контролировать значение Err.Number. 
    В некоторых случаях можно исправить ошибку и позволить пользователю 
продолжить работу, не прерывая обработку. В других случаях придется сообщить 
пользователю об ошибке и, основываясь на ответе пользователя, выполнить 
некоторое действие. 
    Свойство Description — строка, которая содержит описание ошибки. 
    Свойство Source содержит имя приложения, которое сгенерировало ошибку. Это 
полезно при использовании Автоматики. Например, если пользователь вызывает 
Microsoft Excel и он генерирует ошибку, Err.Number будет содержать правильный 
код ошибки, a Err.Source устанавливается равным Excel.Application. 

    Методы объекта Err 

    Метод Clear сбрасывает значение Err.Number в ноль. 
    Метод Raise устанавливает ошибку. Этот метод используется для передачи 
ошибки .обратно в Bbi3biB§j^ytqjT|)oue.Qypy или тестирования кода обработки 
ошибок. Например: 

    Err.Raise 53 ' Установить ошибку "Файл не найден" 


    Опции Resume 

    С помощью оператора Resume можно специфицировать, откуда приложение 
продолжит работу после обработки ошибки. В следующей таблице перечислены три 
типа операторов Resume, доступные в Visual Basic: 

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

    Примечание: Если оператор Resume используется где-либо кроме подпрограммы 
обработки ошибок, возвращается ошибка компиляции. 

    1.5.4. Отключение обработки ошибок 

    Активированные процедуры обработки ошибок могут мешать при отладке кода 
программ. Visual Basic позволяет отключать код обработки ошибок, обеспечивая 
при этом другие опции отладки приложения. 
    Для изменения режима обработки ошибок: 
    1. В меню Tools выбрать команду Options. 
    2. Открыть вкладку General окна диалога Options, в разделе Error Trapping 
установить требуемую опцию и нажать ОК. 

    28 Компиляция приложения и построение ЕХЕ-фаш 

    В разделе Error Trapping вкладки General доступны следующие опции: 

    Опция	Описание 
    Break on All Errors	Если включить этот переключатель, то при возникновении 
любе ошибки выполнения Visual Basic игнорирует любые операторы С Error и 
вводит режим останова (Break). 
    Break in Class Module	Эту опцию следует устанавливать при отладке 
компонента Active] При этом компонент ActiveX инициирует ввод режима останова 
BMI сто передачи ошибки обратно приложению-клиенту. Примечание: Компонент 
ActiveX — физический файл (например, .exe, .dll, .ос 
    Break on Unhandled Errors	Visual Basic вводит режим останова при 
возникновении любой оши! ки, для которой не обеспечен определенный код 
обработки ошибок 

    1.6. Компиляция приложения и построение ЕХЕ-файла 

    После того как закончено построение интерфейса и написание и отладка 
программного KOf приложения, можно создавать для пользователей исполняемый 
файл приложения. 
    Создание исполняемого файла в Visual Basic — простой процесс. Для этого: 
    1. В меню File выбрать команду Make Имя_проекта.ехе. 
    2. Ввести имя для исполняемого файла. 
    3. Чтобы добавить информацию по версии программы: в окне диалога Make EXE 
File нажа кнопку Options. Откроется окно диалога Project Properties. На 
вкладке Make ввести ном ра версии и текст информация версии; щелкнуть ОК. 
    На следующей иллюстрации показаны опции Version Number вкладки Make: 

    Proiecll - Pioject Properties 
    Make | Compile) , Version Number 1 Major;    Minor;     Revision:   ', , 
    \W~ F~ F~   .: 
    Г" Auto Increment 
    Version Information :   Tffe;	У-а|ие; 
    Application 
    Iftte:   | Project 1 
    Icon:   JForml 
    d 
    ^з j 
    Command Line Arguments;	| Conditional Compilation Arguments: j 
    OK 
    Cancel 
    Help 

    Рис. 1.10. Вкладка Make окна диалога Project Properties. 

    Примечание: Состав вкладок окна диалога Project Properties для компиляции 
отличается от о/да открываемого по команде меню Project \ Project Properties 
(см. рис. 1.11). 

    Глава 1. Введение в Visual Basic	29 

    Создание исполняемого файла Visual Basic можно запускать также с подсказки 
MS-DOS. Это инструктирует генераторы кода создавать .ехе файлы без 
вмешательства пользователя и позволяет разработчикам запускать большие задания 
компиляции программным способом. 
    Следующий синтаксис иллюстрирует, как компилировать приложение из 
командной строки: vb32 /make имя_проекта имя_исполняемого_файла 
    В дополнение к исполняемому файлу при тиражировании приложения необходимо 
обеспечить различные DLL и другие файлы. Следует также создать программу 
Setup, которая установит приложение на компьютер пользователя. 
    Мастер Setup Wizard Visual Basic облегчает создание для приложения 
дистрибутивных дисков или дистрибутивной папки сервера. После этого для 
установки и регистрации требуемых файлов приложения можно запустить 
результирующую программу Setup. 
    Информацию относительно создания программы Setup см. в главе 12 "Создание 
программы Setup и оптимизация приложения". 

    1.6.1. Компиляция во внутренний код 

    Редакции Visual Basic Professional и Enterprise позволяют компилировать 
программный код либо в формат стандартного псевдокода Visual Basic (р-код), 
либо в формат внутреннего кода. При компиляции воПвнуТренний код 
обеспечивается несколько опций для оптимизации и отладки, которые недоступны 
для р-кода. 
    Р-код — промежуточный шаг между инструкциями высокого уровня приложения 
Visual Basic и внутренним кодом низкого уровня, которые выполняет процессор компьютера. 
    В период выполнения Visual Basic транслирует каждый оператор р-кода во 
внутренний код. При компиляции программы непосредственно в формат внутреннего 
кода промежуточный шаг р-кода устраняется. 
    Для компиляции проекта во внутренний код: 
    1. В окне Open Project или в окне Project Explorer выбрать проект, который 
требуется скомпилировать. 
    2. В меню Project выбрать команду Project Properties. 
    3. В окне диалога Project Properties открыть вкладку Compile. 
    4. Выбрать требуемые опции компиляции и нажать ОК. 
    Чтобы получить дополнительные опции внутреннего кода, можно нажать кнопку 
Advanced Optimizations. 
    На рис. 1.11 показаны опции внутреннего кода. 
    Описание доступных опций компиляции во внутренний код приведено в таблице: 

    Опция 

    Описание 
    Optimize For Fast Code 

    Максимизирует быстродействие скомпилированных исполняемых файлов, 
"инструктируя" компилятор, что скорость важнее размера. Когда компилятор 
транслирует операторы Visual BailcfB машинный кбдГчасто имеется выбор среди 
многих различных последовательностей машинного кода, которые могут правильно 
представить данный оператор или конструкцию. Иногда эти различия позволяют 
достичь определенных целей компиляции. Выбор данной опции гарантирует, что, 
когда компилятор распознает такие варианты, он всегда будет генерировать самую 
быструю возможную последовательность кодов, даже когда это может увеличивать 
размер компилированной программы. 

    30 Компиляция приложения и построение ЕХЕ-файл 


    Project! - Pioject Properties 
    Senetal) Make    Compile j Component j 
    f" Compile to P-Code 
    (* Compile to Native Code ™~——....._—~..~.. ...... 
    (•" Optimize for Fast Code     |~ Favor Pentium Pro(tm 
    Г Optimise for Small Code    Г" Create Symbolic Bebu       Г" Assume No aliasing 
    I Advanced Optimizations 
    Warning: enabling the following optimizations may prevent correct 
execution of your program 
    No Optimization 
    Advanced Optimizations... 
    OK 
    Cancel 
    Г Remove Array founds Checks 
    I    Remove Integer Overflow Checks 
    Г" Remove floating Point Error Checks 
    Г? Mm Unrounded Floating Point Operations! 
    I" Remove Jafe Pentium(tm) FDIV Checks 
    * I	Cancel      j	Help 

    Рис. 1.11. Опции компиляции во внутренний код. 

    Опция 
    Описание 
    Optimize For Small Code 

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

    No Optimizations 

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

    Favor Pentium Pro 

    Оптимизирует генерацию объектного кода с учетом особенностей архитектурь 
процессора Pentium Pro (P6). Код, сгенерированный с этой опцией, будет рабо 
тать также на более ранних процессорах, но менее эффективно. Некоторые 
стратегии генерации объектного кода, применимые для Pentium Pro, не поддер 
живаются на компьютерах с процессорами 80386, 80486 и Pentium. Следова тельно, 
использовать эту опцию можно, только если на всех или большинстве машин, 
выполняющих программу, используется Pentium Pro. 

    Create Symbolic Debug Info 

    Генерирует в компилированном исполняемом файле символическую информа цию 
отладки. Программы, компилированные во внутренний код с использова нием этой 
опции, могут быть отлажены в Visual C++ 5.0 или другии совместимым отладчиком. 
Установка этой опции будет генерировать файл .pdt с требуемой информацией отладки. 

    Asume No Aliasing 

    Сообщает компилятору, что программа не использует совмещение имен (псев 
донимы). Псевдоним — имя, которое относится к разделу памяти, уже адресу емому 
другим именем. Псевдонимы используются при передаче параметроЕ ByRef, которые 
ссылаются на одну переменную. Использование этой опцм позволяет компилятору 
реализовать оптимизации, которые иначе выполнить невозможно, например хранение 
переменных в регистрах и оптимизации цик лов. Однако это может обусловливать 
неправильное выполнение программы поэтому, если параметры передаются по 
ссылке, использовать эту опцию cледует осторожно. 


     Глава 1. Введение в Visual Basic    31

    Опция             Описание 

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

    Remove Integer Overvlow   
    Отключает вывод ошибок в случаях, когда числовые значения, присваиваемые 
целым переменным, располагаются вне правильного интервала для типа дан-ных. По 
умолчанию, Visual Basic выполняет проверку при каждом вычислении с Checks 
переменной целочисленного типа данных (Byte, Integer, Long и Currency), чтобы 
гарантировать, что результирующее значение находится внутри требуемого 
интервала. Если значение имеет неправильную величину, выдается ошибка. 
    Выбор данной опции отключает контроль этой ошибки, что может ускорять 
целочисленные вычисления. Однако в случае переполнения емкости типа данного 
ошибка не будет возвращена, и могут иметь место неправильные результаты. 

    Remove Floating-Point Error Checks 
    Отключает контроль ошибок, гарантирующий, что числовые значения, 
присваиваемые переменным с плавающей запятой, находятся в правильном интервале 
для типов данных и что не будет происходит ь деление на ноль или другие 
недопустимые операции. По умолчанию, Visual Basic выполняет проверку при 
каждом вычислении с переменной типа данных с плавающей запятой (Single и 
Double), чтобы гарантировать, что результирующее значение находится внутри 
требуемого интервала. Если значение имеет неправильную величину, выдается 
ошибка. Выполняется также контроль на недопустимые операции. 
    Выбор данной опции выключает этот контроль, что может ускорять вычисления 
с плавающей запятой. Однако в этом случае могут иметь место неправильные 
результаты без индикации ошибок. 

    Remove Safe  Pentium FDIV Checks Pentium Unrounded  Allow 
    Выключает генерацию специального кода, повышающего безопасность деления с 
плавающей запятой  (FDIV — floating-point division)  на  процессорах , имеющих 
ошибку по этой операции. Компилятор внутреннего кода автоматически добавляет 
дополнительный код для выполнения операции деления с плавающей запятой на 
процессорах Pentium, которые имеют ошибку FDIV. Выбор этой опции по зволяет 
уменьшить и ускорить код, но в редких случаях может создавать на таких 
процессорах небольшие погрешности. 
    Позволяет компилятору сравнивать результаты выражений с плавающей запятой 
без предварительного округления этих результатов к правильной точности. 

    Floating-Point Operations Allow Unrounded 
    При вычислениях с плавающей запятой перед выполнением сравнения значения 
обычно округляются к соответствующей степени точности (Single или Double). 
Выбор этой опции позволяет компилятору, когда это позволяет выполнить операцию 
более эффективно, производить сравнения с плавающей запятой до округления. Это 
повышает быстродействие некоторых операций с плавающей запятой. Однако это 
может привести к тому, что вычисления будут производиться с более высокой 
точностью, чем ожидается, и два значения с плавающей запятой, которые могли бы 
считаться равными, не будут таковыми. 
    Поззволяет уменьшить и ускорить код, но в редких случаях может создавать 
на таких процессорах небольшие погрешности. 
    Позволяет компилятору сравнивать результаты выражений с плавающей запятой 
без предварительного округления этих результатов к правильной точности. 
