Учебник по Visual Basic

E-mail Печать PDF
Рейтинг пользователей: / 449
ХудшийЛучший 
Индекс материала
Учебник по Visual Basic
1.2. Преймущества и недостатки VB
1.3. Запуск VB.
1.4. Интегрированная среда разработки (IDE - Integrated Development Environment)
1.5. Основные конструкции языка.
2. Типы данных. Переменные и процедуры, их области видимости. Массивы.
2.2. Переменные и процедуры, их области видимости.
2.3. Объявление массивов и работа с ними.
3. Создание меню
3.1. Создание статического меню
3.2. Создание контекстно-зависимого меню
5. Реализация технологии Drag&Drop средствами VB
5.1. Объекты Drag&Drop
5.2. События Drag&Drop
5.3. Автоматическое перетаскивание
5.4. Перетаскивание с использованием OLE
5.5. Автоматическое перетаскивание с использованием OLE
5.5. Программируемое перетаскивание с использованием OLE
6. Работа с классами в Visual Basic.
6.1.1. Добавление в класс свойств.
6.1.2. Добавление в класс методов.
6.1.3.Добавление в класс событий.
6.1.4.Объявление и использование объектов.
6.1.5. Удаление объекта класса.
6.2. Самостоятельная работа - доработка класса Splitter.
7. Технология OLE
7.1. Элемент управления OLE Container
7.2. Объекты OLE как элементы управления
7.3. OLE Automation
7.4. Создание объекта OLE
7.5. Использование объекта OLE
7.6. Работа с объектами Word
8. Создание элементов управления Active X.
Создание элементов управления ActiveX
Создание элементов управления Active X на примере ZigZag.
9. Использование функций Windows API в VB.
API-вызовы
10. Файловые функции в Visual Basic.
10.2. Обработка текстовых документов (файлы последовательного доступа).
10.3. Файлы произвольного (прямого) доступа.
10.4. Файлы инициализации.
10.5. Использование FSO (File System Object).
11. Использование элемента управления WinSock Control для создания сетевых приложений.
12. Доступ к базам данных из VB с помощью ADO.
12.2. Объект управления данными - ADO Data Control.
12.3. Связанные с данными элементы управления.
12.4. Использование Data Grid Control.
12.5. Доступ к базам данных через объекты ADODB.
13. Практика
Все страницы

Введение в Visual Basic: основные характеристики языка, основные конструкции языка.

1. История создания языка VB. Особенности VB 6.0.

Visual Basic является результатом многолетней эволюции языка BASIC (Beginner's all-purpose symbolic instruction code). Собственно название Бейсик можно расшифровать как «многоцелевой символьный язык программирования для начинающих». Т.о. язык первоначально предназначался для начинающих программистов, как база для изучения более сложных и серьезных языков.

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

VB превращается в стандарт разработки приложений в фирме Microsoft. Разрабатывается специальная версия языка для управления работой различных приложений - VBA - Visual Basic for Application, встроенный как во все продукты Microsoft Office, так и в продукты других фирм. Кроме того, создается VBScript - инструмент для создания web-сайтов.

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


2. Преимущества и недостатки VB.

Как и любой другой язык программирования VB имеет свои преимущества и свои недостатки. Начнем с преимуществ.

1.      Язык Бейсик первоначально разрабатывался для начинающих программистов, поэтому написание программ на Бейсике максимально приближено к естественному языку (английскому), а обучиться этому языку гораздо проще, чем обучиться языку Си.

2.      Бейсик не имеет типа данных «указатель», т.о. программа на VB защищена от ошибок, связанных с неправильным использованием указателей. Программируя на Си, вам наверняка не раз приходилось перезагружать компьютер из-за того, что ваша программа «зависла», неправильно переместив указатель неизвестно куда и прочитав оттуда пару байтов.

3.      VB поддерживает все операторы структурного программирования (if, while, for, и т.д.) и ничем в этом не уступает Си.

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

5.      VBA является основным компонентом языка VB, поэтому все ваши познания в VB можно применить к написанию приложений и макросов для других программ.

6.      VB позволяет легко создавать документы и элементы управления Active X. (см. далее).

7.      Возможности VB легко расширяются за счет обращения к функциям  Win32 API (об этом также позже), позволяя программисту на VB делать с Windows все, что можно было сделать на Си.

8.      VB играючи (по умолчанию) поддерживает новый формат файлов справочной системы Windows - HTML Help, в то время как в других языках приходится повозиться.

Однако, как прочих языков, у VB есть ряд недостатков.

1.      К недостаткам VB можно отнести недостаточно полную поддержку ООП. В частности, не полностью реализовано наследование классов, отсутствуют несколько возможностей языка Си++, связанных с инкапсуляцией (дружественность, совместное использование данных между объектами одного класса, невозможность инициализации объекта при его объявлении). Однако, несмотря на ограничения, VB позволяет писать объектно-ориентированные программы.

2.      Из-за «недружественности» Win32 API к типам данных VB, порой бывает трудно работать с некоторыми API-функциями. Также сказывается отсутствие в языке указателей, а многие API-функции с ними работают и их возвращают.

3.      VB не позволяет вам написать и создать обычную DLL-библиотеку. Используя VB, вы сможете создавать только Active X-DLL библиотеки.

 


3. Запуск VB.

При запуске VB появляется диалоговое окно «new project», которое имеет 3 вкладки:

1.      New - позволяет выбрать один из нескольких типов проектов, которые могут быть созданы.

2.      Existing - существующий проект.

3.      Recent - один из недавно использовавшихся проектов.

 

При выборе нового проекта он создается на основе существующего шаблона:

1.      создание обычного exe-файла.

2.      ActiveX.exe - программа, которая представляет собой сервер автоматизации, содержащий глобальные объекты, которые могут работать сами по себе или имеют доступ у другим программам (пример - word).

3.      ActiveX.dll (Dynamic Loading Library) - программа автоматизации, которая не может работать сама по себе, а выполняется в рамках какого-либо процесса.

4.      ActiveX Control - позволяет создавать собственные элементы управления.

5.      Data project - на его основе создается приложение для работы с базами данных.

6.      VB Application Wizard - мастер создания приложения

7.      И т.д.

 


4. Интегрированная среда разработки (IDE - Integrated Development Environment)

Среда разработки состоит из 8-ми элементов:

1.      строка заголовка

2.      строка меню

3.      стандартная панель инструментов Tool Bar

4.      блок инструментов Controls Tool Box. В VB много других компонент, которые можно вынести на панель. Меню Project/Components отметить то, что надо.

5.      Пустая форма

6.      Окно браузера проекта

7.      Окно свойств (свойства текущего объекта)

8.      Окно расположения формы.

 

Для создания интерфейса программы используется набор стандартных объектов, которые помещены на панель инструментов:

1.      Picture Box - "контейнер" для картинок. Используется для отображения графических изображений.

2.      Image - аналог Picture Box, но с урезанными возможностями

3.      Label - надпись

4.      Text Box - окно редактирования

5.      Command Button - командная кнопка

6.      Check Box - флажок

7.      Option Button - радио кнопка

8.      List Box, Combo Box - список и список с окном редактирования

9.      HscrollBar и VscrollBar - вертикальная и горизонтальная полосы прокрутки

10.  Timer - запуск определенных событий в определенное время

11.  DriveListBox, FileListBox, DirListBox - список дисков, файлов и директорий

12.  Shape, Line - геометрические фигуры, линии

13.  Data - позволяет осуществить связь с БД

14.  OLE - обеспечивает подключение к OLE-серверам.

 

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

События - это сообщения, которые поступают объекту (нажатие на кнопку - Click).

Свойства - это атрибуты элемента класса. У кнопки: ширина, высота, и т.д.

Самая простая программа: Me.Label1.Caption = "Самая простая программа"

Запуск приложения - F5

 

Состав проекта:

*.frm - файл, который описывает форму. Обычный текстовый файл, в который входят составляющие интерфейса и код, присоединенный к этой форме.

*.bas - файлы модулей. Содержат описание глобальных проектов, доступных во всем проекте: переменные, процедуры, функции.

*.frx - двоичные файлы, которые содержат графику, принадлежащую форме.

*.ctl - файлы ocx компонент

*.cls - файлы классов

*.vbp - файл проекта, который в целом описывает проект.

 

Обзор свойств формы и основных свойств стандартных элементов управления.

 


5. Основные конструкции языка.

5.1. Алфавит VB.

Алфавит VB состоит из латинских букв (как строчных, так и прописных), цифр, специальных символов (пробел, подчеркивание, и пр.).

‘ и Rem говорят о том, что все символы до конца строки - комментарии.

Rem это комментарий

A = 0 это тоже комментарий

 

5.2. Переменные.

Объявление переменных осуществляется следующим образом:

<квалификатор видимости> <имя переменной> As <тип>

<квалификатор видимости> ::= Dim | Private | Public | Static

<тип> ::= Integer | Long | Single | Double | Currency | String | Byte | Boolean | Date | Object | Variant

Областям видимости и типам данных посвящена следующая лекция

Каждую переменную необходимо описывать отдельно.

Примеры объявления переменных:

Dim aaa As Integer

Public bbb As  Date

Static ccc As Variant

 

Идентификаторы (имена) переменных в VB должны соответствовать правилу записи имен:

1.      имя должно начинаться с буквы

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

3.      нельзя использовать в имени пробел, ., :, ; и др.

4.      имя должно быть уникально в пределах ее видимости

5.      длина до 255 символов

6.      имя не должно совпадать с ключевыми словами

7.      имя переменной не зависит от регистра - Name = nAmE = name

8.      имя переменной должно быть информативным и коротким.

 

5.3. Пользовательские типы (User Defined Types).

<квалификатор видимости> Type <имя типа>

     <имя поля> As <тип>

     . . .

End Type

Доступ к полям по имени переменной пользовательского типа осуществляется через точку.

Пример объявления пользовательского типа данных:

Public Type MyType

    X As Long

    Y As Byte

End Type

Dim Aaa As MyType

Aaa.X = 4.0

Aaa.Y = 245

 

5.4. Константы.

[ Public | Private ] Const <имя константы> [As <тип>] = <значение>

Встроенные в VB константы обычно начинаются с vb. Примерами могут служить vbCrLf, vbSizeWE...

Пример объявления констант:

Public Const myConst As Integer = 255

 

5.5. Массивы.

Массив - группа переменных одного типа, объединенных одним именем.

Индекс массивов по умолчанию начинается с 0. Изменить индекс по умолчанию можно для всего модуля путем следующего оператора (в начале модуля!):

Option Base <число>

<квалификатор видимости> <имя> ( [<размер>] ) As <тип>

<размер> ::= <целое> [To <целое>]

Dim iInt(30) As Integer

Dim iInt (1 To 30) As Integer

 

5.6. Математические операторы.

+, -, *, / - как обычно

\ - целочисленное деление (частное от деления)

mod - остаток от деления

^ - возведение в степень

5.7. Оператор соединения строк.

Для соединения строк используется символ &, хотя можно использовать +, но & надежнее.

5.8. Управление ходом выполнения программы (операторы ветвления).


If <условие> Then

     ‘блок А

[ Else

     ‘блок Б

]

End If

 

 

 

 

 

If <условие1> Then

     ‘блок А

ElseIf <условие2> Then

     ‘блок Б

ElseIf <условие3> Then

     ‘блок В

. . .

Else

     ‘блок «иначе»

End If


Select Case <выражение>

Case <значение1>

     ‘блок 1

Case <значение2>

     ‘блок 2

. . .

Case Else

     ‘блок «иначе»

End Select

Возможно применение значений типа Case Is < 0, Case Is>2+bbb, Case 1,2,3, Case 1 To 3 и др.

Логические операторы:

And - и

Or - или

XOr - искл. или

Not - не

Логические константы: TRUE, FALSE

Операторы отношения: <,>,<>,>=,<=

 

5.9. Операторы цикла.

5.9а. Цикл с условием.

С предусловием:

Do While <условие>

     ‘пока условие истинно, выполняется тело цикла

Loop

Если необходимо разорвать тело цикла и выйти, для цикла Do While используется оператор Exit Do.

 

Do Until <условие>

     ‘пока условие ложно, выполняется тело цикла

Loop

 

С постусловием:

Do

     ‘тело цикла выполняется 1 раз + пока условие истинно

Loop While <условие>

 

Do

     ‘тело цикла выполняется 1 раз + пока условие ложно

Loop Until <условие>

 

5.9б. Цикл со счетчиком.

For <имя переменной> = <значение1> To <значение2> [ Step <шаг> ]

‘тело цикла выполняется при пробегании переменной от

‘значения 1 до значения 2 с заданным шагом (или с шагом

‘1 по умолчанию). Шаг может быть <0 или быть дробным. Выход из цикла - оператор Exit For

Next <имя переменной>

For i=1 to 30 Step 2

Next i

 

5.10. Безусловный оператор перехода.

Метка:

GoTo Метка

 

5.11. Процедуры и функции.

Процедуры (ничего не возвращают) объявляются следующим способом:

<Public|Private|Static> Sub <имя процедуры> ( <параметры> )

     ‘тело процедуры

End Sub

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

Для досрочного выхода из процедуры используется оператор Exit Sub.

Вызвать процедуру в теле программы можно следующим образом:

[<имя формы>.]<имя процедуры> <значение пар-ра1>[,<значение пар-ра2> ...]

 

Функция (возвращает какое-либо значение) объявляется аналогично:

<Public|Private|Static> Function <имя функции> (<параметры>) As <тип возвращаемого значения>

     ‘тело функции

     Имя функции = ...

End Function

Досрочный выход - Exit Function.

Возврат значения функции в теле функции - присваивание имени функции значения оператором присваивания.

Вызов функции:

[<имя формы>.]<имя функции> ( <значение пар-ра1>[,<значение пар-ра2> ...] )

 

Параметры в функции либо процедуре могут передаваться как по ссылке, так и по значению. Это определяется в описании параметров функции или процедуры выставлением ключевых слов ByVal и ByRef перед именем параметра. По умолчанию все параметры передаются по ссылке.

По значению: параметр копируется в процедуру. Все действия выполняются над его копией. Параметр не изменяется.

По ссылке: ячейка становится общей для программы и процедуры. Параметр изменяется.

имя функции (ByVal sStr As String, ByRef iInt As Integer)

 


Типы данных. Переменные и процедуры, их области видимости. Массивы.

Типы данных.

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

Тип переменной

Хранимое значение

Занимаемая память

Диапазон допустимых значений

Integer

Целое число одинарной точности

2 байта

-32768 ... +32767

Long

Целое число двойной точности

4 байта

-2147493648 ... +2146483647

Single

Десятичное число с плавающей точкой одинарной точности

4 байта

+(10-45 ... 3*1038)

-(10-45 ... 3*1038)

Double

Аналог float. Десятичное число с плавающей точкой двойной точности

8 байт

+(5*10-324 ... 1.8*10308)

-(5*10-324 ... 1.8*10308)

Currency

Десятичное число с фиксированной точкой. Целая часть - 15 цифр, дробная - 4 цифры.

8 байт

-9*1014 ... +9*1014

 

String

Строка текста

1 байт на символ (или 2 байта для Unicode)

До 65400 символов для строк с фиксированной длиной и до 2 млрд. символов для динамических строк

Byte

Целое число

1 байт

0 ... 255

Boolean

Логическое значение

2 байта

True или False

Date

Дата/время

8 байт

1/1/100 ... 12/31/9999

Object

Экземпляр класса; OLE-объект

4 байта

----

Variant

Любой из вышеперечисленных. Может описывать любой тип.

16 байт + (если строка) 1 байт на символ (или 2)

----

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

 


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

2.1. Явное и неявное объявление переменных.

Явное объявление переменных означает, что в программе для указания типа переменных будет использоваться конструкция As <тип>.

Пример:

Dim first As Integer

Public second As String

Неявное объявление - определение типа переменной по ее имени (точнее, по суффиксу имени) без использования ключевого слова As. Суффикс состоит из одного символа, соответствие между суффиксами и типами представлено в следующей таблице:

Тип переменной

Суффикс

Integer

%

Long

&

Single

!

Double

#

Currency

@

String

$

Variant

Без суффикса

Если в модуле в разделе глобальных  объявлений  нет предписания Option Explicit, то переменные можно не объявлять. Они будут создаваться при первом использовании с помощью неявного объявления. !!!!!!!!!!! (Option Explicit и объявлять - обязательно)

Пример использования неявного объявления:

Inta% = 6 `создает переменную типа Integer и присваивает ей значение 6

Str1$ = "string1" `создает переменную типа String и присваивает ей значение

Pi# = 3.1415926 `создает переменную типа Double и присваивает ей значение

Varvar = 5 `создает переменную типа Variant и присваивает ей значение 5

Если же в модуле существует предписание Option Explicit, то переменную перед использованием необходимо объявить. Однако и здесь можно прибегнуть к неявному описанию.

Пример:

Dim Inta%

Dim Str1$

Dim Pi#

Dim Varvar

 

2.2. Строки переменной и фиксированной длины.

Большинство строк, с которыми приходится иметь дело в программах, являются т.н. строками переменной длины. Строковая переменная данного типа может иметь длину до 2 Гбайт (2 млрд. символов). Причем VB сам заботится об резервировании и изменении памяти, отводимой под такую переменную.

Однако в VB предусмотрен и другой строковой тип данных - строки фиксированной длины. Длина такой переменной всегда постоянно, вне зависимости от значения. Если длина строки, хранящейся в строковой переменной фиксированной длины меньше, чем размер строковой переменной, то оставшееся места заполняется пробелами. Если же длина хранимой строки больше, то «лишняя» часть отсекается по длине переменной!

Строковая переменная фиксированной длины объявляется следующим образом:

<квалификатор видимости> <имя переменной> As String * <длина>

Пример:

Dim Strstr1 As String * 25

Public Strstr2 As String * 255

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

 

2.3. Квалификаторы видимости и области видимости переменных.

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

Существуют три зоны видимости переменных:

  • Видимость в процедуре
  • Видимость в форме (модуле)
  • Видимость в проекте

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

  • Dim
  • Private
  • Public
  • Static

В зависимости от нахождения оператора объявления переменной (в процедуре или модуле) она имеет следующие зоны видимости:

Квалификатор видимости

Определена в процедуре или функции

Определена в модуле (в глобальном разделе описания)

Dim

Видимость только в процедуре

Видимость в модуле и всех функциях и процедурах модуля

Private

Не используется

Видимость в модуле и всех функциях и процедурах модуля

Public

Не используется

Видимость во всем проекте

Static

Видимость только в процедуре, переменная становится статической

Не используется

       

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

 

2.4. Квалификаторы видимости и области видимости процедур и функций.

Для функции и процедур тоже существуют свои области видимости.

Существуют три зоны видимости процедур и функций:

  • Видимость в форме (модуле)
  • Видимость в проекте

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

  • Private
  • Public

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

Квалификатор видимости

Определена в форме

Определена в модуле

Private

Видимость только в форме

Видимость только в модуле

Public

Видимость во всем проекте

Видимость во всем проекте

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

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

 


3. Объявление массивов и работа с ними.

В VB присутствует два типа массивов:

  • Статические
  • Динамические

Одни могут менять свою размерность, Другие имеют постоянную размерность.

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

<квалификатор видимости> <имя переменной> (<размерность> [,<размерность> , ... ] ) As <тип данных>

<размерность> ::= <целое> [To <целое>]

При задании в качестве размерности одного целого числа, индекс массива пробегает значение от 0 (начального значения по умолчанию) до этого целого числа включительно. Изменить начальное значение по умолчанию можно поставив в начале модуля ключевое слово Option Base <число>.

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

Примечание: В качестве размерности массива нельзя использовать переменные!

Примеры объявления массивов:

Dim aaa (10,5) As Integer

Dim bbb () As Long

Dim ccc (-1 To 6, 1 To 5) As Long

Доступ к элементам массива осуществляется аналогично (через скобки).

Изменение размерности динамического массива просходит при выполнении оператора ReDim:

ReDim  [Preserve] <имя массива> ( <новая размерность> )

Если указано ключевое слово Preserve, то при изменении размерности массива VB постарается сохранить значения максимального числа элементов. Если это ключевое слово не указано, то значения элементов массива теряются.

Пример использования ReDim:

ReDim bbb (5)

ReDim bbb (5 To 10)

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

UBound (<имя массива> [, <индекс>])

LBound (<имя массива> [, <индекс>])

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

Пример использования:

UBound (aaa,1) ‘возвратит 10 (верхний индекс по первой размерности)

LBound  (ссс,2) ‘возвратит 1 (нижний индекс по второй размерности)

 


Создание меню

 

Существует два типа меню:

1.      Статическое меню (принадлежит приложению);

2.      Контекстное меню.

 


1. Создание статического меню

Статическое меню создается с помощью инструмента MenuEditor (находится в пункте меню Tools).

Caption: текст, который отображается в элементе меню. Если необходимо указать клавишу быстрого доступа, перед буквой надо поставить знак &. Например: &File.

Name: используется для идентификации элемента меню в теле программы (обязательное поле).

Index: если элемент является частью массива, Index определяет его уникальный идентификатор в этом массиве.

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

HelpContextId: назначается идентификатор, который используется в справочной системе для выдачи контекстно-зависимой справки.

NegotiatePosition: если в разрабатываемом приложении содержатся связанные или OLE-объекты, то данное свойство определяет способ отображения меню на экране, когда один из этих элементов активен.

Checked: будет ли пункт меню отмечен галочкой.

Enabled: доступен ли пункт меню.

Visible: видимый ли объект.

WindowList: данная опция предназначена для приложений, разработанных с использованием MDI-интерфейса (многодокументного). Установка данного флажка говорит о том, что будет формироваться список дочерних окон. (MDI-интерфейс - см. далее).

Сами пункты меню задаются в виде древовидной структуры при помощи кнопок Next, Insert, Delete. Изменить иерархию пунктов меню позволяют кнопки с изображением стрелок.

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

 


2. Создание контекстно-зависимого меню

Контекстно-зависимое меню вызывается при нажатии правой клавиши мыши на каком-либо элементе управления.

Для формы это событие MouseDown. При возникновении события MouseDown, происходит проверка, какая клавиша нажата (параметр функции). В том случае, если нажата правая кнопка мыши, то необходимо вызвать функцию PopupMenu с указанием пункта меню верхнего уровня, которое необходимо вызвать.

Например:

Private Sub Form_MouseDown (Button As Integer, Shift As Integer, X As Single, Y As Single)

   If Button = 2 Then

      PopupMenu mnuFile

   End If

End Sub

Button - возвращает целое число, которое определяет, какая кнопка мыши была нажата;

Shift - определяет состояние клавиш SHIFT, CTRL, и ALT при нажатии на кнопку мыши;

Х, Y - координаты указателя мыши.

Лекция №4: MDI-интерфейс.

1. Понятие MDI-приложения.

Большинство создаваемых в VB приложений состоят из независимых форм. Каждая из этих форм выводится на экран отдельно от других и так же независимо от других может перемещаться, разворачиваться и сворачиваться. В интерфейсе такого типа тяжело организовать формы и работать с ними как с группой. Этот тип интерфейса называется SDI-интерфейс (Single Document Interface).
Альтернатива стандартному интерфейсу - многодокументный интерфейс, или MDI-интерфейс (Multiple Document Interface). В приложении этого типа есть одна родительская форма. Остальные формы могут быть дочерними, т.е. содержаться внутри родительской. Родительская форма представляет собой контейнер для всех дочерних форм приложения. Примеры MDI-приложений - Excel, Word и т.д. В них можно открыть несколько окон, перемещаться между ними с помощью меню и минимизировать все документы одновременно одним щелчком мыши.
Стандарт MDI позволяет совершенствовать программы в двух направлениях:
1.    возможность ограничиться одной формой-контейнером, которая станет рабочим фоном приложения;
2.    возможность одновременно работать с несколькими документами.
MDI-приложения позволяют использовать несколько экземпляров одной и той же формы, что увеличивает производительность и гибкость программ. Кроме того, интерфейс программы будет более аккуратным, поскольку находящиеся в нем формы не будут разбросаны по всему экрану.

Характеристики родительских MDI-форм:

  • Приложение может иметь только одну MDI-форму.
  • MDI-форма может содержать элементы управления, имеющие свойство Align, например, такие как PictureBox или Toolbar. Другие элементы в MDI-форме распологать нельзя.
  • Для отображения информации в MDI-форме нельзя использовать метод Print и другие графические методы.
  • Родительское и дочерние окна представлены в Windows одной пиктограммой. Если родительское окно минимизируется, а затем восстанавливается, восстанавливаются все дочерние окна.
  • Родительское и дочерние окна могут иметь свои меню. Определенное для дочерней формы меню отображается в строке меню родительской формы. Определенное для родительской формы меню не появляется вообще, если активная дочерняя форма имеет собственное меню.

Характеристики дочерних MDI-форм:
  • Каждая дочерняя форма располагается во внутренней части родительского окна. Дочернюю форму нельзя переместить за границы родительской MDI-формы.
  • Когда минимизируется дочернее окно, его пиктограмма появляется в родительском окне, а не на панели задач Windows.
  • Когда максимизируется дочерняя форма, она заполняет все внутреннее окно родительской формы. В строке заголовка родительской формы указывается название родительской формы и максимизированной дочерней.
  • Когда максимизируется одна дочерняя форма, максимизируются все остальные дочерние формы.


2. Создание простой программы с MDI-интерфейсом.
1.    Создать новый проект - File\New Project.
2.    После создания проекта, необходимо добавить к нему родительскую MDI-форму. Для этого необходимо выбрать меню Project\Add MDI Form, или воспользоваться командой MDI Form из раскрывающегося меню кнопки Add Form.
3.    В браузере проекта MDI-форма будет находиться в папке Forms, как и обычные формы, однако будет иметь другую пиктограмму.
4.    После того, как создана новая форма, необходимо задать ей значащее имя и установить значения других, необходимых свойств. Большинство свойств MDI-формы аналогичны свойствам стандартной формы. Есть только два характерных только для нее свойства - AutoShowChildren и ScrollBars. Свойство AutoShowChildren задает, появится ли дочерняя форма автоматически при загрузке родительской, или нет. По умолчанию установлено значение TRUE. Свойство ScrollBars определяет, будут ли отображаться по необходимости полосы прокрутки. По умолчанию установлено значение TRUE. Еще одно свойство, на которое стоит обратить внимание - Picture, позволяющее поместить на задний фон формы какое-либо фоновое изображение.
5.    Теперь необходимо добавить дочернюю форму. Дочерняя форма - это обычная стандартная форма, только значение свойства MDIChild у нее установлено True. Для добавления дочерней формы необходимо выбрать стандартную форму (которая создалась автоматически при создании проекта) в браузере проекта, а затем в окне свойств установите значение MDIChild=True. В окне браузера проекта у формы изменится пиктограмма.
6.    После этого необходимо разместить в дочерней форме необходимые элементы управления.
7.    Для того чтобы при старте приложения открылась пустая родительская форма, необходимо установить стартовую форму через пункт меню Project\Project Properties, поле Startup Object.
Размер дочерней формы при ее первом появлении во время выполнения отличается от размера, заданного в процессе разработки. Это происходит потому, что Windows сама по умолчанию задает определенные размеры и место расположения всем выводимым на экран дочерним формам. Чтобы заставить дочернюю форму открываться в нужном размере, необходимо написать обработчик события Load для дочерней формы, где программно задать необходимые размеры и расположение относительно левого - верхнего угла рабочей области родительской формы. Вначале необходимо подобрать подходящий размер дочерней формы в режиме разработки, а затем полученные значения свойств Height и Width установить программно. Например:
Private Sub Form_Load()
Me.Height=2745
Me.Width=3690
Me.Top=(mdiMain.ScaleHeight - Me.Height) / 2
Me.Left=(mdiMain.ScaleWidth - Me.Width) / 2
End Sub
После того как создан шаблон дочерней формы, необходим инструмент для создания экземпляров этой формы во время выполнения программы и вывода их на экран MDI-приложения. Это делается с помощью двух строк программного кода:
Dim NewFrm As New имя_дочерней_формы
NewFrm.Show
Например, данный программный код необходим в функции обработки событий при выборе одного из пунктов меню (например, New). Если подобный программный код указан в качестве обработки события, после запуска проекта, при выборе пункта меню New создается новая дочерняя форма.
Для работы с MDI-приложениями широко используются два особых ключевых слова - Me и ActiveForm. Эти слова позволяют создать процедуры, которые будут работать со всеми создаваемыми дочерними формами.
Ключевое слово Me используется в любой форме для ссылки на нее саму. Таким образом, если программный код в дочерней форме написан с использованием ключевого слова Me, он будет работать в любом активном на данный момент экземпляре дочерней формы.
Свойство родительской формы ActiveForm подобно по назначению Me. В свойстве ActiveForm хранится ссылка на активную в данный момент дочернюю форму. Т.е. с помощью свойства ActiveForm вы можете ссылаться на любое свойство, метод или событие активной в настоящий момент дочерней формы, даже не зная ее имени.
Например, пусть открыто более одной дочерней формы. Щелчок мыши на пустом пространстве родительской формы, приведет к тому, что в активную дочернюю форму будет выведен некий текст.
MdiMain.ActiveForm.Print «эта форма сейчас активна»
Если необходимо создать программный код, который должен работать в момент создания дочерней формы, его надо поместить в событие Activate для дочерней формы. Это событие возникает до события Load.

3. Работа с меню.
MDI-формы также могут иметь меню, которое создается аналогично стандартным формам, - с помощью редактора меню (диалогового окна Menu Editor). С помощью меню родительской формы пользователи обычно получают доступ ко всем командам многодокументного приложения.
В MDI-приложениях дочерние формы также могут иметь меню. Как и меню родительской формы, оно создается с помощью редактора меню. Однако, при выводе на экран дочерней формы, содержащей меню, оно отображается не как часть дочерней формы, а замещает меню родительской. Поэтому, из-за того, что меню активной дочерней формы в действительности располагается в родительской MDI-форме, могут возникнуть некоторые проблемы, а именно: когда активна какая-то дочерняя форма, пользователь не имеет доступа к меню родительской MDI-формы.
Существуют два способа преодолеть проблему, связанную с заменой меню. Один из них заключается в дублировании всех пунктов главного меню в меню дочерней формы, однако, этот подход малоэффективен в том случае, если в приложении несколько дочерних форм, имеющих собственные меню, из-за чрезмерного потребления системных ресурсов.
Второй вариант - включить в меню родительской формы все пункты, необходимые дочерним формам и оставить последние без меню. Для активизации нужных пунктов меню следует использовать события Activate и Deactivate, а также событие Unload (при закрытии дочернего окна).
Предположим, необходимо добавить пункт меню Edit для дочернего окна. Необходимо при создании меню задать для пункта Edit свойство Visible False. Предположим, имя пункта меню mnuEdit. Необходимо:

1.    В обработчике события Activate дочернего окна написать следующий код: имя_MDI_формы.mnuEdit.Visible = True
2.    В обработчике Deactivate дочернего окна обратный код: имя_MDI_формы.mnuEdit.Visible = False
3.    В обработчике Unload дочернего окна обратный код: имя_MDI_формы.mnuEdit.Visible = False


4. Работа с дочерними формами.
Еще одно преимущество MDI-приложений состоит в том, что в программе легко можно управлять дочерними формами. В Visual Basic предусмотрены средства, упрощающие доступ пользователя к дочерним окнам, открытым в MDI-форме. В вашей программе легко можно предусмотреть средства автоматического упорядочивания дочерних окон. Можно также создать меню, в котором будет находиться список всех открытых дочерних окон.
Один из методов обеспечения удобного доступа ко всем находящимся на экране формам - особый способ их размещения на экране. Это позволяет пользователю переходить к любой форме с помощью щелчка мыши. Для реализации упорядочивания дочерних окон внутри родительской используется метод MDI-формы Arrange, который имеет один параметр - константу, указывающую каким способом необходимо упорядочить дочерние окна.
MdiMain.Arrange vbCascade
Значения констант:
1.    vbCascade - расположение «каскадом» - каждая неминимизированная форма немного выступает из-за предыдущей.
2.    vbTileVertical - каждая неминимизированная форма принимает высоту родительской, а все вместе занимают ширину родительской. Если дочерних форм очень много, они могут располагаться в несколько рядов.
3.    vbTileHorizontal - аналогично, но по горизонтали.
4.    vbArrangeIcons - пиктограммы всех минимизированных окон располагаются по нижнему краю родительской формы.
Обычно опции расположения окон помещаются в меню Window MDI-формы. Каждая опция расположения, которая поддерживается в программе, вынесена в отдельный пункт меню.
Еще один способ облегчения доступа к дочерним окнам приложения - создания списка открытых дочерних окон. Автоматическая поддержка списка дочерних окон включается во время создания меню родительской MDI-формы. Это делается установкой свойства пункта меню WindowList в True (отметить).

5. Оптимизация MDI-приложений.
1.    Каждое загруженное дочернее окно занимает некоторый объем оперативной памяти. Если необходимо несколько окон, то надо свести к минимуму количество элементов управления и программный код.
2.    Если дочерние и родительское окна имеют одни команды меню, необходимо хранить код их обработки в родительской форме. При этом изменить атрибут Private на Public. Тогда код этого события может использовать как родительское, так и дочерние окна.
3.    Помещать все невидимые элементы управления в родительскую MDI-форму. Это позволит дочерним окнам совместно использовать указанные элементы управления, не вызывая неоправданного перерасхода оперативной памяти.

6. Самостоятельная работа: создание MDI-приложения.
Задание: Создать MDI-приложение - простейший текстовый редактор (с помощью элемента TextBox), предусмотреть изменения в меню при активизации дочерних окон, список дочерних окон, переименование (изменение заголовка) дочерних окон через меню родительского окна, автоматическое изменение размеров TextBoxа вслед за изменением размеров дочернего окна. Пункты меню - File (New, *Close, Exit), *Edit (Change caption), *Window. Помеченные звездочкой пункты меню должны пропадать или появляться в зависимости от наличия дочернего окна. Change Caption меняет заголовок дочерней формы через модальный не-MDI диалог, в котором заголовок редактируется в EditBoxе. Сохраните ваш проект для дальнейшей модернизации.

Реализация технологии Drag&Drop средствами VB

 

Каждый раз, работая в Windows, мы сталкиваемся с технологией Drag&Drop (перетащить и оставить). Перетаскивая файлы и папки, кнопки, ярлыки, пиктограммы мы работаем с Drag&Drop. Можно сказать, что на этой технологии построена работа в Windows.

Функции Drag&Drop применяются в основном для настройки панели инструментов и быстрого переноса данных с одного приложения в другое или в пределах одного приложения. Есть еще несколько применений Drag&Drop, например, копирование и перемещение файлов в проводнике Windows или открытие файлов программой путем сбрасывания файла на окно приложения.

 


1. Объекты Drag&Drop

В процессе Drag&Drop участвуют два объекта: объект-источник и объект-приемник. Для объекта источника, в начале происходит захват элемента, для чего надо нажать кнопку мыши. В результате этот объект оставляется в объекте приемнике, для чего следует отпустить кнопку мыши.

Visual Basic предоставляет помощь в реализации "перетаскивания" элементов. В приложениях в качестве приемника обычно выступает форма (Form), но в принципе можно использовать любой элемент управления который может выступать в качестве контейнера. Чтобы реализовать в своем приложении перетаскивание нужно, во-первых, заставить элемент перемещаться, во-вторых, настроить приемник.

 


2. События Drag&Drop

Процесс перетаскивания, как правило, обрабатывается в процедуре обработки события MouseDown. Чтобы "захватить" стартовый объект с помощью курсора мыши, используется метод Drag. После этого объект становится "привязанным" к курсору мыши, пока кнопка мыши не будет отпущена.

 

Пример: процесс перетаскивания для элемента управления FileListBox

Private Sub Filel_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

If Button = vbLeftButton Then

Filel.Drag vbBeginDrag

End If

End Sub

 

Метод Drag имеет один необязательный параметр Action, который может принимать значения vbCancel = 0, vbBeginDrag = 1 (по умолчанию) и vbEndDrag = 2.

Когда переносимый объект попадает в объект-приемник, его следует там оставить. Это должно происходить после отпускания кнопки мыши (событие MouseUp). Однако можно установить, что вместо события MouseUp в режиме перетаскивания будет происходить событие DragDrop (при отпускании перетаскиваемого объекта над объектом получателем).

Объект-приемник определяет действие, которое должно быть совершено над перемещаемым объектом. Должен ли он быть скопирован, удален, перемещен, вставлен и. т. д. Это происходит в процедуре обработки события DragDrop объекта-приемника

 

Пример: принимающая сторона (ListBox) использует свойство FileName стартового объекта FileListBox, добавляя значение этого свойства в список

Private Sub Listi DragDrop(Source As Control, X As Single, Y As Single)

Listl.Add.Item Filel. FileName

End Sub

Этапы процесса перемещения следует сделать наглядными, устанавливая для каждого из них соответствующий вид курсора мыши. Например, символ "+" под курсором мыши позволяет определить, что файл в данную папку копируется. В Visual Basic можно управлять видом курсора мыши во время процесса перетаскивания. Для этого, кроме свойств MousePointer и Mouselcon, существует специальное свойство DragIcon. Это свойство может содержать изображение, которое можно загрузить, воспользовавшись функцией LoadPicture.

Событие, при обработке которого следует изменять курсор мыши, наступает при пересечении границы объекта. Это событие имеет сходство с событием MouseMove и называется DragOver (при перетаскивании объекта над объектом получателем). Процедуре обработки этого события передаются четыре параметра. Параметр Source содержит указатель на переносимый объект. Параметр State определяет положение курсора мыши по отношению к объекту и может принимать значения vbEnter, vbLeave или vbOver. Параметры X и Y содержат текущие горизонтальную и вертикальную позиции курсора мыши

 


3. Автоматическое перетаскивание

Почти у каждого элемента в VB есть свойства DragMode, которое указывает, каким образом элемент будет "перетаскиваться": автоматически или вручную (vbManual или vbAutomatic). При ручном режиме элемент можно "заставить" участвовать в Drag&Drop. При включенном автоматическом перетаскивании элемент практически всегда ждет когда его кто-нибудь перенесет. Автоматическое перетаскивание не всегда имеет преимущества перед ручным, поэтому следует работать в ручном режиме с использованием метода Drag.

 


4. Перетаскивание с использованием OLE

Кроме того, возможно реализовать Drag&Drop между приложениями, например, между Explorer и вашим приложением. Данный вид Drag&Drop'а называется OLE Drag&Drop. Перетаскивание с использованием OLE-технологии использует ту же модель объектов источника и приемника, что и перетаскивание, управляемое событиями. Однако в случае перетаскивания с использованием механизма OLE перемещается не элемент управления, а объект данных, что позволяет реализовать обмен данными с любыми приложениями, используя OLE-интерфейс Windows.

При использовании технологии OLE Drag&Drop в Visual Basic можно использовать либо автоматическое перетаскивание между элементами управления или приложениями, либо программируемое.

 


5. Автоматическое перетаскивание с использованием OLE

Использовать автоматическое OLE-перетаскивание достаточно просто. Если процесс переноса для этого элемента управления должен начаться автоматически, то свойству OLEDragMode присваивается значение vbOLEDragAutomatic. С помощью свойства OLEDropMode можно задать режим приема для объекта-приемника.

Значения свойств OLEDragMode и OLEDropMode можно задать как при разработке (окно свойств), так и при выполнении приложения:

 

Пример: как установить автоматический режим OLEDragMode и OLEDropMode для элемента управления TextBox. В результате такой установки выделяемую в текстовом поле Textl строку текста можно перемещать с помощью мыши (например, в другое текстовое поле).

Private Sub Form_Load()

Text1.OLEDragMode = vbOLEDragAutomatic

Textl.OLEDropMode = vbOLEDropAutomatic

End Sub

Однако автоматическое OLE-перетаскивание поддерживают не все элементы управления. Чтобы узнать, поддерживает ли данный элемент управления автоматическое OLE-перетаскивание, следует посмотреть в окне свойств, присутствует ли в списке возможных значений для свойств OLEDragMode и OLEDropMode значение Automatic.

Процесс переноса следует выполнять в соответствии с некоторыми правилами, в зависимости от типа элемента управления. Если перетаскивание осуществляется только при нажатой кнопке мыши, то считается, что данные перемещаются из объекта-источника в объект-приемник и по завершении переноса перемещённые данные в источнике следует удалить. Если перетаскивание выполняется при нажатой клавише [Ctrl], то данные просто копируются.

 


5. Программируемое перетаскивание с использованием OLE

 

Если обычный процесс OLE-перетаскивания необходимо каким-либо образом подкорректировать, то дополнительные действия следует запрограммировать. Это также необходимо в том случае, если вы работаете с элементами управления, которые не поддерживают автоматическое OLE-перетаскивание (CommandButton, Label, Checkbox, OptionButton, Frame, DriveListBox).

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

Свойства:

OLEDragMode Активизирует элемент управления в качестве объекта-источника.

OLEDropMode Активизирует элемент управления в качестве объекта-приемника.

Методы:

OLEDrag Начинает процесс перетаскивания.

События:

OLEDragDrop Происходит при перетаскивании объекта-источника

OLEDragOver Происходит, когда один компонент перемещают над другим.

OLEGiveFeedback Происходит после каждого события OLEDragOver и обеспечивает визуальную обратную связь (например, изменение курсора мыши).

OLEStartDrag Происходит при выполнении метода OLEDrag или при инициализации автоматического OLE-перетаскивания.

OLECompleteDrag Происходит после перемещения объекта-источника в объект-приемник для информирования источника о выполнении или отмене

При OLE-перетаскивании на стартовой стороне формируется пакет данных в соответствующем формате. Затем определяется, какие действия с этими данными допустимы: копирование или перемещение. На принимающей стороне пакет данных принимается и соответствующим образом обрабатывается.

 

Объект-источник

Как и при обычном перетаскивании, процесс OLE-перетаскивания начинается вызовом метода OLEDrag:

Private Sub Textl_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

If Button = vbLeftButton Then

Textl.OLEDrag

End If

End Sub

Метод OLEDrag не имеет аргументов и не формирует соответствующий пакет данных, а только начинает процесс перетаскивания.

 

 

Объект-приемник

На принимающей стороне свойство OLEDropMode должно иметь значение vbOLEDropManual. Когда данные оставляются, для приемника происходит событие OLEDragDrop. Кроме того, необходимо написать обработчик события OLEDragOver, в котором следует проверить тип перетаскиваемой информации и указать действия (например, для файлов это может быть копирование или перемещение).

Проверить тип перетаскиваемой информации можно с помощью метода GetFormat объекта Data, который является параметром события OLEDragOver.

 

Пример проверки:

If Data.GetFormat (vbCFFiles) Then ...

Т.е. проверка осуществляется подстановкой соответствующей константы в метод GetFormat и сравнении результата с True. Можно использовать следующие типы констант:

vbCFText - один или несколько текстовых (*.txt) файлов.

vbCFBitmap - один или несколько bmp-файлов.

vbCFMetafile - один или несколько wmf-файлов.

vbCFFiles - один или несколько файлов (любых).

vbCFRTF - один или несколько RTF-файлов.

 

После проверки необходимо выставить действие с помощью изменения параметра события OLEDragOver Effect.

Возможные константы:

vbDragEffectNone - ничего не происходит (используется для отмены каких-либо действий при ненужном формате перетаскиваемых файлов).

vbDragEffectCopy - копирует объекты из источника в приемник.

vbDragEffectMove - перемещает объекты из источника в приемник.

В зависимости от значения параметра Effect будут отображаться различные курсоры мыши.

Далее необходимо написать обработчик события OLEDragDrop для завершения перетаскивания - т.е. в этом обработчике находится код, ответственный собственно за перемещение.

Для обработки каждого файла из перетаскиваемых необходимо пройтись  с помощью цикла For Each по коллекции Files объекта Data (Data - параметр события OLEDragDrop).

Пример (просто заносит в список имена каждого из файлов):

For Each fff In Data.Files

     lstList1.AddItem fff

Next fff

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

 

Пример программируемого ОLE-перетаскивания: На форме расположен textBox. При перемещении нескольких файлов из Проводника, файлы открываются в TextBoxe

 

'1.Добавьте на форму TextBox. Установите его свойство OLEDropMode в "Manual", свойство "MultiLine" в "True".

'

'2.Добавьте функуцию выбора файлов

Sub DropFile(ByVal txt As TextBox, ByVal strFN$)

Dim iFile As Integer

iFile = FreeFile

Open strFN For Input Access Read Lock Read _

Write As #iFile

Dim Str$, strLine$

While Not EOF(iFile) And Len(Str) <= 32000

Line Input #iFile, strLine$

If Str <> "" Then Str = Str & vbCrLf

Str = Str & strLine

Wend

Close #iFile

txt.SelStart = Len(txt)

txt.SelLength = 0

txt.SelText = Str

End Sub

 

'3.Добавьте функуцию в событие OLEDragOver.

Private Sub Text1_OLEDragOver(Data As _

DataObject, Effect As Long, Button As Integer, _

Shift As Integer, X As Single, Y As Single, State _

As Integer)

If Data.GetFormat(vbCFFiles) Then

Effect = vbDropEffectCopy And Effect

Exit Sub

End If

Effect = vbDropEffectNone

End Sub

 

'4.Добавьте функуцию в событие OLEDragDrop.

Private Sub Text1_OLEDragDrop(Data As _

DataObject, Effect As Long, Button As Integer, _

Shift As Integer, X As Single, Y As Single)

If Data.GetFormat(vbCFFiles) Then

Dim vFN

For Each vFN In Data.Files

DropFile Text1, vFN

Next vFN

End If

End Sub

 

'Теперь загрузите приложение, откройте Проводник, выберите несколько текстовых файлов и "перетащите" их в TextBox. Каждый из файлов будет открыт в текстовом поле.

 


Работа с классами в Visual Basic.

 

Классы в VB.

Класс - это шаблон, по которому создаются объекты определенного вида.

Объект - это экземпляр класса.

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

 

Концепции ООП:

1.                       Инкапсуляция (сокрытие информации). Объекты, созданные на базе класса скрывают этапы своей работы. Инкапсуляция позволяет разработчику объекта изменять внутренние принципы функционирования, не оказывая влияние на использование объекта;

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

3.                       Полиморфизм. Возможность объектов использовать одноименные методы, которые могут выполнять различные действия в разных объектах. Например, в VB оператор + может использоваться как для сложения чисел, так и доля конкатенации строк.

4.                       Абстрагирование. При абстрагировании реальные процессы ограничиваются их функциями, существенными для программирования. Человек использует абстрагирование для того, чтобы проще описывать сложные объекты окружающей среды.

На панели элементов Visual Basic находятся, строго говоря, не объекты, а классы. Различие между классами и объектами состоит в том, что объекты в Visual Basic существуют только во время выполнения. Классы же используются для задания структуры объектов. Во время выполнения создаются копии классов.

 

Собственно классы в VB создаются с помощью модуля классов. Модули классов могут содержать несколько типов элементов:

  • Свойства (атрибуты объектов класса)
  • Методы (глобальные функции и методы, которые определяются в классе)
  • События (объекты, создающиеся из класса, могут вызывать определенные события)

Модули классов содержат 2 специальных события:

  • Initialize (в момент создания)
  • Terminate (в момент уничтожения)

Эти события являются аналогами конструктора и деструктора.

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

Добавление класса осуществляется через меню Project/Add/|Class Module. При создании модуля класса вы должны присвоить ему значащее уникальное имя (поле Name), т.к. Вы реально будете использовать это имя в программном коде при создании объектов класса. Если вы следуете венгерской нотации, то в качестве префикса перед именем класса рекомендуется использовать cls.

При создании объектов типа Active X и последующей компиляции их в dll или exe файлы, классами могут пользоваться также другие приложения.

Отличие Active X dll и exe от обычных файлов заключается в том, что приложения Active X могут выступать как серверы автоматизации, т.е. экспортировать свои объекты для использования в других приложениях. (Примеры Active X приложений - все офисные объекты: Word, Exel,...)


1.1. Добавление в класс свойств.

Простейший путь создания свойств - применение глобальных переменных при помещении их в раздел объявлений модуля класса.

В модуле класса cls1: Public Prop1 As String

В форме: Dim a as new cls1

a.Prop1="1"

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

Для этого проще всего использовать Class Builder - мастер, встроенный в среду разработки Visual Basic, позволяющий вам легко задать методы, свойства и события класса.

Открыть его можно следующим образом - Project/Add Class Module/VB Class Builder. После выбора появится окно Class Builder'а.

Используя меню File/New/Class или кнопку Add New Class на панели инструментов Class Builder'а, добавьте новый класс к проекту. Для этого необходимо указать имя класса, в списке Based On можно указать имя класса, на котором основан создаваемый класс. На вкладке Attributes можно задать описание модуля класса (комментарий), а также имя справочного файла для данного класса.

После этого используя File/New/Property, Method или Event можно легко добавить свойство, метод или событие к созданному классу. Также можно использовать дублирующие кнопки на панели инструментов.

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

v  Public Property (Let, Get, Set)  - создается Private переменная заданного типа и для нее оформляется Public свойство с доступом через Get, Let или Set.

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

?   Get - процедура, которая позволяет получить свойства как для объекта, так и для обычной переменной. Процедура считывания значения свойства.

?  Set - процедура, которая устанавливает значение для какого-либо объекта. Процедура Set используется аналогично Let, но передает не значение свойства, а ссылку на объект.

Однако в коде этих процедур Let, Get, Set возможно написать более сложную обработку или проверку.

v  Friend Property (Let, Get, Set) - создает свойство, «дружественное» другим объектам классов проекта. Это свойство могут использовать только другие классы этого проекта.

v  Public Variable - просто создает Public переменную без создания методов Let, Get или Set для нее.

v  Default Property - свойство по умолчанию. (У Label - Caption, у TextBox - Text). Каждый элемент управления имеет такое свойство, которое всегда используется Visual Basic, если имя свойства в коде явно не указано.

Textl = "Hello" '(равнозначно Textl.Text = "Hello")

Создайте какое-нибудь свойство Public Property (Let, Get, Set). Закройте Class Builder, на вопрос «Update...» ответьте «Да».

В браузере проекта появится новая папка Class Modules и в ней ваш только что созданный модуль класса. Откройте этот модуль класса двойным кликом на имени.

В модуле класса вы увидите объявление вашего свойства и два специальных метода - Let и Get. Вы можете легко изменить код этих процедур для получения тех или иных эффектов. Использование этих процедур позволяет реализовать инкапсуляцию в классах VB.


1.2. Добавление в класс методов.

Аналогично, используя Class Builder, можно создать методы. В поле Name следует указать имя метода, в поле Return Data Type - тип данных возвращаемого значения (если метод должен возвращать данные). Если поле Return Data Type оставить пустым, будет создана процедура Sub. Если указать тип данных, будет создана процедура Function. В список Arguments посредством кнопки со знаком + можно добавить аргумент метода с указанием его имени и типа данных. Если при этом установить флажок ByVal, аргумент будет передаваться как значение (ByVal).

Class Builder полностью автоматизирует создание методов, однако он создает только Public методы. Чтобы создать Private (т.е. внутренний) метод, создайте его с помощью Class Builder и измените квалификатор видимости с Public на Private. При создании методов в класс добавляются процедуры или функции.


1.3.Добавление в класс событий.

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

Используя Class Builder, легко добавить в класс события и их аргументы. Для этого необходимо объявить событие в классе Class/New/Event. Вызывать то или иное событие можно только из метода этого же класса с помощью оператора RaiseEvent. Например: RaiseEvent FindWindStatus(параметры)

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

Для использования событий объектная переменная должна быть объявлена с квалификатором WithEvents (см. ниже создание объектов класса) и без использования ключевого слова New в объявлении.

Dim WithEvents obj1 As cls1


1.4.Объявление и использование объектов.

Работа с классами подразумевает, как и в других языках, работу с объектами классов путем оперирования объектными переменными - указателями или ссылками на созданный в памяти объект класса.

Существуют два способа объявления объектов класса:

- Ранняя привязка

Заключается в том, что объектная переменная сразу объявляется как переменная заданного класса. Раннее связывание осуществляется, если при объявлении переменной указывается конкретный тип данных

<Область видимости> [WithEvents] <имя объектной переменной> As <имя класса>

Создает объектную переменную ранней привязки заданного класса без инициализации, т.е. указывающую на Nothing. Чтобы реально создать объект необходимо использовать Set <имя объектной переменной> = New <имя класса>. Можно сразу создать объект при объявлении объектной переменной используя:

<Область видимости> [WithEvents] <имя объектной переменной> As New <имя класса>

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

Пример:

Dim  clsOne As COne

Set clsOne = New COne

В данном случае, вызов объекта осуществляется с помощью оператора Set.

Или сразу

Dim clsOne As New COne

В данном случае, указатель на объект этого класса помещается в объектную переменную clsOne. Экземпляр класса создается в момент первого обращения. (Вызова свойства или метода).

 

- Поздняя привязка

Заключается в создании объектной переменной типа Object, не указывающую на какой-либо конкретный объект какого-либо класса. Привязка осуществляется в ходе выполнения программы программным кодом.

Пример:

Dim clsOne As Object

Set clsOne = New COne

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


1.5. Удаление объекта класса.

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

 


2. Самостоятельная работа -  доработка класса Splitter.

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

  • имя формы, на которой находится разделитель и элементы управления
  • имя левого элемента управления
  • имя правого элемента управления

После этого класс отлавливает события, происходящие на форме (изменение размеров, движение мыши) и изменять границы элементов управления определенным образом.

Программа, реализующая данный класс находится на сетевом диске:  P:\PREP\System Program|VB|Sample\Splitter|Splitter1.

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

Также создайте новый метод, позволяющий установить «разделитель» ровно на середину между двумя объектами (на ? суммарной ширины объектов и самого разделителя). Создайте в форме кнопку, которая будет вызывать этот метод.

Примечание: класс в этом приложении был создан не с помощью Class Builder, поэтому Вы не сможете использовать его для выполнения этого задания. Поэтому перед тем, как начинать работу над этим заданием, создайте пробный класс с помощью Class Builder'а и посмотрите, как создать свойства, методы и события вручную.


Технология OLE.

 

 

Термин OLE это сокращение от Object Linking and Embedding (связывание и внедрение объектов). OLE - это метод, позволяющий редактировать данные из одного приложения в другом или переносить их в другое приложение. Это способ интеграции программных продуктов семейства Microsoft Office. Например, благодаря OLE можно легко встроить таблицу Excel в документ Word. Приложения, поддерживающие технологию OLE, позволяют пользователю вызывать одно приложение из другого, не выходя из контекста интерфейса исходной программы.

Достоинства использования OLE технологии:

1.      Возможность редактировать различные типы объектов из единого пользовательского интерфейса.

2.      Создание профессиональных отчетов. VB позволяет дистанционно управлять такими приложениями как Word и Excel, что можно использовать в своей программе.

3.      Автоматическое создание документов. Документы можно создавать непосредственно из программного кода VB.

4.      Доступ к информации. OLE-объекты можно использовать в VB для доступа к информации, находящейся в существующих файлах.

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

 

Виды данных объекта

Каждый объект имеет два различных вида данных: данные представления (Presentation Data, PD) и естественные данные (Native Data, ND). Данные представления служат для представления информации так, как она отображается в оригинальном приложении. Например, таблица Excel как объект должна быть представлена в табличной форме. Естественные данные - это собственно информация, т.е. содержимое таблицы.

Связывание

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

Внедрение

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

 


1. Элемент управления OLE Container

Наиболее простой способ использования OLE в вашем приложении - это применение элемента управления OLE Container или просто OLE. Этот элемент управления позволяет встраивать или связывать OLE-объекты в ваши программы.

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

 

Таблица. Методы объекта OLE Container .

Метод

Значение Action

Действие

CreateEmbed

0

Создает внедренный объект

CreateLink

1

Создает связанный объект

Copy

4

Копирует объект в буфер обмена

Paste

5

Вставляет объект из буфера обмена

Update

6

Восстанавливает текущие данные связанного объекта

DoVerb

7

Открывает объект для определенной операции (например, для редактирования)

Close

9

Закрывает объект

Delete

10

Удаляет содержащийся в контейнере объект

SaveToFile

11

Сохраняет объект в файле

ReadFromFile

12

Загружает объект из файла

InsertObjDIg

14

Отображает диалоговое окно Insert Object Dialog

PasteSpecialDIg

15

Отображает диалоговое окно Paste Special Dialog

SaveToOlelFile

18

Сохраняет объект в формате OLE 1.0

Представляет интерес свойство OLEDropAllowed. Если оно имеет значение True, объект можно просто взять из другого приложения и переместить в нужное место с помощью перетаскивания (Drag & Drop). Таким способом можно, например, перенести изображение из Проводника в элемент управления OLE Container.

 

Создание внедренного объекта осуществляет метод CreateEmbed.

CreateEmbed sourcedoc, class

При вызове этого метода достаточно указать имя класса внедряемого объекта:

OLE1.CreateEmbed " ", "Word.Document"

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

CreateLink sourcedoc, sourceitem

Кроме того, параметр sourceitem должен содержать ссылку на область в объекте, например на необходимые ячейки:

OLE1.CreateLink "D:\EXCEL\TERMIN.XLS", "C1R1"

Сохранение объектов не только возможно, но даже необходимо, чтобы при следующем запуске приложения в контейнере находился тот же OLE-объект. Сохранение данных в двоичном формате применимо к внедренным объектам, так как связанные объекты сохраняются источником:

fh = FreeFile

Open "С:\DATA.OLE" For Binary As fh

OLE1.SaveToFile fh

Close #fh

Загрузка объектов производится аналогичным образом при помощи метода ReadFromFile.

Open "С:\DATA.OLE" For Binary As fh

OLE1.ReadFromFile fh

Close #fh

 


2. Объекты OLE как элементы управления

Вместо использования элемента управления OLE Container Visual Basic позволяет добавить любой объект, обладающий OLE-возможностями, вывести его на панель инструментов и использовать как элемент управления. Для добавления таких элементов управления следует выполнить команду Components меню Project, а затем во вкладке Insertable Objects диалогового окна Components выбрать все необходимые объекты. После добавления объекта его значок появляется на панели инструментов Visual Basic, с помощью которой объект может быть помещен в форму как обычный элемент управления


3. OLE Automation

Благодаря возможности использования объектов OLE как элементов управления, возникает возможность существования технологии OLE Automation. Эта технология позволяет работать с различными объектами как с элементами управления. Так, вы можете работать в Visual Basic с редактором Word для Windows почти как с элементом TextBox. Используя OLE Automation, можно оперировать связанными объектами при помощи команд.

 


4. Создание объекта OLE

Объект OLE необходим и для OLE Automation. Но в этом случае не нужен элемент управления OLE Container. Можно просто создать объектную переменную и присвоить ей ссылку на объект. Для этого с помощью команды References меню Project библиотеку объектов другого приложения следует включить в приложение Visual Basic, после чего объекты другого приложения станут доступными в вашем коде.

Dim ww As New Word.Application

OLE-объект можно подключить не только из библиотеки, но также из файла (например, *.DOC, *.XLS). Для этого предназначена функция Get0bject, которая возвращает ссылку на объект из файла:

Set variable = GetObject([filename][, class])

Dim DB As Object

Set DB = GetObject("C:\TEXT\ACCOUNT.DOC", "Word.Document")

 


5. Использование объекта OLE

После того как объект создан, с ним можно работать. Для этого обычно используют язык макросов приложения этого объекта. В приведенном примере открывается документ Word, в который затем добавляется строка "Hello World":

Private Sub Commandl_Click()

Dim ww As New Word.Application

ww.Visible = True      'Word становится видимым

ww.Documents.Add       'Открывается документ

ww.Selection.TypeText "Hello World"

End Sub

Как вы можете убедиться, здесь используются команды VBA для Word.

 


6. Работа с объектами Word

Чтобы использовать объекты Word в VB, необходимо подключить к проекту библиотеку Microsoft Word Object Library через диалоговое окно References. Два самых важных объекта Word - Word.Application и Word.Document обеспечивают доступ к экземпляру приложения и документам Word.

Для запуска Word из VB, достаточно создать экземпляр объекта Word.Application. Затем необходимо сделать этот объект видимым и открать новый документ Word (см. предыдущий пример).

Сохранение документа: objDoc.SaveAs "C:\temp\myDoc.doc" или, если известно имя файла if objDoc.Saved=False then objDoc.Save.

Открытие документа: Set objDoc = objWord.Documents.Open ("C:\temp\myDoc.doc")

Печать: objDoc.PrintOut

Предварительный просмотр: objDoc.PrintPreview

Для работы с текстом можно использовать коллекции Words, Sentences и Paragraphs. Например, заменить слово в документе можно, присвоив некоторое значение свойству Text. ObjDoc.Words(number).Text.

Кроме того, для ввода текста можно также использовать методы InsertAfter и InsertParagraphAfter.


Создание элементов управления Active X.

ActiveX базируется на объектной модели компонентов (Component Object Model, СОМ) Microsoft. Эта технология является попыткой избежать создания гигантских программных комплексов и распределить функциональные возможности программного обеспечения между многими небольшими компонентами. Технология ActiveX позволяет создавать объекты, которые многие разработчики могут использовать для создания собственных приложений.

 

1. Создание ActiveX компонент

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

Когда создание ActiveX компонента полностью завершено и компонент готов к применению, его следует зарегистрировать. Это значит, что в реестр Windows должна быть внесена определенная информация. Компонент ActiveX следует зарегистрировать с помощью функции RegSvr32.exe. После регистрации другие приложения могут задействовать данный ActiveX компонент.

Регистрация: RegSvr32.exe <имя компонента>

Разрегистрировать: RegSvr32.exe <имя компонента> /u (/u означает unregister)

 

2. Различие между исполняемыми ActiveX и динамическими библиотеками ActiveX

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

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

Для создания проекта разработки динамической библиотеки ActiveX следует воспользоваться командой New Project меню File и выбрать в диалоговом окне New Project опцию ActiveX DLL.

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

 

3. Создание документов ActiveX

Документы ActiveX также можно выполнить либо как исполняемые компоненты, либо как динамические библиотеки. При создании проекта можно выбрать один из типов: либо ActiveX Document DLL либо ActiveX Document EXE. В обоих случаях создается проект с новым компонентом UserDocument. Он сохраняется в файле с расширением DOB.

В принципе UserDocument - то же самое, что форма, однако в нем отсутствуют некоторые элементы, например заголовок. Этот документ предназначен для выполнения в приложениях-контейнерах, к которым относится, в том числе и Microsoft Internet Explorer. В этом и заключается основное отличие документов ActiveX от обычных программ. Документ ActiveX - это приложение, которое выполняется в некотором контейнере.

Документы ActiveX содержат некоторые данные, но доступ к ним для просмотра и редактирования происходит через определенную программу.

Если запустить или скомпилировать такой проект, Visual Basic, кроме ЕХЕ или DLL файла, создаст файл с расширением .VBD (Visual Basic Document). Этот файл можно добавить в виде связи в Internet Explorer. В этом случае Internet Explorer работает как приложение-контейнер и вместо страницы в формате HTML показывает UserDocument. Теперь приложение Visual Basic работает в Internet Explorer.

Как правило, документу ActiveX доступно почти все, что доступно "нормальному" проекту Visual Basic. Можно использовать обычные и ActiveX элементы управления, коды и дополнительные формы. Тем не менее, следует помнить, что документ ActiveX всегда работает в приложении-контейнере и поэтому ограничен его возможностями.

В одном приложении можно использовать несколько пользовательских документов (UserDocument). Но в отличие от форм, они не отображаются методом Show, а должны выводиться на экран средствами навигации приложения-контейнера: так же, как в Internet происходит перемещение с одной страницы на другую с помощью гиперссылки. Специально для этого в Visual Basic имеется объект Hyperlink, с помощью которого можно выполнять такие переходы.

Private Sub Command2_Click()

Hyperlink.NavigateTo "doc2.vbd"

End Sub

Метод NavigateTo производит переход к нужной гиперссылке. Это может быть URL или файл, такой же, как пользовательский документ.

 

 

4. Элементы управления ActiveX

Visual Basic предоставляет разработчику возможность создавать собственные элементы управления ActiveX - Custom Controls. Это могут быть как совершенно новые элементы управления, так и базирующиеся на уже существующих элементах и расширяющие их функциональные возможности. Новые элементы можно использовать как в проектах Visual Basic, так и в других системах программирования, которые поддерживают технологию ActiveX. К ним относятся, например, Microsoft Internet Explorer или Netscape Navigator

 


Создание элементов управления ActiveX

Существует три подхода к созданию элементов управления ActiveX:

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

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

3.      создать оригинальный элемент управления. Внешний вид элемента создается с использованием графических методов. Данный способ позволяет разработать совершенно новый пользовательский интерфейс.

 

1. Создание элемента управления из существующих стандартных элементов

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

Для создания элемента управления из существующих стандартных элементов, необходимо выбрать проект ActiveX Control. Объект ActiveX Control - это аналог формы. После чего необходимо добавить в форму, которая называется UserControl, необходимые элементы управления. Затем необходимо присвоить необходимые свойства проекту и элементам управления. Свойства также создаются с помощью функций PropertyGet и PropertyLet. Затем необходимо создать пользовательский интерфейс. Компиляция проекта при помощи File/Make/ИмяПроекта.ocx.

Особое внимание при разработке следует уделить установке размеров нового элемента управления. Изменяя размеры элемента управления, необходимо, чтобы все составляющие его элементы не были скрыты. Установка размеров элементов осуществляется программно, путем изменения значений свойств Width и Height.

Для того чтобы передать элемент управления на другие компьютеры, необходимо учесть, установлен ли на компьютере VB. Если VB установлен, то для того, чтобы передать управление необходимо скопировать компоненту в папку Windows/SYS и выполнить RegSvr32.exe <полное имя файла>. Запустив VB можно увидеть, что в составе компонентов появится новая компонента.

Если же VB не установлен, т.е. нет необходимых библиотек, необходимо создать инсталлятор в Package & Deployment Wizard. Если *.ocx распространяется в составе приложения, то можно сделать инсталлятор всего приложения.

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

2. Доработка существующего элемента управления

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

Специальный объект PropertyBag позволяет элементу управления ActiveX хранить собственные характеристики. Метод PropertyChanged информирует, что пользователь изменил значение свойства, после чего VB автоматически генерирует события WriteProrerties и ReadProperties.

3. Создание оригинального элемента управления ActiveX

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

Код прорисовки элемента управления помещается в процедуру обработки события Paint, которое генерируется при каждой перерисовке контейнера, содержащего этот элемент. Чтобы создать внешний вид элемента управления можно воспользоваться элементами управления Shape и Line.

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

 

Создание элементов управления ActiveX с помощью мастера

Среди утилит Visual Basic есть мастер интерфейсов ActiveX (ActiveX Control Interface Wizard). С его помощью можно легко и просто сконструировать весь набор свойств, методов и событий разрабатываемого элемента управления. Мастер необходимо использовать с самого начала создания проекта, поскольку он игнорирует все, что создано вручную. Add-Ins/Add-In manager/ActiveX Contril Interface Wizard. Мастер обычно можно выбрать при запуске Visual Basic или при создании нового проекта ActiveX Control.

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

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

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

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

После завершения работы мастер добавляет необходимые строки кода в модуль элемента управления.

Для многих элементов управления, которые поставляются с Visual Basic, кроме общего окна свойств Visual Basic, существует собственное окно свойств. Такое окно свойств можно создать и самому. Для этого имеется мастер страниц свойств (Property Page Wizard). Вызвать мастер можно с помощью Add-Ins/Add-In manager/ Property Page Wizard.

 

 


Создание элементов управления Active X на примере ZigZag.

Создавать элементы управления Active X (Active X Controls) в среде VB очень просто. На данном занятии мы создадим элемент управления ZigZag, который представляет собой контейнер, внутри которого двигается некий текст.

По сути Active X Control - это класс, имеющий визуальное представление и скомпонованный таким образом, что можно получить доступ к методам, свойствам и событиям класса, не имея собственно исходного кода этого класса.

Мы будем создавать наш элемент управления ZigZag не с нуля, а комбинируя уже существующие стандартные элементы управления VB.

Откройте статью М. Эскина «Создаем свой Active X Control», которая расположена на сетевом диске P:\PREP\System_program\VB\Lessons\ActiveX_Control\1.html и создайте вместе с автором свой элемент управления Active X. Обратите внимание на использование Active X Ctrl Interface Wizard'а, существенно облегчающего определение свойств, методов и событий вашего элемента управления.

 

2. Самостоятельная работа.

Разработать элемент управления Active X -  Liner, представляющий собой простейший векторный графический редактор, оперирующий только линиями различного цвета.

Редактор имеет четыре кнопки для управления его работой (Очистить, Удалить, ОК и Добавление), панель выбора цвета (из кнопок), а также область рисования. В области рисования нажатие левой кнопки мыши приводит к началу рисования новой линии. Удерживая левую кнопку мыши пользователь создает новую линию текущего цвета. Отпуская кнопку мыши, пользователь завершает рисование линии и полученная линия сохраняется. Кнопка «Очистить» полностью очищает поле рисования. Кнопка «ОК» просто инициирует (RaiseEvent) созданное вами событие onOK. Нажатие кнопки «Добавление» переключает элемент в режим редактирования. В режиме редактирования кнопки выбора цвета, «Очистить» и «ОК» неактивны, кнопка «Удалить» становится активной, а кнопка «Добавить» вдавливается и текст на ней изменяется на «Редактирование». В режиме редактирования пользователь может выбрать любую существующую линию нажатие правой кнопки мыши около нее. При этом выбранная линия выделяется:

Когда линия выбрана, можно «захватить» мышью один из ее концов и перетащить его на новое место (левой кнопкой мыши) или удалить выбранную линию нажатием кнопки ‘Удалить'.

Новое нажатие на кнопку «Редактирование» переводит редактор в режим рисования (добавления новых линий), кнопка «Удалить» вновь становится неактивной.

Полученный элемент управления встроить в форму.

Советы по выполнению:

-    все линии хранятся внутри элемента управления в виде массивов координат начала и конца линий, также хранится цвет для каждой линии

-    панель выбора цвета - массив элементов управления «кнопка», имеющие свойство BackColor - цвет на кнопке, а Style - «1-Graphical». Обработка нажатия весьма проста - обрабатывается нажатие на все кнопки одной функцией и текущему цвету присваивается свойство BackColor нажатой кнопки (для хранения цвета используйте переменную типа Variant)

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

Line (x1,y1) - (x2,y2),Color,BF

BF - необязательный параметр, который вместо линии рисует закрашенный прямоугольник по заданным координатам

-    для рисования новых линий необходимо написать соответствующие обработчики событий MouseDown (кнопку мыши нажали), MouseMove (водят мышью - рисуют), MouseUp (кнопку мыши отпустили - закончили рисование линии)

-    для выбора линии в режиме рисования проще всего использовать такой метод:

o X и Y - координаты мыши в момент нажатия правой кнопки мыши (они передаются в обработчик в качестве параметров аналогичного вида)

o Проходим по всем существующим линиям

o Для каждой линии считаем расстояние от начальной до конечной точки по формуле sqr((x1-x2)^2+(y1-y2)^2)

o Также считает сумму расстояний от указателя мыши до начальной и конечной точки

o Вычитаем из второго первое

o Выбираем линию с минимальной разницей - это и будет самая ближайшая линия

-    Кнопка «Добавить/Редактирвать» - флажок (CheckBox), имеющий свойство Style равным «1-Graphical». Изменение надписи происходит по событию Click.

 


Использование функций Windows API в VB.

 

Windows API, или Application Programming Interface (интерфейс прикладного программирования) - это набор функций, которые предоставляет программисту ОС Windows. Эти функции могут вызываться из VB для выполнения задач, для которых недостаточно стандартного программного кода VB. Например, стандартные функции VB не позволяют перезагрузить компьютер, но перезагрузку можно выполнить, обратившись к соответствующей функции Windows API.

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

Для использования функций Windows API, их необходимо сначала объявить в разделе General Declarations (в самом начале кода), используя ключевое слово Private. Описание Windows API функций, а также констант и пользовательских типов можно найти в файле Win32api.txt. Можно просто скопировать из этого файла строку, начинающуюся с оператора Declare. В операторе Declare содержатся все параметры функции, а также ссылка на библиотеку dll, в которой данная функция описана.

Помимо параметров и имени библиотеки, в большинстве операторов Declare используется ключевое слово Alias (псевдоним). Псевдоним определяет «действительное» имя API функции, т.е. имя, определенное в dll. Псевдонимы используются в том случае, если в библиотеке указано недопустимое для VB имя функции.

После объявления функции, возможно, будет необходимо подключить классы, используемые в функции и описать константы. Эти описания также можно скопировать из файла Win32api.txt. Для вызова функции из кода программы необходимо обратиться к ней по имени, передать необходимые параметры и, возможно, присвоить результат выполнения какой-либо переменной.

В поставку VB входит специальное приложение API Text Viewer, которое позволяет быстро добавить объявление нужной функции API. Для запуска этого приложения необходимо выбрать в меню Пуск группу программ VB (Microsoft Visual Studio Tools), а затем API Text Viewer. После запуска приложения необходимо выполнить команду Load Text File и загрузить файл Win32api.txt. После этого, в разделе Available Items появится список доступных объявлений API.

API Text Viewer позволяет копировать в буфер обмена одновременно несколько функций. А также определить, будет ли функция объявлена с ключевым словом Public, или Private. Глобальные API-объявления можно использовать в модулях и обращаться к ним из любых других форм и модулей проекта. Если же API функцию необходимо использовать в форме, она должна быть объявлена с ключевым словом Private.

 

Примеры некоторых функций:

SndPlaySound - позволяет проигрывать звуковые файлы в формате WAV

SystemparametersInfo - используется для настройки обоев рабочего стола Windows.

ExitWindowEx - позволяет завершить работу Windows.

GetFreeDiskSpace - получить объем свободного места на диске.

CreateProcess - позволяет запустить приложение

WaitForSingleObject - ожидание каких-либо действий, или состояния объекта

GetFileTime - получить дату создания, доступа и последней модификации файла

GetFileSize - получить объем файла

GetFileAttributes - получить атрибуты файла

GetSystemTime - позволяет получить системные значения даты/времени

ReadFile - чтение файла

 


API-вызовы для работы с окнами

Также некоторые API функции позволяют управлять поведением окон и получать информацию о других окнах. Для идентификации окон используется дескриптор окна - уникальное число, присвоенное каждому открытому окну (window handle).

Для определения дескриптора окна используется функция FindWindow. У нее два параметра: имя окна и имя класса окна. Функция возвращает либо дескриптор окна, либо нуль, если соответствующее окно не найдено. Для получения значений имени окна и имени класса окна можно воспользоваться такими API функциями как GetWindowText и GetWindowClass.

Зная дескриптор, можно легко управлять состоянием окна с помощью функции Windows API ShowWindow (каким образом следует отобразить окно: минимизировать, максимизировать, и т.д.).

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

 

API-вызовы выполнения программы

Функция Shell позволяет запустить из одной программы другую, но эта функция передает управление в вызвавшую ее программу, не дожидаясь того, когда будет выполнена запущенная задача. Вместо этого можно использовать функцию ExecCmd.


  Файловые функции в Visual Basic.

 

1. Функции работы с файлами.

Файлы - основные организационные единицы файловой системы, предназначенные для хранения информации.

 

Функция Dir

Одна из наиболее полезных функций при работе с файлами - Dir$. Она похожа на команду DOS dir, и служит для получения списка файлов и каталогов, находящихся в заданном каталоге.

Имя файла может быть задано в виде полного имени файла или относительного пути, а также в виде шаблона, состоящего из символов подстановки (*, ?).

Синтаксис функции Dir:

Строковая_переменная = Dir$ (Шаблон, [Атрибуты])

Шаблон - полное имя файла или шаблон имени файла (или каталога).

Атрибуты - необязательный параметр, определяющий дополнительные параметры отбора файлов. Составляется суммированием следующих констант:

Константа

Значение

Назначение

vbNormal

0

Значение по умолчанию

vbHidden

2

Поиск скрытых файлов

vbSystem

4

Поиск системных файлов

vbVolume

8

Возвратить метку тома

vbDirectory

16

Поиск каталогов

vbReadOnly

1

Поиск файлов, имеющих атрибут read-only

Возвращаемое значение - первый найденный файл, каталог или метка тома или пустая строка, если ничего не найдено.

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

ВНИМАНИЕ: Если функция Dir$ вернула пустую строку (следующий фал не найден), то повторный вызов Dir$ без параметров (получить следующий файл или каталог) вызовет Runtime Error.

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

Dim Filename As String

Filename = Dir$("C:\Tmp\*.*",vbHidden+vbDirectory)

While Filename <> ""

     Debug.Print Filename

     Filename = Dir$

Loop

Таким образом, функцию Dir$ можно использовать как для поиска файлов и папок, так и для определения существования того или иного файла (задав его имя в качестве первого параметра).

Функции манипулирования файлами

Кроме Dir$ существуют другие функции, предоставляющие возможности, аналогичные командам DOS по работе с файлами.

Действие

Синтаксис

Копирование файла

FileCopy <откуда>, <куда>

Удаление файлов

Kill <путь>

Переименование файла

Name <старое_имя> As <новое_имя>

Создание новой папки

MkDir <путь>

Удаление пустой папки

RmDir <путь>

Замена текущего каталога

ChDir <путь>

Замена текущего диска

ChDrive <диск>

Однако по сравнению с командами MS-DOS эти функции имеют ряд ограничений:

- FileCopy не может копировать несколько файлов по шаблону

- Name тоже не может применять шаблоны для переименования

 

Определение местонахождения файла программы

Для определения местонахождения исполнимого файла программа должна использовать конструкцию App.Path.

Данное свойство объекта App содержит путь к программе. Особенность заключается в том, что эта функция возвращает путь c ‘\' на конце, если программа находится в корневом каталоге какого-либо диска, и без, если в каком-либо другом каталоге. Поэтому, чтобы привести путь к используемому виду необходимо проверить наличие ‘\' на конце возвращаемого пути и добавить (или удалить) ‘\'.

 

Пример использования:

Dim Apppath1 As String

Apppath1 = App.Path

If Right$(Apppath1,1) <> "\" Then Apppath1 = Apppath1 + "\"

...

Dim Filename As String

Filename = Apppath + "myfile.txt"

 


2. Обработка текстовых документов (файлы последовательного доступа).

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

Для открытия файлов используется конструкция Open:

Open <имя_файла> For <режим> [Access <доступ>] [<блокировка>] As [#]<номер_файла>[Len=<длина_записи>]

<режим> - режим в котором открывается файл:

            Append - для добавления в конец файла

            Binary - для работы с файлом в бинарном режиме (см. ниже)

            Input - для чтения файла (файл не перезаписывается)

            Output - для вывода в файл с созданием или перезаписью файла

            Random - для произвольного доступа (по умолчанию)

<доступ> - операции, которые можно проводить с файлом:

            Read - можно только читать

            Write - можно только записывать

            Read Write - можно все

<блокировка> - тип блокировки файла:

            Shared - другие процессы могут делать с файлом все, что угодно

            Lock Read - блокировка чтения

            Lock Write - блокировка записи

            Lock Read Write - полная блокировка (другие процессы не могут даже открыть файл)

<номер_файла> - дальнейшая работа с этим файлом производится по номеру, под которым он открыт, причем под одним номером может быть открыт только 1 файл. Для получения свободного номера рекомендуется использовать функцию FreeFile (без параметров).

 

<длина_записи> - используется в файлах прямого доступа (см. ниже).

Если файл уже открыт или заблокирован другим процессом или произошла другая ошибка, Open генерирует ошибку (которую можно обработать с помощью OnError ...).

После того, как файл открыт, с ним можно начать работать.

Оператор Line Input #номер_файла, <строковая_переменная> позволяет считать следующую строку из файла. Достигнут ли конец файла, нужно применять функцию EOF(номер_файла).

Иногда необходимо считать не всю строку. В этом случае используется оператор Input # или функция Input.

Оператор Input # предназначен для файлов, в котором данные хранятся с разделителями:

«Строка», 100, #2002-10-10#

В следующей строке кода информация корректно считывается в соответствующие переменные:

Dim StringVar As String

Dim IntVar As Integer

Dim DateVar As Date

Input #1, StringVar, IntVar, DateVar

Другой способ считывания информации - использование функции Input (не путать с оператором Input #). Эта функция считывает указанное число символов в строковую переменную:

Input (<кол-во символов>,#номер_файла)

После работы с файлом его нужно закрыть с помощью оператора Close #номер_файла.

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

Print # и Write #.

Оператор Print #номер_файла, <выражение> записывает <выражение> в файл в текущую позицию. Если в конце оператора стоит ‘;', то производится перевод на новую строку.

Оператор Write #номер_файла, <список_вывода> противоположен оператору Input # - т.е. выводит информацию в файл с разделителями.

 


3. Файлы произвольного (прямого) доступа.

Файлы с последовательным доступом не имеют какой-либо структуры, структура определятся самим считывающим кодом. Это способствует удобочитаемости файла, однако поиск и перемещения по файлу осложнены. Один из способов создания файла с какой-либо структурой в VB состоит в использовании файлов произвольного (прямого) доступа.

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

Пример:

Private Type MyRecord

            FIO As String

            Birth As Date

            Salary As Integer

End Type

Потом необходимо открыть файл с помощью оператора Open. Отличие от открытия файлов последовательного доступа заключается в использовании специального режима открытия - Random и задании в конце конструкции длины структурной единицы файла прямого доступа с помощью Len = <длина_в_байтах>.

 

Пример:

Dim tmprec As MyRecord

Open "c:\tmp.mmm" For Random As #1 Len = Len (tmprec)

Чтение записей осуществляется  с помощью оператора

Get #номер_файла, [<номер_записи>], <переменная>

Если параметр <номер_записи> опускается, то просто происходит чтение следующей записи. Переменная имеет тип, заданный пользователем (UDT).

Для записи и добавления новых записей используется

Put #номер_файла, [<номер_записи>], <переменная>

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

Перемещение по файлу осуществляется с помощью оператора

Seek #номер_файла, <номер_записи>

После этого Get и Put без второго параметра будут работать с записью, на которую вы переместились.


4. Файлы инициализации.

Файлы инициализации (ini-файлы) применяются для сохранения важной информации о программе и ее параметрах, заданных пользователем. Типичные INI-файлы - это обычные текстовые файлы с расширением .ini и простой структурой, которая позволяет получать или сохранять отдельные фрагменты информации.

Пример ini-файла  можно увидеть, просмотрев с помощью Блокнота файл system.ini в системной папке Windows (или WinNT или как вы там ее назвали при установке).

Структура Ini-файлов содержит три основных элемента - разделы, ключи и значения. Также в нем могут присутствовать комментарии (начинаются с ;).

Одна из причин популярности использования ini-файлов состоит в том, что программисту не надо заботится о создании файла, его открытии или поиске конкретной строки. Для работы с ini-файлами необходимо объявить две функции Windows API:

Declare Function GetPrivateProfileString Lib "kernel32" Alias _

      "GetPrivateProfileStringA" (ByVal lpApplicationName As String, _

      ByVal lpKeyName As Any, ByVal lpDefault As String, _

      ByVal lpReturnedString As String, ByVal nSize As Long, _

      ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileString Lib "kernel32" Alias _

      "WritePrivateProfileStringA" (ByVal lpApplicationName As String, _

      ByVal lpKeyName As Any, ByVal lpString As String, _

      ByVal lpFileName As String) As Long

Эти определения функций можно легко получить с помощью инструмента API Text Viewer, входящего в комплект поставки Microsoft Visual Studio 6.

Параметры:

- lpApplicationName - имя раздела

- lpKeyName - имя ключа

- lpDefault - строка, записывающаяся в выходную строку по умолчанию, если ключ не был найден

- lpReturnedString - строка, куда возвращается значение ключа, либо откуда записывается значение ключа (тогда это параметр lpString)

- lpFileName - имя файла (и путь, если он нужен)

- nSize - максимальный размер считываемого значения ключа (в байтах)


5. Использование FSO (File System Object).

В VB 6 для работы с файлами помимо стандартных функций, описанных выше, существует «продвинутый» инструмент - FSO. Более подробно о работе с ним вы можете узнать из файла на сетевом диске P:\PREP\System_Program\VB\Sample\File\FileSystemObject\Doc\FileSystemObject.htm. В каталоге P:\PREP\System_Program\VB\Sample\File также находятся примеры по работе с файлами.

 

 


Использование элемента управления WinSock Control для создания сетевых приложений.

 

Для создания сетевых приложений средствами VB проще всего использовать Active X Control WinSock, который реализует связь компьютеров по TCP или UDP протоколам.

Для подключения WinSock к вашему приложению из Components необходимо выбрать следующую строку «Microsoft Winsock Control 6.0».

Начнем с того, что вообще такое стек TCP/IP протоколов. Стек TCP/IP это конструкция из трех основных протоколов:

TCP

UDP

IP

Т.е. два протокола TCP и UDP базируются и используют в своей работе IP-протокол. Отличие TCP от UDP - TCP - протокол  с гарантированной доставкой пакетов и созданием т.н. «канала», UDP - простой и быстрый протокол, но без гарантированной доставки пакетов и без создания «канала». Рекомендуется применять TCP-протокол.

Теперь рассмотрим IP-адресацию. Для адресации компьютеров применяется 4 числа от 0 до 255, разделенные точкой. Например, 192.233.80.41. Адрес 127.0.0.1 является «петлей», т.е. указывает на свой компьютер (с помощью него можно тестировать приложения для сети без сети как таковой). Однако на каждом компьютере может работать несколько программ, использующих сеть. Каждая программа должна создать т.н. «сокет», т.е. виртуальное соединение. Чтобы отличить сокеты друг от друга и сделать их адресуемыми, каждому сокету поставлено в соответствие число от 0 до 65535 (порт). Например, прокси-сервер в вычислительном зале нашей кафедры работает по адресу 192.168.10.1:8080, т.е. номер сокета - 8080.

 

Рассмотрим процесс соединения одного компьютера с другим при помощи сокетов по TCP-протоколу. Компьютеры будем называть соответственно сервером и клиентом (т.е. компьютер, который соединяется - клиент, который ждет соединения - сервер).

 

1.      Сервер создает сокет и переходит в режим «прослушивания» (listen).

2.      Клиент создает сокет, задает адрес сервера и номер сокета, по которому «слушает» сервер и посылает запрос на соединение (connect).

3.      Серверный сокет, «услышав» запрос на соединение, должен указать клиенту номер сокета, по которому собственно и произойдет соединение  и соединить серверный сокет для приема/передачи (вновь созданный, либо бывший сокет для прослушивания) с сокетом клиента (accept).

4.      После этого сокеты клиента и сервера соединены и могут передавать информацию.

5.      По окончании работы необходимо закрыть сокеты на обоих концах.

 

Вот как эта последовательность реализуется с помощью WinSock:

1.      На форму сервера помещаем WinSock и задаем его свойства: LocalPort (номер сокета -порт сервера), Protocol (тип протокола). Для перевода сервера в режим прослушивания используется метод Listen (объекта WinSock).

2.      На форму клиента (другое приложение) помещает WinSock и задаем его свойства аналогично серверу, плюс RemoteHost (IP-адрес к которому вы хотите подсоединиться) и RemotePort (порт сервера). Для посылки запроса на соединение используется метод Connect. В случае отказа в соединении происходит ошибка, которую можно обработать.

3.      В форме сервера необходимо написать обработчик события сокета ConnectionRequest, в котором или создается новый сокет для приема/передачи, или используется уже существующий для вызова метода Accept с параметром RequestID (это параметр события ConnectionRequest).

4.      После этого сокеты могут обмениваться информацией в обе стороны с применением метода SendData. При этом обработка прихода данных осуществляется в обработчике события DataArrival, в котором с помощью метода GetData можно собственно получить данные в некий буфер.

5.      Закрываем сокеты с помощью метода Close.

 

 


Доступ к базам данных из VB с помощью ADO.

 

1. Обзор ADO.

Очевидно, что доступ к данным является важнейшим требованием при разработке современных бизнес-приложений. Технология ODBC обеспечивает доступ к реляционным базам данных и это первый шаг на пути решения этой проблемы. Однако, когда разработчики хотят включить в свои проекты нереляционные источники данных или работать в средах, подобных Интернет, они сталкиваются с дилеммой - либо разрабатывать собственные парадигмы доступа к данным, либо работать на уровне API, что несовместимо с новыми средами. ActiveX объекты доступа к данным (ADO) решают эту дилемму и обеспечивают единую модель, которая работает со всеми источниками данных в различных средах. Таким образом ADO обеспечивает последовательный, высокопроизводительный доступ к данным, с которыми вы можете создавать клиентские программы для работы с БД или бизнес-объекты среднего уровня, использующие приложения, инструментарий, язык или, даже, Интернет-браузер. ADO - это единый интерфейс доступа к данным, который вам необходим для создания одно- и многоуровневых приложений архитектуры клиент/сервер и Web-ориентированных информационных систем.

 Технология ADO была впервые применена в Microsoft Internet Information Server как интерфейс доступа к БД. Использование ADO позволяет минимизировать сетевой трафик в ключевых Internet-сценариях и уменьшить количество промежуточных уровней между клиентским приложением и источником данных. ADO легко использовать, так как он применяет привычную систему вызовов - интерфейс Автоматизации OLE, доступный сегодня в большинстве средств разработки приложений. Из-за легкости применения и изучения популярность ADO будет расти и в итоге ADO вытеснит технологии RDO и DAO, которые в настоящее время применяются очень широко. Технология ADO во многом подобна RDO и DAO, например, она использует те же соглашения языка. ADO также поддерживает аналогичную семантику и поэтому может быть легко освоена разработчиками ПО.

ADO является интерфейсом программного уровня к OLE DB, новейшей и мощнейшей (сильно сказано) парадигме доступа к данным от MS. OLE DB обеспечивает высокопроизводительный доступ ко многим источникам данных. ADO и OLE DB вместе представляют собой основу стратегии Универсального доступа к данным (Universal Data Access). OLE DB дает возможность универсального доступа ко многим данным и представляет разработчикам возможность сделать это достаточно легко. Так как ADO находится на вершине OLE DB, то применение ADO имеет все преимущества Универсального доступа к данным, которое обеспечивает OLE DB.

 


2. Объект управления данными - ADO Data Control.

Для доступа к базам данных через ADO используется элемент управления Active X, называющийся ADO Data Control. Для того, чтобы подключить его к своему проекту, из списка доступных Active X необходимо выбрать строчку «Microsoft ADO Data Control 6.0 (SP4) (OLEDB)».

Рассмотрим основные свойства этого компонента:

  • BOFAction - поведение элемента управления при достижении начала таблицы (или запроса): имеет два значения - adDoMoveFirst (передвигает текущую запись на первую запись) или adStayBOF (ничего не делает).
  • CommandTimeout - timeout для всех операций с базой данных в секундах.
  • CommandType - тип передаваемой базе данных команды: adCmdUnknown (неизвестно - по умолчанию), adCmdText (SQL запрос), adCmdTable (передается просто имя таблицы), adCmdStoredProc (запускается хранимая процедура).
  • ConnectionString - т.н. «строка соединения» - строка специального вида, задающая параметры соединения, а также саму базу данных (обычно строится мастером - см. ниже).
  • ConnectionTimeout - timeout для соединения в секундах.
  • CursorType - тип создаваемого RecordSet'а: adOpenKeyset - динамический набор данных (т.е. изменения, вносимые другими пользователями сразу же отображаются в вашем наборе), но добавленные другими пользователями не появляются в вашем наборе, adOpenDynamic - полностью динамический набор, adOpenStatic - статический набор данных - «снимок» с базы данных (изменения, вносимые другими пользователями не отображаются).
  • EOFAction - действие по достижении конца набора записей: adDoMoveLast (перемещает на последнюю запись), adStayEOF (ничего не делает), adDoAddNew (переходит в режим добавления новых записей).
  • LockType - тип блокировки таблицы: adLockUnspecified (нет блокировки), adLockReadOnly (вы не можете редактировать данные), adLockPessimistic (блокировка записей сразу при начале редактирования), adLockOptimistic (блокировка записей только при вызове метода Update).
  • MaxRecords - максимальное количество записей.
  • Password - пароль для баз данных, требующих пароля.
  • RecordSource - собственно SQL запрос или имя таблицы.
  • UserName - имя пользователя для баз данных, требующих этого.

Для более удобной настройки этой компоненты предусмотрен мастер соединения, вызвать который можно дважды кликнув на свойство (Custom), с помощью которого можно легко создать Connection String, задать имя и пароль, а также SQL-запрос, имя таблицы или имя хранимой процедуры.

Рассмотрим также другие свойства, события и методы объекта ADO Data Control, доступные программно:

  • RecordSet (свойство) - указатель на объект типа ADODC.RecordSet, описывающий набор записей, с которым идет работа. С помощью этого свойства можно программно перемещаться по записям, изменять их, удалять, добавлять и т.д.
  • Refresh (метод) - обновляет набор записей, подключенный через ADO Data Control.
  • EndOfRecordset (событие) - возникает, когда пользователь пытается передвинуться на EOF или BOF.
  • Error (событие) - возникает, если операция с базой данных окончилась ошибкой.
  • WillChangeField (событие) - возникает ДО того, как какой-либо операцией будет изменено одно из значений полей набора записей.
  • FieldChangeComplete (событие) - возникает ПОСЛЕ того, как проведено успешное изменения значения какого-либо поля.
  • WillMove (событие) - возникает ДО того, как будет произведено перемещение по набору записей.
  • MoveComplete (событие) - возникает ПОСЛЕ успешного перемещения.

 


3. Связанные с данными элементы управления.

Для отображения данных используется элементы управления, связанные с элементом управления ADO Data Control.

Из стандартных элементов управления могут использоваться EditBox, CheckBox, PictureBox.

Рассмотрим как связать эти элементы управления с ADO Data Control.

Сначала необходимо задать свойство DataSource - из поля со списком выбрать имя вашего ADO Data Control'а.

Затем свойству DataField присвоить (выбрать из списка) имя поля, значение которого будет отображаться в данном элементе управления (и редактироваться в нем).

Помимо этих стандартных элементов управления можно использовать специализированные элементы управления DataList и DataCombo. Эти элементы управления позволяют реализовать удобное редактирование в двух связанных таблицах. Элементы также являются Active X control, так что для использования их необходимо подключить - «Microsoft Data List Controls 6.0 (SP3) (OLEDB)».

Естественно, что для работы этих компонент необходимо создать на форме два элемента управления ADO Data Control, т.к. содержимое списка будет браться из одной таблицы (или запроса), а выбранное значение записываться в поле текущей записи другой.

Рассмотрим специфичные свойства этих элементов управления:

  • DataSource и DataField как и для стандартных элементов управления задают куда будет записываться выбранное значение.
  • RowSource задает имя элемента управления ADO Data Control, из которого будут браться содержимое списка (или поля со списком).
  • ListField задает значениями какого поля будет заполнен список.
  • BoundColumn задает значение какого поля будет сохранено в DataField (например, код).
  • Locked - задает, возможно ли изменить значения поля или нет.

Методы, связанные с этими элементами управления:

  • ReFill (метод) - позволяет очистить список и заново затребовать его из базы данных.

Т.е. ничего особо сложного здесь нет.

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

  • использовать элемент управления DataRepeater,
  • использовать элемент управления Data Grid Control.

 

Использование DataRepeater.

Элемент управления DataRepeater является элементом управления Active X, так что для использования его необходимо подключить к проекту через меню Components - «Microsoft Data Repeater Control 6.0 (OLEDB)».

Этот элемент управления позволяет отображать несколько записей на форме сразу. Фактически он является контейнером для созданного вами Active X Control'а, в котором происходит отображение данных одной записи. DataRepeater же «размножит» ваш элемент управления и свяжет созданные экземпляры со всеми записями набора.

Для того чтобы использовать DataRepeater, необходимо выполнить следующую последовательность действий:

- создать свой элемент управления Active X для вывода значения полей одной записи

- добавить созданный элемент управления используя меню Components

- задать свойство DataRepeater'а RepeatedControlName, выбрав из поля со списком ваш элемент управления

- создать ADO Data Control, задать его свойства (подключить его)

- установить свойство DataRepeater'а DataSource на созданный ADO Data Control

- кликнуть правой кнопкой мыши по DataRepeater и выбрать в всплывающем меню пункт Properties

- перейти на закладку RepeaterBindings

- определить зависимость между свойствами вашего Active X и полями записи (т.е. у вашего Active X должны быть созданы свойства для хранения значений полей записи).

Главные недостатки:

- необходимость создания элемента управления Active X,

- невозможность использования DataList и DataCombo внутри этого элемента.

 


4. Использование Data Grid Control.

Другой способ позволить пользователю увидеть несколько записей сразу (и редактировать их) - использование элемента Data Grid. Элемент управления представляет собой таблицу (такую, как, например,  в Excel), в которой каждая строчка соответствует одной записи, каждый столбец - одному полю. Пользователь может напрямую редактировать данные в таблице, редактируя ту или иную ячейку таблицы. Для использования этого элемента управления его необходимо подключить - «Microsoft DataGrid Control 6.0 (SP4) (OLEDB)».

У данного элемента управления много свойств, однако многие из них доступны через форму для настройки DataGrid.

Рассмотрим последовательность работы с DataGrid:

- создаем ADO Data Control, подключаем его к базе данных

- размещаем DataGrid на форме

- выбираем через свойство DataSource наш ADO Data Control

- через нажатие правой кнопки мыши на DataGrid'е попадаем во всплывающее меню, из которого выбираем пункт Retrieve Fields

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

- для того, чтобы настроить заголовки полей и другие параметры, из всплывающего по правой кнопке мыши меню выбираем пункт Properties

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

- выбрав все в том же всплывающем меню пункт Edit, можно вручную отредактировать ширину столбцов, либо удалить или добавить столбцы.

 


5. Доступ к базам данных через объекты ADODB.

Объектная модель ADO определяет набор (коллекцию) программируемых объектов, которые могут использоваться с Visual Basic, Visual C++, VBScripting, Java на любой платформе, которая поддерживает COM и Автоматизацию OLE. Объектная модель ADO разработана для выполнения большинства особенностей OLE DB.

ADO содержит семь объектов:

  • Connection
  • Command
  • Parameter
  • Recordset
  • Field
  • Property
  • Error

и четыре набора объектов (коллекции):

  • Fields
  • Properties
  • Parameters
  • Errors

Объекты Connection, Recordset и Command являются ключевыми объектами в объектной модели ADO. ADO приложение может использовать объект Connection для установки соединения с сервером БД, объект Command - для выдаче команды к БД, таких как запросы, обновления и т.п. и объект Recordset - для просмотра и манипулирования данными. Командный язык, используемый с объектом Command, зависит от провайдера для БД. В случае реляционных баз данных в качестве командного языка выступает SQL.

К набору объектов Errors и объекту Error можно получить доступ через объект Connection после того как случилась ошибка провайдера. К набору объектов Fields и объекту Field можно получить доступ через объект Recordset после того как в объекте Recordset появятся какие-либо данные. Информация о метаданных объекта Recordset может быть просмотрена через набор объектов Fields и объект Field.

 

Объект Connection.

Объект Connection позволяет установливать сеансы связи с источниками данных. Объект Connection обеспечивает механизм для инициализации и установления соединения, выполнения запросов и использования транкзаций.

Метод Open объекта Connection используется для установки соединения. Перед соединением приложение может установить строку соединения, тайм-аут соединения, БД по умолчанию и атрибуты соединения. Объект Connection так же позволяет установить свойство CommandTimeout для всех командных объектов, связвнных с данным соединением. Параметром метода Open является строка соединения. Для того, чтобы проще ее написать, создайте на форме временный элемент ADO Data Control и создайте с помощью мастера строку соединения. Потом просто скопируйте ее и используйте в методе Open, а временный объект удалите.

Запросы могу выполняться с использованием метода Execute.

После работы с БД необходимо закрыть соединение методом Close и обнулить переменную типа ADODB.Connection.

Пример:

Dim Conn1 as ADODB.Connection

Conn1 =  New ADODB.Connection

Conn1.ConnectionTimeout = 100

Conn1.Open "Driver={SQL Server};Server=Server1;Uid=sa;Pwd=;Database=pubs"

Conn1.Execute "DELETE * FROM Table1"

Conn1.Close

Conn1 = Nothing

 

Объект Command.

Объект Command позволяет передавать команды к БД. Эти команды могут готовить строки запросов и связянные с запросами параметры, но не ограничиваются только запросами.

Объект Command может как открывать новое соединение, так и использовать уже существующее соединение для выполнения запросов, в зависимости от установки свойства ActiveConnection. Если свойство ActiveConnection установлено с ссылкой на объект Connection, то объект Command будет использовать существующее соединение из объекта Connection. Если свойство ActiveConnection определяется строкой соединения, то для объекта Command будет установлено новое соединение. Для одного объекта Connection могут использоваться несколько объектов Command.

Выполнение запросов может генерировать набор записей, множественные наборы записей или не генерировать никаких записей. Например, выполнение запросов языка описания данных (data definition language - DDL) не генерирует наборов записей. Выполнение оператора SELECT может генерировать набор записей и выполнение пакета SELECT операторов или хранимой процедуры генерирует более чем один набор записей.

Строка запроса определяется свойством CommandText. Строка запроса может быть определена на стандартном языке манипулирования данными (data manipulation language - DML) с использованием SELECT, INSERT, DELETE, или UPDATE операторов или на языке описания данных, например CREATE или DROP. В строке запроса может также быть имя хранимой процедуры или таблицы.

Тип строки запроса определяется свойством CommandType. Значения свойства CommandType могут быть следующими: adCmdText, adCmdTable, adCmdStoreProc и adCmdUnknown. Когда строкой запроса является SQL оператор, свойство CommandType должно определяться как adCmdText. Значения adCmdStoreProc или adCmdTable применяются, если строка запроса определяется как хранимая процудура или имя таблицы.

В следующем примере показано выполнение оператора SELECT, которое возвращает объект Recordset:

Dim Comm1 as ADODB.Command

Dim Rsc1 as ADODB.RecordSet

Comm1 =  New ADODB.Command

Comm1.ActiveConnection="Driver={SQL Server};Server=Server1;Uid=sa;Pwd=; " & _

"Database=pubs"

Comm1.CommandText= "SELECT * FROM Table1"

Comm1.CommandTimeout=15

Comm1.CommandType = adCmdText

Set Rsc1 = Comm1.Execute()

‘работа с Rsc1

...

Rsc1.Close

Comm1.Close

Comm1 = Nothing

Rsc1 = Nothing

Объект RecordSet.

Объект Recordset обеспечивает методы для манипулирования наборами данных. Объект Recordset позволяет добавлять, удалять, обновлять записи и перемещаться по записям внаборе данных. С помощью набора объектов Fields и объекта Field можно получить доступ к любой конкретной записи. Обновление объекта Recordset может быть сделано немедленно или в пакетном режиме. При создании объекта Recordset автоматически открывается курсор.

Объект Recordset позволяет определить тип курсора иего расположение для выбора результирующего набора данных. Используя свойство CursorType можно определить тип курсора: forward-only, static, keyset-driven, или dynamic. Тип курсора определяет поведение объекта Recordset при прокрутке записей вперед/назад или при обновлении записей. Тип курсора также влияет на видимость измененных записей.

По умолчанию тип курсора устанавливается в forward-only только для чтения. Если необходимо только читать данные в однонаправленном режиме (forward), то изменять тип курсора не следует. С другой стороны, можно определить тип курсора в зависимости от решаемой задачи.

Набор объектов Fields и объект  Field

Набор объектов Fields и объект Field позволяют получить доступ к данным любой колонки в текущей записи. К набору объектов Fields можно получить доступ через объект Recordset. К объекту Field можно получить доступ через набор объектов Fields используя индекс. Объект Field можно использовать для составления новой записи или для изменения уже существующих данных и затем использовать методы AddNew, Update или UpdateBatch объекта Recordset для вставки новых или изменения существующих данных.

Пример:

Dim Comm1 as ADODB.Command

Dim Rsc1 as ADODB.RecordSet

Dim Fld1 as ADODB.Field

Comm1 =  New ADODB.Command

Comm1.ActiveConnection="Driver={SQL Server};Server=Server1;Uid=sa;Pwd=; " & _

"Database=pubs"

Comm1.CommandText= "SELECT * FROM Table1"

Comm1.CommandTimeout=15

Comm1.CommandType = adCmdText

Set Rsc1 = Comm1.Execute()

‘работа с Rsc1

For Each Fld1 In Rsc1.Fields

            Debug.Print Fld1.Name

            Debug.Print Fld1.Type

            Debug.Print Fld1.Value

Next

Rsc1.Close

Comm1.Close

Comm1 = Nothing

Rsc1 = Nothing

Fld1=Nothing

Движение по RecordSet'у осуществляется с помощью следующих методов этого объекта:

  • BOF (возвращает True или False)
  • EOF (аналогично, только конец таблицы)
  • MoveNext
  • MoveFirst
  • MovePrevious
  • MoveLast
  • Move(number)

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

Dim Comm1 as ADODB.Command

Dim Rsc1 as ADODB.RecordSet

Comm1 =  New ADODB.Command

Comm1.ActiveConnection="Driver={SQL Server};Server=Server1;Uid=sa;Pwd=; " & _

"Database=pubs"

Comm1.CommandText= "SELECT * FROM Table1"

Comm1.CommandTimeout=15

Comm1.CommandType = adCmdText

Set Rsc1 = Comm1.Execute()

‘работа с Rsc1

Rsc1.MoveFirst

Do While Not (Rsc1.EOF)

            ... ‘какие-то действия с текущей записью

            Rsc1.MoveNext

Loop

Rsc1.Close

Comm1.Close

Comm1 = Nothing

Rsc1 = Nothing

 

 


Практическое занятие: Работа с библиотекой ADOX.

1. Введение в ADOX.

ADOX представляет собой расширение библиотеки ADO, позволяющее с помощью работы с объектами создавать, удалять и изменять структуру баз данных, а также управлять настройками безопасности (пользователями и т.д.). Хотя в современных базах данных создание структуры поддерживается на уровне SQL, и создавать структуру можно  с помощью запросов SQL. Однако для разных СУБД запросы могут несколько отличатся, также как и настройка безопасности, поэтому Microsoft решила сделать уровень создания структуры баз данных и настройки параметров безопасности прозрачным для программиста, создав единую библиотеку ADOX, предоставляющую единый интерфейс к различным СУБД.

Для более подробного изучения обратимся к статье Иноземцева Руслана «Программное создание базы данных с помощью ADOX», расположенной на сетевом диске по адресу P:\PREP\System_Program\VB\Sample\DataBase\CreateDB\ADOX.htm. В каталоге на уровень выше представлены примеры использования ADO и ADOX.

 

2. Самостоятельная работа.

Необходимо разработать приложение, использующее ADOX.

Приложение по команде пользователя (например, через меню) создает базу данных MS Access определенного формата (должна быть хотя бы одна связь «1-ко-многим») с помощью объектов ADOX, а затем предоставляет возможность просматривать и редактировать таблицы базы в виде «карточек» (т.е. просмотр только 1 записи одновременно). Причем в «карточке» должен присутствовать элемент DataCombo или DataList, реализующий связь «1-ко-многим» с другой таблицей.

Также в приложении должна присутствовать форма с DataGrid, позволяющая редактировать данные и форма с DataRepeater'ом, реализующая «ленточную» форму. По окончании работы программа удаляет из базы все таблицы.