Курс лекций по V B 5.0

Программирование в среде VB 5.0

      В приложениях VB 5.0  исполняемые  строки  должны  размещаться  внутри
процедур либо функций. Операторы в VB  редко  используют  номера  строк,  а
любые из них обычно начинаются с новой строки. Строки ограничены  длиной  в
1023 символа. можно расширять строки, используя символ “_” после пробела  в
конце строки.  Несколько  операторов  можно   объединять  в  одной  строке,
разделяя их “ : ”.

      Комментарии  задаются  верхней  кавычкой  (‘),  либо  оператором  REM.
Комментарий может быть выведен отдельной строкой, либо в конце  строки.  Во
втором случае лучше использовать кавычку (‘),  чем  REM,  т.к.  REM   здесь
требует разделителя (:). Например,
      DIM FARENG ‘ переменная для вычисления t0 по Фаренгейту
или
      DIM FARENG :  REM переменная для вычисления t0 по Фаренгейту

      Оператор  End  -  программа  останавливается.  После   оператора   End
закрываются все окна, открытые программой, а сама она стирается из  памяти.
Внутри приложения VB может быть сколько угодно операторов  End,  но  обычно
лучше использовать только один оператор End в процедуре  обработки  событий
QueryUnload для основной формы. В этом случае все операторы End  заменяются
на Unload  Me, который вызывает себе QueryUnload для формы.
      Одним из основных операторов является присваивание значения переменным
и установка значений свойств.
      Например,
      1) Result = 0.5 ( 20
                     имя          значение
                переменной

      Можно использовать оператор LET
      2) объект.свойство = значение
        txtDisplay.Text = “ “

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

      Например, txtDisplay=“Привет!”

      Некоторые свойства могут принимать значения TRUE  или   FALSE.  В  VB5
имеются встроенные константы  для  обозначения  данных  свойств,  например,
cmdExit=False будет скрывать командную  кнопку, пока не появится  выражение
cmdExit=True.
      Внутри себя VB использует значение 0 для False и   -1  для  True  (или
любое ненулевое значение).
      Можно использовать  следующее  выражение  для  изменения  свойства  на
противоположное
      cmdExit.Visible = Not (cmdExit.Visible).

      Переменные. Имена переменных менее 255 символов начинаются с буквы, за
которой следуют другие буквы, цифры или символ  “_”.  Регистр  значения  не
имеет. В качестве имен  переменных  нельзя  использовать  зарезервированные
слова, например, Print. Принято использовать смешанный регистр при  задании
имен переменных, состоящих из нескольких слов, например, CurrentValue.

      Типы переменных. Используется 14 стандартных типов  переменных.  Можно
определить и собственный тип. Основные типы:
      String -  строковые  переменные.  Для  обозначения  этого  типа  можно
добавить символ “$” к концу имени.
      Например, Message $ = txtDisplay.Text

      Integer - целочисленная переменная в  диапазоне  -32768  (+32767.  Для
обозначения  в  конце  имени  добавляется   “%”   арифметический   оператор
выполняется быстро.
      Например, IntVar% =5

      LongInteger  -  длинное  целое  от   -2147483648    до    +2147483647.
Обозначается “&”.
      LongInt&= 123456789.

      SinglePrecision хранит дробные числа с точностью до  7  цифр.  Для  на
чисел может достигать 38 знаков с обозначением “!”.  Вычисления  ч  данными
переменными будет приблизительным.

      DoublePrecision “#”. Числа с точностью до 16  цифр  и  длиной  до  300
символов.   Вычисления   тоже   приблизительны,   а   скорость   небольшая.
Используется для научных расчетов.

      Currency - используется при преобразовании десятичных чисел в двоичную
форму и наоборот. Обозначение - “@”. Может иметь до 14 цифр до запятой и до
4 цифр - после. Используется для финансовых расчетов.

      Date - значения даты и времени от 00 час.1 января.100 года до 00час.31
декабря.9999 г. Значение обозначается “#”.
      Time = # May 5, 1999 #
      Byte - для хранения целых чисел от  0  до  255.  Экономит  оперативную
память и размеры  массивов.  Используется  также  при  работе  с  двоичными
файлами.

      Variant - данные любого типа. Если VB не знает тип принимаемых данных,
используется этот тип. Использование его замедляет  работу  программ,  т.к.
требует времени и ресурсы для операций преобразования типов.
      В отличие от других версий Basic в одной программе нельзя использовать
одни и те же имена переменных, отличающихся только типом. Например, A% и А!
      При первом использовании переменной VB временно присваивает переменной
тип Variant и пустое значение. Это значение исчезает в  тот  момент,  когда
переменной присваивается реальное. Любой тип  данных  имеет  свое  “пустое”
значение. Для String это строка нулевой длины “ “. Для численных переменных
это 0.
      Можно не использовать идентификаторы для обозначения типа  переменной,
а использовать оператор Dim. Оператор  Dim  служит  для  объявления   типов
переменных.
      Dim Years As Integer
      Dim Amount As Currency
      . . . .
      Объявления можно комбинировать в одной строке.
      Dim Years As Integer,  Amount As Currency
      Dim Result  без типа присваивает переменной тип Variant.

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

      Область видимости переменных
      В программах VB5 все переменные изолированы внутри процедур.  То  есть
переменная Result в одной процедуре не влияет на значение переменной с  тем
же именем в другой процедуре. То есть  переменные  являются  локальными  по
отношению к процедурам,  если не указано иначе.
      Иногда  необходимо,  чтобы  какая-то  переменная  была  доступна  всем
процедурам формы. Такие переменные называют переменными  уровня  формы  или
модуля. Переменные уровня формы  также  объявляются  в  разделе  General  с
помощью операторов Private или Dim.
      В больших проектах, в которых процедуры и формы хранятся  в  отдельных
модулях, а не подключаются к форме, можно объявить  глобальную  переменную,
доступную в любой части проекта.
      Это делается в разделе Declarations любого модуля кода:
      Public Amount As Single
      или Global Amount As Single
      Когда  VB  вызывает  процедуру  обработки  события,  старые   значения
локальных переменных уничтожаются. Они  принимают  значения  по  умолчанию.
Такие  переменные  называются  динамическими.  Но   в   некоторых   случаях
необходимы статические переменные, которые не инициализируются повторно при
вызове процедуры. Часто такие переменные  используются  для  счетчиков,  их
используют, чтобы сделать  элементы  управления  видимыми  или  невидимыми.
Чтобы объявить статическую переменную внутри процедуры  необходим  оператор
Dim заменить на Static.
      Static Amount As Single, Is_Visible As  Boolean.
      Если необходимо, чтобы все переменные в процедуре  были  статическими,
необходимо добавить
      Static Private Sub cmdLom_Click()

      Строки
      Операция конкатенации для сложения нескольких строк + или &

      Например, A$ = “Иванов”
                 B$ = “Иван”
                 C$ = “Иванович”
      D$ = A$ & B$ & C$
      или D$ = A$ + B$ + C$

      Отличие. С помощью “&”  можно  объединять  строковые  и  другие  типы.
Например, C = A% & B$, изменится их тип на Variant.
      Для перехода к новой строке  при  печати  символов  (перевод  каретки)
используется встроенная const VbCrLf. Например, чтобы  разорвать  строку  в
информационной панели или в многостроковом текстовом поле можно
      Message $ = “1-я строка”
      Message $ = Message $+VbCrLf + “2-я строка”
      MsgBox Message $

      Замечание. Если в программе используются числа и они не  присваиваются
переменной Variant, то VB полагает:
     1)  Если число не имеет  десятичной  точки  и  лежит   в  диапазоне  от
        -327686  +32767, то это Integer.
     2)  Если не имеет десятичной  точки  и  лежит   в  диапазоне  для  Long
        Integer, то это Long Int.
     3)  Если имеет десятичную точку и лежит в диапазоне для чисел с обычной
        точностью (7 цифр), то это Single precision.
     4)  Если имеет десятичную точку, но лежит вне диапазона, то это  Double
        precision.
      Такие приблизительные расчеты часто приводят к проблемам. Например, VB
полагает, что тип результата с двумя целыми числами  есть  целое.  Например
результат Print 123456 (789 выходит за  рамки  целого  и  возникает  ошибка
переполнения. Тогда необходимо использовать идентификатор хотя бы для одной
переменной Print 123456& (789.
      Можно также использовать встроенные функции для преобразования  типов,
например, LInt - округляет число до целого, Clong  -  до  длинного  целого,
Cvar - преобразует к Var.
      Если производятся операции с  переменными  Variant,  то  не  возникает
проблем с преобразованием типов.
      Помимо  обычных,  десятичных  чисел,   VB    использует   двоичные   и
шестнадцатеричные. Последние обозначаются с префиксом &H.  Например,  число
49 = &H31.
      Шестнадцатиричные цифры используются для кодирования различных цветов:
любой цветовой код состоит из 6 шестнадцатиричных цифр от &H000000& = 0  до
 &HFFFFFF& (длинное целое) (16777215).
      Вообще конкретный цвет определяется количеством красного R, зеленого G
и синего цветов  B   во  всевозможных  сочетаниях.  В  коде  цвета  VB  две
последние цифры означают количество  красного,  две  средние  -  количество
зеленого, а две первые - количество синего, например
      &H0000FF& - максимально красный
      &H00FF00& - максимально зеленый
      &HFF0000& - максимально синий
      &H000000& - черный
      &HFFFFFF& - белый
      &H00FFFF& - желтый (красный + зеленый)
      &H808080& - серый (равные количества цветов)

      Константы
      Для неизменных значений в программе используются константы.  Константы
объявляются аналогично переменным, по тем  же  правилам:  имя  содержит  не
более 200 символов, первый символ  буква.  Если  в  программе  используется
только одна форма, то константу можно объявить  в  разделе  DeclarationHous
для объекта General. Или же можно и непосредственно  в  процедуре,  но  это
хуже. Константу объявляют через зарезервированные слова Const. Например,
      Const Pi = 3?14159
      Const Course = “Informatics”
      VB5 имеет только  набор  встроенных  констант,  например,  VbCrLf  или
VbOrOnly. Их можно вставлять в текст программы из окна Object  Browser  (F2
или меню View). Чтобы вставить Const в программе:
  Курсор должен быть в окне кода.
 В окне Object Browser щелкнуть на кнопке Copy to Clipboard.
 Перейти в программе на место вставки и нажать Ctrl+V.

      Встроенные функции
      Особое значение имеют строковые функции, т.к. в полях ввода информация
хранится в  текстовом  формате  или  в  формате  ariant.  Использование  же
неявных преобразований типов  из  Variant  часто  приводит  к  проблемам  и
является более медленным.
      Строковые функции:
      = Space (число пробелов) - выдает строку, состоящую из одних пробелов,
причем число символов в строке определяется параметром в скобках.
      = String (число, строковое выражение $) - формирует строку, содержащую
одинаковые символы.
      Например, X$=String (10, “z”)  - 10z
      = Len (строковое выражение) - длина  текущей  строки  с  проблемами  и
напечатанными символами.
      = Mid (строка, начало [, длина])
      Mid (“Visual Basic”, 1,6) = “Visual”
      Mid (“Visual Basic”, 8,6) = “Basic”
      Mid (“Visual Basic”, 8) = “Basic”
      Пример. Подсчет числа точек в строке
      Points % = 0
      Length % = Len (Text $)
      For I% = 1 to Length %
          If Mid (Text $, I%, 1) = “.” then
            Points $ = Points $ + 1
          End If
      Next I%
      = Left (cтрока, № до позиции)
      = Right (строка, с № позиции)
       Функцию  Mid  можно  использовать  для  изменения  содержания  внутри
текущей строки. Например
      X $ = “Best Basic”
      Mid (X $,1,5) = “Quick”
                                    какое количество символов
с какого символа                будет взято из новой строки
вставляется новая
строка поверх части старой

      = Insert ([начальная позиция], строка для поиска, подстрока)
      является ли данная строка частью  другой строки, выдает номер позиции,
с которой начинается подстрока.
      Text $ = “QuickBasic”
      X $ = Instr (1, Text $, “Basic”)=6.
      Если подстрока не найдена Instr возвращает нулевое значение (False).
      Пример.
      If  Instr (Text $, “(”) then
         Print “символ найден”
      Else
          Print “Не найден”
      End If

      = LСase, = UСase - преобразует все символы строки в  нижний  (верхний)
регистр
      Вместо Lcase $   Ucase$
      = Str lomp  - для сравнения строк
      Пусть X = StrComp (A$, B$) =  [pic]
      Если A$ или  B$  пуста,  то х=NULL
      Если использовать StrComp (A$,B$,1) - регистр не учитывается,  а  если
StrComp (A$,B$,0) -  регистр учитывается.
      =  Trim (строка $) - уничтожает пробелы  начале и конце строки
        LTrim (строка $) - уничтожает пробелы  в левой части строки
        RTrim(строка $) - уничтожает пробелы в правой части
      Все строковые функции, за  исключением  Mid,  не  изменяют  строку,  а
создают ее копию и потом с ней работают.

      Управляющие структуры в программе
      Определенные циклы
      For  ___  Next
      For I% = 1 to 10 (% - целочисленный тип для ускорения работы цикла)
          Print I%
      Next I%
      Цикл завершается, не в тот момент, когда  значение счетчика  равняется
конечному, а когда оно превышает его.

      Пример. Печать всеми доступными шрифтами экрана.
      Private Sub Form_Click()
        Dim I As Integer
        For I=0 to Screen.FontCount - 1
            FontName = Screen.Fonts (I)
            Print “Это шрифт”; Screen.Fonts (I)
        Next I
      End Sub


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

      Do
         Выражение
      Loop Until  выполняется условие
      Пример. Проверка пароля
      Private Sub Form_Load ()
        Do
           X$ = InputBox$ (“Пароль ?”)
        Loop Until X$ = “VB”
      End Sub

      Для остановки бесконечного процесса  используют  клавиши  “Break”  или
Run|End или закрыть приложение. В  программе  можно  использовать  оператор
Exit Do (или Exit For), которые переводят программу к оператору  следующему
после цикла.

      Сложные неопределенные циклы
      В неопределенных циклах проверка происходит в конце цикла  и  счетчика
увеличивается еще на 1. Иногда это  вызывает  лишнее  обновление  счетчика.
Можно передвинуть проверку условия на начало цикла:
           Do Until  условие
              Тело цикла Выражение
           Loop

           Do While
           Do
           Loop Until аналогичен
           Do
           Loop While условие
           Пример.
           Do                                  Do
           Loop Until N>5    (    Loop While N <=5
           Do While
           Do
      Выражение
           Loop While условие
           или
           Do While условие
      Выражение
           Loop


      В таких  циклах можно объединять несколько условий, например
           Do While X<=0 and txtDisplay.Text=“ “
           (
           (
           Loop

      Цикл While /Wend
           While условие
           . . . . .
           Wend
      Например, While  x>0
                 S = S+x
                 Wend
      Может  быть  несколько  вложенных  циклов.   Любой  Wend  относится  к
ближайшему While. Do __ Loop дает структуру и гибкость цикла.


      Условные операторы
      If  условие  Then  оператор

      Например, If  N>=0 and N<=9 Then Print “Ok”

      Если в выражении If __ Then обрабатывается несколько операторов, тогда
используется так называемый блок If __ Then.

      While Wend
      Вместо Do While  x=0
             Loop
             While x=0
             Wend

|If условное выражение Then     (Enter)     |If  выражение Then             |
|несколько операторов                       |оператор                       |
|Else                                       |Else If выражение Then         |
|необяза-                                   |оператор                       |
|несколько операторов     тельно            |.                              |
|End If                                     |.                              |
|                                           |.                              |
|                                           |Else                           |
|                                           |оператор                       |
|                                           |End If                         |



      Оператор Select Case

      Позволяет обрабатывать несколько вариантов выбора.

      Select Case переменная или выражение
            Case оператор проверки условия
                 действие 1
                 .
                 .
                 .
           Case . . . . . .
                 действие n-1
           End Select

Пример:
            Select Case Ball
                 Case Is < 13 позволяет проверить значение переменной
                       Grade = 2
                 Case Is < 18
                       Grade = 3
                 Case Is < 22
                       Grade = 4
                 Case Else
                       Grade = 5
            End Select

Пример 1.    If  Then  Else

Private Sub Form_QueryUnload(Cansel As Integer, UnloadMode As Integer)
      X % = MgBox(«Вы уверены?», VbYesNo)
            If X % = VbNo Then
                 Cancel = True
            Else
                 Cancel = False
            End IF
End Sub

Пример 2.

            If optColor1.Value Then
                 Color$ = «Красный»
            Else If optColor2.Value Then
                 Color$ = «Зеленый»
            Else If optColor3.Value Then
                 Color$ = «Синий»
            Else
                 Color$ = «Белый»
            End If


Пример:
            Select Case Den
                 Case 1
                       Print «Пн»
                 Case 2
                       Print «Вт»
                 .
                 .
                 .
                 Case 7
                       Print «Вс»
            End Select

      В фразе Case можно задавать значения переменной в виде диапазона

            Select Case Den
                 Case 1 to 5
                       Print «Рабочий день»
                 Case Else
                       Print «Выходной»
                 End Select

либо перечислением возможных значений
            Select Case Den
                 Case 6, 7
                       Print «Выходной»
                 Case Else
                       Print «Рабочий день»
                 End Select


      Массивы

      2 вида массивы: управляющие и массивы переменных (обычные массивы  или
списки).
      Управляющие  массивы  состоят  из  нескольких   однотипных   элементов
управления, использующих общие свойства, по отличающимся порядковым номерам
или индексам. Может быть не более 255 элементов в таком массиве.  При  этом
новые элементы на форме помещаются на место исходных элементов управляющего
массива. Поэтому при размещении  на  форме  их  следует  позиционировать  и
двигать, чтобы они не перекрывали друг друга. Например,  можно  создать  на
форме матрицу надписей или текстовых полей.

      Одномерные  массивы  или  списки  определяются  именем  и   положением
элемента в списке. Например данные о выпуске продукции за 12 месяцев.
      Могут быть фиксированные и динамические списки. Размеры их могут  быть
велики и определяются объемом свободной памяти.
      У фиксированных списков размер  не  меняется,  а  динамические  списки
могут менять свой размер. Для фиксированных  списков  память  выделяется  в
начале работы программы и существует меньший риск переполнения памяти.
      Динамические списки более гибки в работе.
      Списки могут быть видимыми всему приложению, данной форме (модулю) или
только одной процедуре.

      Создание фиксированного списка:
      а) в форме (модуле). Описание помещается в  разделе  деклараций  формы
(модуля)
            Dim Massiv$(20)
доступен любой процедуре модуля или формы;

      б) в пределах всего проекта (глобальный)
            Public Massiv(20) As String  -  21 элемент от 0 до 20
      или    Global

       в)  локальный  массив,  который  сохраняется  до  следующего  вызова
процедуры
            Private Sub ...........
                 Static Massiv A(20)


      Создание динамических массивов.
      а) в форме
      В размере декларации формы Dim DYNMAS() As String
А внутри процедуры выделяем нужный размер
            Private Sub ...........
                 Dim N %
                 ReDim  DYNMAS(N) As String

      При работе команды ReDim информация в массиве теряется.
      Для сохранения информации при изменении размера массива
                 ReDim  Preserve  DYNMAS(N+1) As String
                                                      или      (N-1)  удалит
                                                   последний элемент

      б) Глобальный динамический список, видимого в пределах всего проекта
                 Public  DYNMAS() As String
            или    Global

      Далее можно использовать ReDIM  в  любой процедуре всего проекта.

      Ввести данные в массив можно с помощью INPUT BOX, текстового поля.

      Для изменения нумерации в массиве не с 0, а с 1 - оператор Option Base
1 в разделе деклараций формы (модуля).
      Можно задавать массив диапазоном  значений
      вместо      Dim A(19)
                  Dim A (1980 TO 2000)

      Освобождение  ОП  от   динамический   массивов   Erase   DYNMAS/   Для
фиксированных списков Erase только очищает массив.


       Окна ввода

       Окна ввода- это другая возможность, помимо текстовых полей, для ввода
информации. Функция InputBox$ выводит на экран модальную диалоговую панель,
которая в отличие от текстовых полей имеет  фиксированный  размер  окна.  У
окна ввода есто строка заголовка и 4 элемента: подсказка, командные  кнопки
OK  и  Cancel  и  поле  ввода.  Синтаксис  функции:               Строковая
переменная=
InputBox(“подсказка”[,заголовок][поумолчанию][,X][,Y][,файл        справки,
контекст])

       где  подсказка-  текстовая  строка  или  строковая  переменная  (1024
символа),
       заголовок -содержание строки заголовка окна,
       по умолчанию - начальное содержимое окна ввода,
       X,Y- расстояние между левым (верхним) краями  экрана  и  окна  ввода.
Если параметры не заданы, то окно располагается по  центру  на  1/3  высоты
экрана.
       Например, MyInput$=InputBox(“Введи число”, “Запрос”,”0”,100,200)



Вывод информации

       Для вывода информации непосредственно  на  форме  используется  метод
Print. Его синтаксис:
       Имя формы.Print выражение
       Например:           frmHello.Print “Привет !”
       VB5 выводит информацию, начиная  с  того  места,  которое  определяют
свойства CurrentX и CurrentY- горизонтальная и  вертикальная  позиции.  При
использовании  метода  Cls  для  очистки  содержимого  формы   CurrentX   и
CurrentY=0 и метод Print выводит  информацию,  начиная  с  левого  верхнего
угла.
       Вывод  информации   можно   осуществлять   различными   шрифтами,   в
зависимости от используемого оборудования и программного обеспечения.  Если
операционная система  не  находит  данный  шрифт,  она  выбирает  ближайший
аналог.  Для  выбора  шрифта  в  программном  коде  используется  следующий
оператор присваивания:
       ИмяОбъекта-контейнера.Font.свойство=значение
       ?Например, frmHello.Font.Name=“Arial”
        frmHello.Font.Size =20
       frmHello.Font.Bold=True и т.д.
       В качнстве объекта- контейнера могут быть  командная  кнопка,  форма,
надпись, поле ввода. Но только формы  и  графические  окна  могут  работать
одновременно с  несколькими  шрифтами.  В  остальных  элементах  управления
изменение шрифта влияет на весь текст.
       Печать табличных данных

       В VB5 печать текста можно осуществлять в заданном формате. Зона имеет
размер  в  14  символов.  В   основном   зоны   используются   при   печати
непропорциональными шрифтами типа Courier, т.к. каждая  колонка  по  ширине
равна среднему значению ширины  символа.  Если  параметры  в  методе  Print
разделены запятыми, то данные выводятся в нескольких зонах. Например:
       Me.Print Family$,Name$
       После обработки выражения  методом  Print,  производится  переход  на
новую строку. Если используется  Print  без  параметров,  выводится  пустая
строка.  Если  не  нужно  переходить  на  новую  строку,  в  конце   строки
вставляется символ”;”. Для печати с  заданной  колонки  можно  использовать
функцию Tab, Например:
       Print Tab (номер колонки %);
       Для вставки указанного числа пробелов,  начиная  с  текущей  позиции,
используется функция Spc (число пробелов %)
       Функция Format
       Для вывода числовых данных в нужном формате используется функция
        Format( числовое выражение, строка формата $)
       Результатом данной  функции  является  строка,  в  которой  выражение
представлено по заданному формату. Например:
       Me.Print Format(123.456789,”###.###”)
       дают результат  123,46.  Незначащие  нули  в  начале  и  конце  числа
игнорируются. Для вывода незначащих  нулей  используется  формат  “000.00”.
Если необходимо вывести символы “-  “,  “+”,  “$”,”(“,”)”  или  пробел,  их
размещают непосредственно в формате. Например:
       Me.Print Format(Amount,”$###.###”)


       Именованные форматы
       Именованные форматы являются встроенными форматами  VB5  и  облегчают
работу по форматированию выводимого текста.
|Именованный формат                   |Описание                             |
|General Number                       |Строка цифр без разделителя для тысяч|
|Currency                             |Выводит 2 цифры справа от дес. точки |
|                                     |и учитывает разделителя для тысяч    |
|Fixed                                |По крайней мере одна цифра слева и   |
|                                     |две справа от десятичной точки       |
|Standard                             |То же и разделитель тысяч            |
|Percent                              |Число в виде процента. Выводит две   |
|                                     |цифры справа от дес.точки            |
|Scientific                           |Научная форма                        |
|Yes/No                               |Если число равно 0, то выводит No,   |
|                                     |иначе Yes                            |
|True/False                           |Если число равно1, то выводит True,  |
|                                     |иначе False                          |
|On/Off                               |Если число равно1, то выводит On ,   |
|                                     |иначе Off                            |
|General Date                         |Выводит дату и/или время. Если       |
|                                     |отсутствует дробная часть, выводится |
|                                     |только дата, если целая часть, то-   |
|                                     |время.Например 23.12.98 10:30:45     |
|Long Date                            |Полный формат Windows для вывода даты|
|                                     |                                     |
|                                     |Wedn 23 Dec 1998                     |
|Medium Date                          |Обычный формат Windows для вывода    |
|                                     |даты 23- Dec-98                      |
|Short Date                           |Сокращенный формат Windows для вывода|
|                                     |даты 23.12.98                        |
|Long Time                            |Время в час, мин, сек                |
|Medium Time                          |Время в12-часовом формате: час, мин и|
|                                     |AM/PM                                |
|Short Time                           |Время в час, мин в 24-часовом формате|


       Например,
       Me.Print Format(Amount, “Currency”)
       Me.Print Format(Amount, “###,###.##”)
       Me.Print Format(Now, “General Date”)

       Объект Printer

       Vb5 позволяет легко устанавливать свойства принтера, используемого  в
системе.
       Команда PrintForm выводит на принтер графический образ окна формы. Ее
синтаксис: ИмяФормы.PrintForm
       Команда осуществляет побитовый перенос формы с заголовком и рамкой  с
экрана на форму и не обладает достаточной гибкостью.
       Обычный способ вывода информации на принтер состоит  в  использовании
метода  Print,  связанного  с  объектом  Printer.  Метод   Print   учитывает
ориентацию страницы и может использовать свойства CurrentX и   CurrentY  для
точного позиционирования текста и точек на странице. Его синтаксис:
       Printer. Print текст
       При этом сохраняются возможности метода Print :  “;”  “,”  Tab,  Spc,
а также возможность управления свойствами шрифта:
       Printer. Font.Name = “Aryal”
       Printer. Font.Size = 18
       А изменение шрифта принтера не влияет на предыдущий текст.


       Свойства объекта Printer:

|                        |                        |                        |
|Свойство                |Назначение              |Значения                |
|ColorMode               |определяет тип принтера |1-монохромный           |
|                        |                        |2- цветной              |
|Page                    |номер текущей страницы  |                        |
|Pages                   |количество страниц      |                        |
|Copies                  |количество печатных     |                        |
|                        |копий                   |                        |
|PrintQuality            |качество печати (если   |1- черновая печать      |
|                        |это поддерживает драйвер|2-низкое разрешение     |
|                        |принтера)               |3-среднее разрешение    |
|                        |                        |4-высокое разрешение    |
|CurrentX, CurrentY      |Текущие координаты      |                        |
|                        |текста                  |                        |
|Fonts                   |доступные шрифты        |                        |
|                        |принтера                |                        |
|FontCount               |кол. доступных шрифтов  |                        |
|                        |принтера                |                        |
|Font.Name,Font.Size,    |характеристики шрифта   |                        |
|Font.Bold,Font.Italic...|                        |                        |
|ScaleMode               |ед. измерения масштаба  |0-пользователя          |
|                        |страницы                |1-твипы (по умолчанию)  |
|                        |                        |2-пункты                |
|                        |                        |3-пикселы               |
|                        |                        |4-символы               |
|                        |                        |5-дюймы                 |
|                        |                        |6-мм                    |
|                        |                        |7-см                    |
|ScaleLeft               |Расстояние от левой     |                        |
|                        |границы                 |                        |
|ScaleTop                |                        |                        |
|ScaleWidth              |                        |                        |
|ScaleHeight             |                        |                        |


       Методы объекта Printer:

|Метод                                |Содержание                           |
|Print                                |Печать страницы                      |
|NewPage                              |Перейти на новую страницу            |
|EndDoc                               |Закончить работу с документом.       |
|                                     |(Освобождение памяти и пересылка     |
|                                     |страниц в диспетчер печати)          |
|Scale                                |определяет координатную систему      |
|                                     |пользователя                         |
|TextHeight                           |Определяет высоту символа            |
|TextWidth                            |Определяет ширину символа            |



       Пример. Форма содержит командную  кнопку  “Печать”.  Программный  код
выводит на печать 2  страницы.  На  первой  печатается  “Стр.1”.  На  второй
“Стр.2” .
       Private Sub cmdPrint_Click()
            Printer.Print “Стр.”+Str(Printer.Page)
            Printer. NewPage
            Printer.Print “Стр.”+Str(Printer.Page)
            Printer. EndDoc
       EndSub

       Объект Screen.

       Объект  Screen  позволяет  управлять  размещением  форм   и   выводом
информации на экране.
       Свойства Объекта Screen.

|                        |                        |
|Свойство                |Назначение              |
|MousePointer            |указатель мыши          |
|Fonts                   |доступные шрифты экрана |
|FontCount               |кол. доступных шрифтов  |
|                        |экрана                  |
|Width                   |ширина экрана (в твипах)|
|Height                  |высота экрана           |

       Методов нет.

        Пример. Установить размер формы равной 50% от размера экрана.

       Private Sub Form_Load()
       Me. Width=Screen. Width/2
       Me. Height=Screen. Height /2
       EndSub

       Работа с файлами.

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

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

       Основные свойства Списка файлов:

|Свойство                             |Содержание                           |
|List                                 |Массив членов списка файлов          |
|ListCount                            |Кол. членов списка файлов            |
|ListIndex                            |Индекс массива                       |
|FileName                             |Обозначение файла                    |
|Path                                 |Текущий Путь для списка файлов       |
|Pattern                              |Фильтр, шаблон. Задает вид           |
|                                     |отображаемых в списке файлов         |

       Например,    имя    выбранного    файла    можно    определить    как
filFile.List(ListIndex) или как свойство FileName. Вывести список  файлов  в
массив FileNames$( I%) можно с помощью следующего кода:
       For I%=0  to filFile.ListCount - 1
            FileNames$(I%) = filFile.List(I%)
       Next I%

       Свойство Pattern задает тип отображаемых файлов или шаблон  * ,    ?.
По умолчанию  фильтр  установлен  в  значение   *.*   .  Несколько  фильтров
отделяются друг от друга  “; “ .  Изменение  свойства  Pattern  активизирует
событие PatternChange.
       Свойство Path устанавливает или возвращает текущий путь  для   списка
файлов. Однако для изменения текущего пути в  операционной  системе  следует
использовать команду ChDir. Изменение  свойства  Path  активизирует  событие
PathChange.   Изменение   свойства   FileName   активизирует    событие    и
PatternChange и PathChange.



       События Списка файлов:

|События                              |Описание                             |
|Click                                |                                     |
|DoubleClick                          |                                     |
|MouseDawn                            |                                     |
|MouseUp                              |                                     |
|MouseMove                            |                                     |
|KeyUp,KeyDawn,KeyPress               |                                     |
|DragDrop, DragOver                   |                                     |
|GotFocus,LostFocus                   |                                     |
|PathChange                           |Изменение текущего пути для списка   |
|                                     |файлов                               |
|PatternChange                        |Изменение шаблона для отображения    |
|                                     |файлов в списке                      |


       Пример события PathChange

       Sub File1_PathChange ()
            Label1.Caption = "Path: " & Dir1.Path  ' Show path in label.
       End Sub


       Sub Dir1_Change ()
            File1.Path = Dir1.Path      ' Set file path.
       End Sub
       Sub Form_Load ()
            Label1.Caption = "Path: " & Dir1.Path  ' Show path in label.
       End Sub


       Sub Drive1_Change ()
            Dir1.Path = Drive1.Drive    ' Set Dir path.
       End Sub
       Sub Dir1_Change ()
            File1.Path = Dir1.Path      ' Set File path.
       End Sub



       DirectoryListBox- список каталогов.

       Элемент управления DirListBox - отображает дерево каталогов  текущего
диска. Содержимое списка каталогов  обновляется  при  двойном  щелчке  мыши.
Подкаталоги текущего каталога нумеруются от 0 до ListCount - 1. Сам  текущий
каталог имеет индекс -1, родительский -2, выше -3 ,  ...При  двойном  щелчке
мыши вызывается событие Change и меняется значение свойства Path.

       Основные свойства Списка каталогов.

|Свойство                             |Содержание                           |
|List                                 |Массив членов списка каталогов       |
|ListCount                            |Кол. членов списка каталогов         |
|ListIndex                            |Индекс массива                       |
|Path                                 |Текущий Путь для списка каталогов    |
|Parent                               |Для доступа к свойствам, событиям и  |
|                                     |методам родительской формы данного   |
|                                     |элемента                             |

       События Списка каталогов

|События                              |Описание                             |
|Click                                |                                     |
|MouseUp, MouseUp, MouseMove          |                                     |
|KeyUp,KeyDawn,KeyPress               |                                     |
|DragDrop, DragOver                   |                                     |
|GotFocus,LostFocus                   |                                     |
|Change                               |Изменение в списке каталогов         |



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

       Private Sub dirBox_ Change()
            filFile1.Path = dirBox.Path
       End Sub
       При этом для списка каталогов Path указывает выбранный каталог, а для
списка файлов - каталог, файлы которого отражаются в списке.



            DriveListBox- список дисков.

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

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

|Свойство                             |Содержание                           |
|Drive                                |Определяет текущий диск              |
|ListCount                            |Кол. членов списка дисков            |
|ListIndex                            |Индекс массива дисков                |
|List                                 |Массив членов списка дисков          |
|Parent                               |Для доступа к свойствам, событиям и  |
|                                     |методам родительской формы данного   |
|                                     |элемента                             |

       События Списка дисков

|События                              |Описание                             |
|KeyUp,KeyDawn,KeyPress               |                                     |
|DragDrop, DragOver                   |                                     |
|GotFocus,LostFocus                   |                                     |
|Change                               |Изменение в списке дисков            |



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

       Private Sub drvBox_ Change()
            dirBox.Path = drvBox. Drive
       Ch Drive drvBox. Drive ‘ Если нужно изменить текущий диск ОС
       End Sub

      Файлы последовательного доступа
      Используются когда:
      а) редко вносятся изменения
      б) информация в файле обрабатывается от начала до конца
      в) если нужно добавлять информацию в конец файла.
      Для совершения операции чтения или записи с файлом его  нужно  открыть
командой Open. После Open следует имя  файла,   строковая  переменная   или
строка в двойных кавычках. Если файл не  текущем  каталоге,  нужно  указать
путь к нему.
      Запись информации в файл:
      Open “имя файла” for  Output as  # 1
      # 1  - это идентификатор файла - число от  1  до  255  с  символом  #.
Максимальное число одновременно открытых файлов определяются  параметром  в
Config.sys.
      По команде Open резервируется файловый буфер в памяти  компьютера.  По
мере заполнения буфера  активируются   соответствующий  диск  и  весь  блок
информации  посылается   непрерывным  потоком  на  диск  (количество  будет
устанавливаться  в  Config.sys).  После  окончания  работы  с   файлом   он
закрывается командой Close # идентификатор файла. Команда Close  сбрасывает
информацию на диск и очищает буфер. Для сброса содержимого буфера  на  диск
(в критических ситуациях) используется команда Reset. Для ввода  информации
в файл можно использовать команду Print #
      “ Запись в файл
      Open “File 1”  For  Output As #1
      Print #1, “1 2 3 4 5 ” или Print #1, txtDisplay.Text
      Close  #1
      Если в текущем каталоге есть файл с таким именем, то этой командой  он
будет уничтожен.
      Close без параметров закрывает все файлы.
      Для определения размера открытого файла можно использовать команду LOF
(идентификатор файла)
      Open “File 1”  For  Output As #1
      Print  #1, “1 2 3 4 5 ”
      Print  LOF(1)
      Вместо Print можно использовать Write #  идентификатор  файла,  список
переменных.

      Чтение из файла
      Open ”имя файла” For Input As # идентификатор файла
      Задается  свободный  идентификатор,  который  в   данный   момент   не
используется в программе. Или так:

      FileNumber % = FreeFile
      Open “имя файла”  For  Input As  #  FileNumber %
      После этого можно использовать оператор Line Input #  для  построчного
чтения информации из файла:
      Open “File1” For Input As  #1
      Line Input  #1, A$ принимает в A$ всю информацию до Enter
      Print A$
      Close #1
      Либо Input # идентификатор файла, список  переменных,  если  запись  с
помощью Write, txtDisplay
      Если файл сложной структуры, состоит из полей и записей, то файл будет
читаться целыми записями командой LineInput, либо можно  информацию  читать
из отдельных полей командой Input #
      Например, чтение записей из файла Spisok в массив
      1. Определяем тип пользователя
      Type StudentRecord
           Name As String
           Adress As String
      End  Type
      2. Объявляем массив записей типа Student как глобальную переменную
      Global StudentAdress( ) As StudentRecord
         Sub Proc( )
             Dim FileNum As Integer, I As Integer
             ReDim StudentAdress(1 to 150)
             FileNum = FreeFile
         Open “Spisok” For Input As # FileNum
             For I=1 to 150
                Input  #FileNum, StudentAdress(I).Name
                Input  #FileNum, StudentAdress(I).Adress
             Next I
         Close FileNume
      End Sub

      Чтение текстового фала в текст, поле
      . . . .
      FileNum = FreeFile
      Open “My.txt” For Input As FileNum
      txtDisplay.Text=Input(LOF (FileNum), FileNum)
      Close  #FileNum
где  LOF(FileNum) размер файла в байтах

      Дозапись информации в существующий последовательный файл
      При этом строки,  которые  будут  выведены  в  файл  присоединяются  к
строкам, которые уже содержаться в файле. Для этого служит оператор
      Open “имя файла” For  Append As  # идентификатор файла
      При этом:
      - VB открывает файл, а если он не существует,  то  создает  и  создает
соответствующий буфер;
      -  находит конец файла на диске;
      - готовит к записи в конец файла.
      Пусть существует текстовый файл My.txt и нужно дописать  в  его  конец
строку “До свидания”:
      FileNum=FreeFile
      Open “My.txt” For Append As FileNum
      Print  #FileNum, “До свидания”
      Close  #FileNum
      При обработке больших файлов часто необходимо проверять на  достижение
конца файла. Для этого существует оператор EOF (идентификатор файла).
      Фрагмент программы чтения информации из файла,  созданного  с  помощью
оператора Print #
      . . . . .
      B$ = “ ”
      FileNum=FreeFile
      Open “My.txt” For Input As #FileNum
         Do Until EOF(FileNum)
            Line Input #FileNum, A$
            B$=B$+A$
         Loop
      txtDisplay.Text=B$
      Close  #FileNum

      Файлы прямого доступа
      Напоминают  базу  данных.  Файл  состоит  из   упорядоченных   записей
одинакового размера. Существует  запись,  состоящая  из  полей,  в  которых
содержаться данные. Обеспечивает  быстрый  поиск  информации,  но  дисковое
пространство используется неэффективно.
      При создании файла указывается максимальная длина существующей записи.
Команда создания файла:
      Open “MyLib.dat” For Random As  # идентификатор файла
      Len = длина записи,  можно  определять  с  помощью  функции  Len  (имя
переменной записи) в текущем каталоге.
      Открытый  файл  прямого  доступа  может  быть   прочитан   и   записан
практически одновременно.
      Close # идентификатор файла - закрывает файл.
      Каждая запись в файле имеет номер записи.  Это  позволяет  работать  с
конкретной записью. При описании записи задаются пользовательским типом:
      Type Books
         Auther As String *30
         Title As String *40
      End Type
      Запись, содержащую пятой записи файла в переменную:
      Get  #FileNum, 5, NewBook   (если NewBook типа Books)
      Запись из переменной в сороковую запись файла:
      Print  #FileNum, 40, NewBook
      Созданные типы записей определяют размер файла прямого доступа. Размер
файла  определяется  функцией  FileLen   (“имя   файла”).   Размер   записи
Len(NewBook) в байтах.


      Двоичные файлы
      Двоичные файлы - частный случай файлов произвольного  доступа,  однако
размер в них равен 1. Вы оперируете байтами и  всегда  можно  записать  или
прочитать любой байт файла, указав лишь  его  позицию  в  файле.  В  режиме
двоичного доступа можно открыть  как  последовательный  файл,  так  и  файл
прямого доступа. Можно одновременно и читать, и записывать в файл.
      Имеются следующие операторы:
      Открытие - Open “имя файла” For Binary As  #FileNum
      Запись в файл - Put  #FileNum, № байта в  файле,  имя  переменной  для
записи в файл
      Чтение из файла - Get  #FileNum, № байта в файле, имя  переменной  для
записи в файл.

      Доступ к данным в VB
      VB предоставляет средства доступа к данным, которые  дают  возможность
создавать и использовать системы БД, управляющих данными приложения.
      VB позволяет обращаться к базам данных многих популярных форматов:  MS
Access, Btrieve, dBase, FoxPro, Paradox, а также базам данных ODBS   систем
клиент-сервер, таким как MS SQL Server.
      В стандартной редакции VB инструменты работы с данными включают:
      а) процессор БД Microsoft Jet;
      б) элемент управления Data;
      в) объектный интерфейс программирования Dao (Data Access Objects).
      Два последних инструмента обеспечивают  два  методв  взаимодействия  с
процессором Jet.
      Элемент управления Data  дает  ограниченные  возможности  обращения  к
существующим базам данных практически без программирования.  Модель  DAO  -
программный интерфейс, обеспечивающий полный контроль над БД. Это коллекция
объектных  классов,  которые  моделируют  структуру  реляционной  БД.   Они
обеспечивают свойства и методы, которые позволяют выполнять все операции  с
БД,  такие  как  создание  БД,  определение  таблиц,  полей   и   индексов,
установление отношений между таблицами, запросы в базах данных.
      Процессор Jet транслирует  эти  операции  в  процессе  выполнения.  Он
транслирует запросы приложения в физические операции  по  обработке  файлов
БД. Он читает, записывает и изменяет  базу  данных,  выполняет  индексацию,
блокировку, защиту. Он  также  принимает  запросы  SQL,  в  соответствии  с
которыми  выполняет  требуемые  действия  в  базе  данных,  и  обрабатывает
результаты, возвращаемые запросами.
      Хранилище данных  -  это  файл  или  файлы,  непосредственно  создание
таблицы БД. Для внутренней БД VB или MS Access - это  файл  формата   .mdb.
Для других баз это может быть каталог, содержащий файлы .dbf.



      Архитектура доступа к данным в  VB

      Схема доступа к данным в приложении VB

|пользователь        |    интерфейс       |

|процессор БД                             |

|хранилище данных                         |

      Процессор БД располагается между прикладной программой  и  физическими
файлами БД. Этим  определяется  независимость  приложения  от  типа  БД,  к
которой происходит обращение. Вне зависимости от формата  БД  в  приложении
используются  одни  и  те  же   объекты   доступа   к   данных   и   методы
программирования.
      Управление  пользовательским  интерфейсом  осуществляется  кодом   VB,
который манипулирует объектами и методами доступа к  данным  и  запрашивает
услуги  БД,  например,  добавление  или  удаление  записей  или  выполнение
запросов. Запросы услуг адресуются не файлу БД, а процессору  Jet,  который
выполняет запрошенные операции по обработке данных и возвращает  результаты
приложению.
      Процессор  БД  Jet  реализован  в  виде  набора  файлов   динамических
библиотек .dll, которые связываются с приложением VB в процессе  выполнения
Dao в физические операции непосредственно с файлами БД данного формата.
      Программирование работы с БД в VB заключается в создании объектов Dao,
таких как Database, TableDef,  Field  и   Index.  Свойства  и  методы  этих
объектов используются для выполнения операций в БД. Результат этих операций
можно вывести на экран, а данные пользователя вводятся через формы VB.  Это
дает большую гибкость, т.к. одни и те же объекты, свойства и  методы  можно
использовать для доступа к БД различных  форматов.  Можно  также  создавать
приложения, в которых в единственном запросе или отчете соединяются таблицы
из двух и более различных БД.
      VB через DAO и  Jet  работает со следующими БД:
      1)  БД  VB  - внутренние БД. Формат, что и у MS  Access.  Создаются  и
управляются непосредственно процессором Jet.
      2) Внешние  БД  ISAM  (индексно-посреднические  организации),  включая
Btrieve, dBase, FoxPro 2.  ,  3.  ,  Paradox.  Эти  БД  можно  создавать  и
обрабатывать в VB. Можно также обращаться к текстовым источникам  данных  и
.... MS Excell  и Lotus-1, 2, 3.
      3) БД ODBC - интеллектуальные БД клиент-сервер: MS SQL Server, Oracle,
поддерживающие стандарт ODBC.
      Новый режим DAO -  ODBC  Direct   позволяет  обращаться  к  источникам
данных ODBC, минуя процессор Jet.
      Он транслирует запросы приложения в физические операции  по  обработке
файлов БД.  Он  читает,  записывает,  изменяет  БД,  выполняет  индексацию,
блокировку, защиту и поддержание ссылочной целостности. Он  также  содержит
процессор запросов, который принимает запросы SQL  и в соответствии с  ними
выполняет  требуемые  действия  в  БД,  а  также   процессор   результатов,
обрабатывающий результаты, возвращаемые запросами.
      В процессе обработки запроса процессор Jet выдает  подмножество  одной
из таблиц  БД,  хотя  уже  существует  или  временно  создает  новую  сетку
(просмотр) в памяти в виде  комбинации  данных  из  разных  таблиц.  Сетки,
состоящей из записей, которые были извлечены из БД, соответствует объект VB
RecordSet. Если сетка является дополняемой, то она  называется  dynaset,  в
противном случае - snapshop/

         Доступ к БД с помощью элемента управления данными Data без
                              программирования

      Элемент управления  Data ничего не отображает, а  только  сопровождает
поток информации между приложением и БД. Для отображения информации  из  БД
на  экране  используются  связанные  элементы  управления,  т.е.   элементы
управления,  которые  могут  работать  с  элементом  управления  Data.  Они
называются data aware или data  bound.  К  связанным  элементам  управления
относятся:   текстовые   поля,   надписи,   флажки,   элементы   управления
изображением,  графические  окна,  списки,  комбинированные  списки,   OLE.
Связанные  элементы  должны  находиться  на  той  же  форме,  что  и  Data.
Информация из БД посредством элемента управления  Data  будет  передаваться
связанному элементу и сохраняться в  его  свойствах  (хотя  он  может  быть
невидим).
      После размещения элемента управления Data на форме  необходимо  задать
его свойства:
      DataBaseName - имя БД, к которой необходимо подключиться.
      RecordSource - для определения таблицы или запроса к БД, в  том  числе
SQL-запросы.
      Затем к форме добавляется связанной элемент управления и привязывается
к элементу управления Data, для чего:
      Свойство DataSource устанавливается по имени элемента управления Data.
      Свойство DataField устанавливается по имени столбца из RecordSource.
      После  выполнения  операции  привязки,  нажатие  на  стрелки  элемента
управления Data (< - первая запись, < - ... запись, > - следующая запись, >
-  последующая  запись),  будет  изменять  содержимое  связанного  элемента
управления.

      Другие свойства элемента управления Data.
      Connect - определяет тип БД, например, FoxPro 3.0.
      Exclusive = True - запрет  доступа  к  БД,  пока  пользователь  ее  не
закроет (после этого необходимо ... Share.exe)
      ReadOnly (True/False)
      RecordSetType - если RecordSet создается с помощью кода  или  элемента
управления.

      Метод  Refresh-   по  этому   методу  все  связанные  элементы   формы
обновляют свое состояние в соответствии с текущим состоянием таблицы.
      Data1.Refresh.
      Он открывает БД, а также  устанавливает  указатель  записи  на  первую
строку в таблицу или сети просмотра.
      Свойство RecordSet объекта Data - это воображаемая таблица, к  которой
подключен элемент Data. Это может быть реальная таблица из RecordSource или
сетка просмотра, определяемая SQL-выражением.

      Методы RecordSet
      AddNew -  очистка  буфера  копирования,  содержащего  данные,  которые
должны быть записаны  в  БД,  и  перемещение  текущей  записи  в  конец.  =
Добавление записи, которая становится текущей.
      Data1.RecordSet.AddNew.
      Delete - удаление текущей записи.
      Update - реальная пересылка содержимого буфера копирования  в  таблицу
или dynaset.
      Edit - копирует текущую запись в буфер копирования для возможности  ее
редактирования.
      MoveNext - перейти на следующую запись
      MovePrevious - перейти на предыдущую запись
      MoveLast - перейти на последнюю  запись
      MoveFirst - перейти на первую  запись
      BOF - начало файла.
      EOF - конец файла.
      RecordCount - количество записей с первой до текущей.
      Пример. Удаление всех записей в таблице.
      Data1.RecordSet.MoveFirst
      Do While Data1.RecordSet.EOF
        Data1.RecordSet.Delete
        Data1.RecordSet.MoveNext
      Loop

      Свойство RecordSource - источник записей, позволяет помимо  таблиц  БД
использовать  операторы   SQL,   чтобы   выделить   подмножество   записей,
удовлетворяющих некоторым условиям.  Это  позволяет  создавать  программные
элемента dynaset или snapshop.
      Ввод следующий фраз:
      Select - отбор информации из полей.
      From - указывает имя таблицы.
      Where - определяет условия выборки.
      Group By - для распределения выбранных записей в определенные группы.
      Having - определяет условие, которому должна  удовлетворять  следующая
группа записей.
      Order By - порядок сортировки выбранных записей.
      Например.
      Data1.RecordSource = “Select Name, Address  From AdressBook ...
      Data1.RecordSource = “Select Name, Address  From AdressBook
      Data1.RecordSource = “Select Name, Address  From AdressBook Where Name
= ‘Иванов’‘’
      “ . . . .  Like ‘’Иван” (Ивасев, Иваницкий, Иванченко...)
      Select  Employers.Dept,  M\Name  From  Supervisors,  Employers   Where
Employers.Dept = Supervisiors.Dept
      Можно использовать переменные
      Data1.RecordSource = “Select * From Telephone Where Name = ‘ “& A &”’”
      Text1.Text
      В фразе Where можно использовать конечные операции And,  Or,  Not  для
соединения нескольких выражений или операции сравнения <, <=,  >,  >=,  <>,
Between, Like, In (для записей в БД)
      Например
      Data1.RecordSource = “Select * From Products
        Where Tovar in (Select Tovar From_ Details Where Price>=25)”

        Помимо запросов SQL можно изменять (Update,  Set  -  новое  значение
Where), добавлять (Insert into), удалять (Delete From) записи в таблице.
        Например
        Dim A  As String
        A = “Update Orders”
        A = A + “Set Amount = Amount * 1.1, Cast = Cast * 0.97”
        A = A+ ”Where Order = ‘Цемент’”
        Data1.Database.Execute ... Query  - запрос с воздействием



        Свойство Value
        Можно ссылаться на некоторое поле текущей записи, даже если на форме
нет связанного элемента.
        Например
        Sub
        Dim A As String
        A = Data1.RecordSet.Fields(“Name”).Value
        MsgBox “Фамилия: ” + A
        End Sub


       Объектная модель DAO

       Объектная  модель  DAO  -  объектно   -   ориентированный   интерфейс
процессора БД Jet  .  Это  иерархия  классов,  которые  являются  логическим
представлением реляционной модели базы данных. Эти классы  используются  для
создания объектов доступа к данным, обращающихся к конкретной  базе данных.



         DBEngine


             Workspace


                       Database



         TableDef           QueryDef           Recordset           Container
 Relation


              Field                       Field                        Field
Document        Field


         Index               Parameter



  Error              Field


       Рис. Фрагмент объектной иерархии DAO.

       Наличие объектной иерархии  означает,  что  объекты  могут  содержать
другие объекты, которые, в свою очередь,  могут  содержать  другие  объекты.
Эта  объектное  включение  реализуется  через   специальный   вид   объекта-
коллекцию.  Основное   назначение   объекта-   коллекции   -   содержать   и
группировать другие объекты. Все объекты, содержащиеся в  данной  коллекции,
одного вида.
       Элементы в иерархии DAO фактически классы, а не объекты.  Это  макеты
для объектов, создаваемых при формировании приложения   базы  данных,  Класс
подобен типу данных в том смысле, что он описывает, к  какому  виду  объекта
происходит обращение. Например, в объявлении Dim Ws As устанавливается,  что
переменная Ws будет служить ссылкой на объект класса Workspace.
       Наверху иерархии - объект DBEngine, непосредственно  процессор   базы
данных  MS  Jet.  Он  является  владельцем  коллекции  Workspaces   (рабочая
область),  которая  содержит  объекты  Workspace.  Каждый  объект  Workspace
включает коллекцию Databases, которая  содержит  один  или  больше  объектов
Database. Каждый  объект  Database  включает  коллекцию  TableDefs,  которая
содержит один или больше объектов TableDef (определение таблицы) и т.д.
       Объекты члена коллекции индексируются,  начиная  с  0  и  могут  быть
доступны  через  этот  индекс.  Например,  первый  объект  TableDef  объекта
Database, именуемого Database1, будет адресоваться как Database1.  TableDefs
(0). Второй TableDef  того же объекта Database - Database1. TableDefs (1)  и
т.д. Объекты  в  иерархии  идентифицируются  полным  путем  через  вложенные
коллекции, к которым они принадлежат. Например,
              DBEngine.   Workspaces(0).    Databases(0).    ss    TableDefs
(0).Fields(“Customer”)
        адресуется к полю Customer в  первом  TableDef  коллекции  TableDefs
первого Database коллекции Databases первого Workspace коллекции  Workspaces
объекта DBEngine. Кроме того, для  коллекции  Fields  можно  вместо  индекса
использовать свойство Name объекта Field коллекции. При  явном  обращении  к
члену коллекции по  именивместо  точки  используется  восклицательный  знак.
Например, ss
       TableDefs (0).Fields(“Customer”) эквивалентно
       TableDefs (0).Fields!Customer.
       Большинство объектов доступа к данным имеет умолчательные  коллекции.
Это позволяет упрощать программный код. Например,  умолчательная  коллекция,
которую содержит объект  Recordset  -  коллекция  Fields.  Например,  все  3
записи эквивалентны:
       Cust= Recordset1! Customer
       Cust= Recordset1 .Fields!Customer
       Cust= Recordset1 . Fields(“Customer”).


       Программирование с объектами DAO.


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

       Dim DB As  Database,  WS  As  Workspace(“account.mdb”)  ‘  Объявления
переменных

       Set  WS=DBEngine.  Workspaces(0)  ‘  Организуется   рабочая   область
(именнованный сеанс пользователя).
       Set DB= WS.OpenDatabase(“account.mdb”) ‘ Метод  OpenDatabase  объекта
WS типа Workspace используется  для  открытия   базы  данных  account.mdb  и
присвоения ссылки на нее объектной переменной DB типа Database.
       Set RS=DB.OpenRecordset(“Clients”) ‘ С помощью  метода  OpenRecordset
объекта DB создается набор записей на  основе  таблицы  Clients,  ссылка  на
который присваивается переменной RS типа Recordset.
       RS.Index=“ClientID”       ‘ Свойству Index объекта  RS  присваивается
значение ClientID.



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

       Процедура построения  базы  данных  Jet  -  это  процесс  создания  и
определения объектов доступа  к  данным,  которые  соответствуют  таблицам,
полям, индексам и отношениям структуры новой  базы данных.
       Пусть требуется создать библиографическую   базу  данных  Biblio.mdb,
состоящую   из   3-х    таблиц    “Авторы”(Authors),    “Названия”(Titles),
“Издатели”(Publishers), связанных между собой следующими отношениями:

       Titles                                                        Authors
            Publishers

       Title                                                           AU_ID
             PubID
       Year                Published                                  Author
       Name
       ISBN
                    Company
       AU_ID
                  Address
       PubID
                     ...(10)


       Необходимо  создать  объект  Database  ,  определить  его  логическую
структуру, добавив объекты TableDef и Field.
1. Для каждого объекта  базы данных создаются новые объектные переменные:
    Dim DB As DataBase, WS As Workspace    ‘объект  базы данных DataBase
    Dim AuTd As TableDef, TitTd As  TableDef,  PubTd  As  TableDef        ‘
объект ‘TableDef для  каждой из 3-х таблиц
    Dim AuFlds(2) As Field, TitFlds(5) As Field,  PubFlds(10)  As  Field  ‘
объект Field
        ‘для каждого поля каждой таблицы
    Dim AuIdx AS Index, TitIdx As Index, PubIdx As Index ‘ объект Index для

     ‘каждого индекса каждой из 3-х таблиц


2.На основе метода CreateDatabase объекта Workspace создается  новая   база
данных:
       Set Ws=DBEngine. Workspace(0)
       Set
Db=Ws.CreateDataBase(“C:\VB\Biblio.mdb”,dbLangGeneral,dbVersion30)        ‘
константа  dbLangGeneral  определяет  языковую  версию   базы   данных,   а
dbVersion30-  базу данных Jet версии 3.0

3. С помощью  метода  CreateTableDef  объекта  Database  создаются  объекты
Tabledef  для каждой таблицы  базы данных:
       Set TitTd=DB.CreateTableDef(“Titles”)
       Set AuTd= DB.CreateTableDef(“Authors”)
       Set PubTd= DB.CreateTableDef(“Publishers”)

4. С помощью метода CreateField объекта TableDef  создаются  объекты  Field
для  каждого  поля  каждой  таблицы   базы   данных.   Для   каждого   поля
устанавливаются  свойства,  определяющие  размер,  тип  данных   и   другие
необходимые  атрибуты.  Например,  для  поля  Author  код  будет  выглядеть
следующим образом:
       Set AuFlds(0)=AuTd.CreateField(“AU_ID,dbLong)
       ‘ сделать поле счетчиком
       AuFlds(0).Attributes=dbAutoIncrField
       Set AuFlds(1)=AuTd.CreateField(“Author,dbText)
       AuFlds(1)=50  ‘ длина поля

5.Используя метод Append добавить  каждое  поле  к  его  таблице,  а  каждую
таблицу - к  базе данных:
       AuTd.Fields.Append AuFlds(0)
       AuTd.Fields.Append AuFlds(1)
       DB.TableDefs.Append AuTd


6. Используя метод CreateIndex объекта TableDef, создать индексы для  каждой
таблицы и установить их свойства. Например. для таблицы Authors:
        Set AuIdx=AuTd.CreateIndex(“Au_ID”)
       AuIdx.Primary=True  ‘Первичный ключ
       AuIdx.Unique=True  ‘Уникальный ключ

7. Используя метод CreateField  объекта  Index,  создать  поля  для  каждого
индексного объекта:
       Set NewFld=AuIdx.CreateField(“Au_ID”)

8. Добавить поле к объекту Index, а объект Index к объекту TableDef:
       AuIdx.Fields.Append NewFld
       AuTd.Indexes.Append AuIdx

       Вновь созданные поля  объекта  Index  не  становятся  частью  объекта
TableDef. Вместе с тем им дается то же самое свойство Name,  что  и  у  поля
объекта TableDef, которое они должны индексировать. Свойства Type и  Size  у
этих полей не определяются.


       Связывание таблиц

       Создание объектов TableDef,  которые  содержат  первичный  и  внешний
ключи,  позволяют  связывать  записи  в  одной  таблице  с  соответствующими
записями в другой  таблице,  согласно  общим  значениям  первичного/внешнего
ключей.  При  добавлении  или  удалении  записей  важно   поддерживать   так
называемую  ссылочную  целостность.  Ссылочная  целостность  означает,   что
внешний  ключ  в  любой  ссылающейся  таблице  всегда  должен  ссылаться  на
достоверную запись в адресуемой  таблице,  содержащей  первичный  ключ.  Для
поддержания ссылочной целостности используется объект Relation.
      1. Добавить отношение к  базе данных :
       Dim Au_Tit As Relation       ‘ объект  Relation
       Set Au_Tit =Db.CreateRelation(“Authors_Titles”)  ‘  создается  объект
Relation с помощью метода .CreateRelation
       Au_Tit.Table=“Authors”  ‘ Устанавливаются свойства объекта  Relation
       Au_Tit.ForegnTable=“ Titles”

       2. Создать поле, которое в  отношении  будет  определять  общее  поле
первичного/внешнего ключа:
       DimTempField As Field
       Set TempField =  Au_Tit.CreateField(“Au_Id”)  ‘  создается  связующее
поле  с помощью метода CreateField
       TempField. ForegnName =“Au_Id”  ‘  Устанавливаются  свойства  объекта
Field

       3. Добавить объект Fields к объекту Relation,  а  объект  Relation  к
объекту Database   с помощью метода Append:
       Au_Tit.Fields.Append TempField
       Db.Relations..Append Au_Tit


       Связывание таблиц внешних  баз данных

       Кроме определения новых таблиц можно присоединять  таблицы  из  любой
поддерживаемой  внешней базы данных или из  другой   базы  данных  Jet.  При
связывании таблицы информация соединения  сохраняется  во  внутренней   базе
данных Jet, и соединение будет устанавливаться автоматически всякий раз  при
открытии этой  базы  данных.  Сами  же  данные  остаются  во  внешней   базе
данных.
       Процедура связывания таблицы внешней базы данных подобна  определению
и созданию новой внутренней таблицы, за исключением того, что  при  создании
объекта TableDef необходимо определить свойства SourceTableName  и  Connect.
Кроме того, для этой  таблицы  нельзя  связывания  создавать  или  добавлять
новые объекты Field и Index.
       Для связывания внешней таблицы с базой данных необходимо:
 Создать для связываемой таблицы  новый  объект  TableDef,  используя  метод
CreateTableDef объекта  Database.  Назначить  таблице  новое  имя  (свойство
Name).  Например,  чтобы  присоединить  таблицу  Сustomers  из  базы  данных
Stocks.mdb к базе данных Biblio.mdb,можно записать:
       Set NewTd=DB.CreateTableDef(“Customers”) ‘ Предполагается , что  база
данных Biblio.mdb открыта методом OpenDatabase  и  ей  назначена  переменная
DB.

       2. Установить свойства SourceTableName и Connect объекта TableDef:
       NewTd. SourceTableName=“Customers”
       NewTd. Connect=“;DATABASE=C:\Access\Stocks.mdb;”

       3.Добавить новый объект TableDef к базе данных:

       DB.TableDefs.Append NewTd

       Модификация базы данных

       Процедуры изменения базы данных подобны ее созданию. Используются  те
же методы Create и Append.

       1. Для добавления таблицы к базе  данных  необходимо  добавить  новый
объект TableDef к существующей коллекции TableDefs. Например:
    Dim DB As DataBase
    Dim NewTd As TableDef ‘ Создать новый объект TableDef
    Dim NewFld As Field ‘Создать новый объект Field

       Set Db=DBEngine. Workspace(0).OpenDatabase(“Biblio.mdb”)
       Set NewTd=DB.CreateTableDef(“NewTable”)
       Set NewFld= NewTd.CreateField(“NewField”,dbInteger)
       NewTd.Fields.Append NewFld  ‘добавить поле к таблице
       DB.TableDefs.Append NewTd  ‘добавить таблицу к базе данных
       Db.Close   ‘Закрыть базу данных

       1. Для добавления поля к таблице  необходимо  добавить  новый  объект
Field к существующей коллекции Fields

    Dim DB As DataBase
    Dim Td As TableDef
    Dim Fld As Field ‘Создать новый объект Field
       Set Db=DBEngine. Workspace(0).OpenDatabase(“C:\Biblio.mdb”)
       Set Td=DB. TableDefs(“Authors”)
       Set Fld= Td.CreateField(“NewField1”,dbText,30)  ‘Создать первое новое
поле
       Td.Fields.Append Fld  ‘добавить поле к коллекции Fields
       Set Fld= Td.CreateField(“NewField2”,dbText,20)  ‘Создать второе новое
поле с помощью той же переменной
       Td.Fields.Append Fld  ‘добавить еще один объект к коллекции Fields
       Db.Close   ‘Закрыть базу данных

       2. Для добавления таблицы к базе  данных  необходимо  добавить  новый
объект TableDef к существующей коллекции TableDefs. Например:
    Dim DB As DataBase
    Dim NewTd As TableDef ‘ Создать новый объект TableDef
    Dim NewFld As Field ‘Создать новый объект Field

       Set Db=DBEngine. Workspace(0).OpenDatabase(“C:\Biblio.mdb”)
       Set NewTd=DB.CreateTableDef(“NewTable”)
       Set NewFld= NewTd.CreateField(“NewField”,dbInteger)
       NewTd.Fields.Append NewFld  ‘добавить поле к таблице
       DB.TableDefs.Append NewTd  ‘добавить таблицу к базе данных
       Db.Close   ‘Закрыть базу данных

       3. Для добавления индекса к таблице необходимо добавить новый  объект
Index к существующей коллекции Indexes . Например:

       Dim DB As DataBase, Td As TableDef, NewIdx As Index ,NewFld As  Field

       Set Db=DBEngine. Workspace(0).OpenDatabase(“C:\Biblio.mdb”)
       Set Td=DB. TableDefs(“Authors”)
       Set NewIdx =Td.CreateIndex(“Address_Index”)
       NewIdx.Unique=False
       Set NewFld= NewIdx.CreateField(“Address”,)
       NewIdx.Unique=False
       NewIdx.Fields.Append NewFld  ‘добавить поле к объекту Index
       Td. Indexes.Append NewIdx ‘добавить объект Index к TableDef
       Db.Close   ‘Закрыть базу данных

       4.  Для  удаления  таблицы  используется   метод   Delete   коллекции
TableDefs. Этот метод  удаляет  из  таблицы  все  поля,  индексы  и  данные,
содержащиеся внутри таблицы. Например:
       Db.TableDefs.Delete “Authors”

       5. Для  удаления  поля  (объекта  Field)  используется  метод  Delete
объекта TableDef.
         Для  удаления  индексированного  поля  необходимо  сначала  удалить
индекс, а также созданные посредством этого индекса объекты Relation.  После
этого  можно  будет  удалить  объект  Field  или  объект  TableDef,  который
является частью отношения.

       6.  Для  удаления  индекса  используется   метод   Delete   коллекции
TableDefs.
       Например:
       Db.TableDefs(“Authors”).   Indexes.Delete   “Address_Index”    ‘   Из
коллекции Indexes в таблице Authors удаляется индекс “Address_Index”.
       Нельзя удалять объект Index, который формирует объект Relation.

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

       Модификацию базы данных можно также проводить с  помощью  специальных
запросов SQL.



       Работа с записями базы данных

       Работа с  записями  базы  данных(добавление,  удаление,  модификация,
поиск,  сортировка)  осуществляются  DAO  посредством  объектов   Recordset.
Объект  Recordset  представляет  записи   исходной   таблицы   или   записи,
получаемые в результате выполнения  запроса.  Существуют  5  типов  объектов
Recordset:
Объект Recordset типа table работает с локальной таблицей  базы  данных  или
вешней базы данных, созданной  MS  Jet.  Этот  объект  можно  индексировать,
используя индекс, созданный  для  исходной  таблицы,  что  намного  ускоряет
сортировку и поиск по сравнению с другими типами объектов Recordset.
Объект Recordset типа dynaset (динамический набор) создается  для  локальных
или связанных таблиц или с  результатами  запросов.  Фактически,  это  набор
ссылок на записи одной или более таблиц. С помощью dynaset можно получать  и
модифицировать данные более, чем одной таблицы,  включая  связанные  таблицы
из других баз данных. Набор dynaset  и  его  исходные  таблицы  модифицируют
друг друга. Dynaset - наиболее гибкий и  мощный  тип  набора  записей,  хотя
поиск в них работает не так быстро, как в случае table.
Объект Recordset типа snapshot (моментальный снимок) содержит  фиксированную
копию данных в состоянии на момент создания  snapshot.  Snapshot,  созданный
на базе источника данных MS Jet, не может быть  обновлен.  Snapshot  требует
меньших  затрат  обработки,  чем  dynaset  или  table,  и  запросы   в   них
выполняются быстрее.
Объект Recordset типа  forward-  only  (листаемый  снимок,  только  вперед),
обеспечивает подмножество функций snapshot. Он  предоставляет  меньше  всего
возможностей,  но  зато  самое  высокое  быстродействие.  Он   не   является
обновляемым,  и  он  позволяет  перемещаться  по  записям  только  в  прямом
направлении.
Объект Recordset типа dynamic  -  результирующий  набор  запроса  одной  или
нескольких исходных таблиц, в котором можно добавлять, изменять или  удалять
записи.
       Выбор того или иного типа  набора  записей  зависит  от  того,  какие
функции необходимо выполнить, нужно ли  изменять  или  просто  просматривать
данные.  Обычно  Объект  Recordset  типа  table  почти  всегда  обеспечивает
наивысшую эффективность.


        Создание перемещений RecordSet
        Для этого используется метод OpenRecordSet
    Set rstNew = dbs.OpenRecordSet(“Customers”, dbs.Open RecordSet),
    где  rstNew  -  переменная,   dbs.OpenRecordSet(“Customers”,   dbs.Open
RecordSet) - ссылка на объект, возвращаемый методом OpenRecordSet.
    Этот метод доступен не толко для объекта  Database,  но  и  Connection,
TableDef, QueryDef и существующих наборов RecordSet.
    Set rstNew = qdf.OpenRecordSet
    Например, создается объект  RecordSet  из  сохраненного  в  текущей  БД
запроса.
    Dim dbs As Database, Rst As RecordSet
    Set dbs=OpenDatabase (“Nwind.mdb”
    [ Set rst = dbs.OpenRecordSet (“Сохраняет_Запрос”)]
    или если сохранение запроса не существует

    Dim strQuerySQL As String
    Set dbs=OpenDatabase (...
    StrQuerySQL=“Select * From Products”_ & “Order by ProductName”
    Set rst=dbs.OpenRecordSet (strQuerySQL)

    Перемещение по набору записей
    Методы  MoveFirst,  MoveLast,  MoveNext,  MovePrevious   -   перемещает
указатель.
    Move [n]
    Переделы набора записей определяется свойствами BOF  и EOF,  количество
записей свойством - RecordCount.
    Найти определенную запись в наборе можно с  помощью  метода  Seek  (для
Table)  и  Find  (dynaset,   snapshop):   FindFirst,   FindLast,   FindNext,
FindPrevious.
    Например
    rstOrderDetails.Find “Order ID= ” & rstOrders.[Order ID] -  для  первой
записи в Orders найти .... запись в OrderDetails

    rst Suppliers.Index=“CompanyName”
    rst Suppliers.Seek “=” str CompanyNAme
    If rst Suppliers. NoMatch Then  ...
    (используется текущий индекс таблицы,  определенной  свойством  Index).
Свойство  NoMatch  используется  для  проверки  найденной  записи,  критерий
поиска.
    После создания объекта RecordSet типа table или  dynaset  в  переменной
можно удавлять или добавлять, модифицировать новые записи  (Update,  Delete,
AddNew).
    .... модификации намного эффективнее с помощью запросов SQL.
    Dim dbs As DataBAse, qdfChangeTitles As QueryDef
    Set dbs = Open Database (‘ Nwind.mbb)
    Set qdfChangeTitles=dbs.Create QueryDef (“ “)
    qdf ChangeTitles.SQL=“Update Employers” & “Where Title = ‘Бухг’”

    После извлечения записи можно обращаться к  ее  отдельным  полям  через
коллекцию Fields объекта RecordSet по  его  свойству  Name  (имя  столбца  в
таблицк)
    rst Employers.Fields (“LastName”)
    или rstEm.LastName
    или rstEm.Fields(0) - индексом в коллеции
    Типы  данных  объекта  Field:  dbChar,  bdByte,  dbDouble,   dbInteger,
dbSingle, dbLong, dbText.
    При работе с данными Field используется его свойство Value.
    Sub Change Title( )
    rstEmployces.LastName.Value=strName
    Dim dbsSales As Database
    Dim rstEmp  As RecordSet, fldTitle As Field
    Dim wspCurrent As WorkSpace
    Set wspCurrent As WorkSpace
    Set wspCurrent=dbEngine WorkSpace(0)
    Set dbsSales=OpenDatabnase (“Nwind.mdb”
    Set rstEmp=dbsSales.Open RecordSet(“Employes”, dbOpenTable)
    Set fldTitle=rstEmp.Fields(“Title”)
    rst Emp.MoveFirst
    Do Until rstEmp.EOF
    If  fldTitle=“Ком. предст.” Then
         rstEmp.Edit
         fldTitle=“Ком. агент”
         rstEmp.Update
    End If
    rstEmp.MoveNext
    Loop
    rstEmp.Close
    dbsSales.Close
    End Sub

      Создание запросов
      Методв CreateQueryDef:
      Set запрос = БД.CreateQueryDef ([имя] [, строка SQL])
      - запрос - объектная переменная, в которых будет храниться  ссылка  на
вновь создаваемый объект типа QueryDef
      - БД - объектная переменная, хранящая ссылку на  объект  Database,   в
коором будет храниться создаваемый объект QueryDef
      - имя - имя запроса
      - строка SQL - выражение SQL, ..... объект QueryDef
      Например,
      Dim dbs As Database
      Dim myqdf As QueryDef
      SQL str = “Select * From Products”
      SQL str = SQl str & “Where price >1000 and price <2000”
      SQL str = SQL str “Order by ProductName”
      Set myqdf = dbs Create QueryDef (“NewProducts”, SQL str)

      Связь с другими приложениями Windows
      VB   позволяет   использовать   многозадачность   Windows,    позволяя
активировать любое из заданных приложений, либо  посылать  напрямую  команды
активному приложению из проекта VB.  Обмен  информацией  между  приложениями
Windows средствами VB осуществляется одним из трех способов:
      1) использование буфера обмена Clipboard;
      2) технологии DDE - динамический обмен данных;
      3) технологии OLE - связывание и встраивание объектов.

      Буфер обмена
      Буфер обмена позволяет обмениваться текстовыми и графическими  данными
между несколькими приложениями с помощью операций вырезки - вставки.
      Методы объекта Clipboard
      Метод  Clear  -  очищает  буфер  обмена  перед   его   использованием,
Clipboard.Clear
      Метод  SetText  -  посылает  текстовую  информацию,   содержащуюся   в
строковой переменной или  строковом  выражении  в  буфер,  уничтожая  старую
информацию.
      Clipboard.SetText.StringData
      Метод GetText - возвращает копию текста, хранящегося в  буфере  обмена
(операция вставки). Этот метод используется как обычная функция:
      txtUser.SelText= Clipboard.GetText( ) - вставляет содержимое буфера  в
текстовое поле.
      При работе с буфером  обмена  и  полями  ввода  используются  операции
выделения текста. Выделенному тексту присущи три свойства:
      SelStart - номер позиции текста, с которой начинается выделение.
      txt.User.SelStart = 0 - выделение текста с начала поля ввода.
      SelLength - количество символов в выделенном фрагменте текста.
      txtUser. SelLength = Len (txt.User.Text) - выделены все  символы  поля
ввода.
      SelText - выделенный фрагмент текста. Если текст не выделен, то = “ “
      A$ =  txtUser.SelText  -  переменная  A$  примет  значение  выделенной
строки.
      Пример. Процедура копирования в буфер выделенного текста
      Private Sub Copy_Click ()
        Clipboard.SetText txtUser.SelText
      Enb Sub
      Операция вырезать:
      Private Sub Cut_Click
        Clipboard.SetText txtUser.SelText
        txtUser.SelText = “ ”
      Enb Sub
      Операция вставки:
      Private Sub Paste_Click
        txtUser.Text = Clipboard.GetText( )
      Enb Sub



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

|Символьные константы         |Значение    |Формат                     |
|VbCFText                     |1           |текст .txt                 |
|VbCFBitmap                   |2           |побитовое изображение .bmp |
|VbCFMetafile                 |3           |побитовое изображение .wmf |
|VbCFDib                      |8           |побитовое изображение .dib |
|VbCFPalette                  |9           |цветовая палитра           |


      Можно узнать тип данных в буфере с помощью метода GetFormat:
      Clipboard GetFormat (Format %), где Format % - значение или  константа
из  таблицы.  Возвращает  значение  True,  если  данные  из   буфера   имеют
соответствующий формат.
      If  Clipboard.GetFormat (2) Then MsgBox “Побитовое изображение”.
      Для получения изображения из буфера используется метод GetData:
      Clipboard. GetData (Format %), где Format %

      Пример.
      If Clipboard. GetFormat (VbCFText) Then
        txtUser.Text = Clipboard.GetText ( )
      Else If Clipboard.GetFormat (VbCFBitmap) Then
        pic My.Picture = Clipboard. GetData(VbCFBitmap)
      Else If Clipboard.GetFormat (VbCFMetafile) Then
        pic My.Picture = Clipboard. GetData(VbCFMetafile)
      Else If Clipboard.GetFormat (VbCFDib) Then
        pic My.Picture = Clipboard. GetData(VbCFDib)
      Else MsgBox “Не определн графический объект”
      End If
      Копирование изображения из графического окна в буфер обмена в  формате
побитового изображения:
      Private Sub PictureCopy_Click( )
        Clipboard.Clear
        Clipboard.SetData Pic.My.Picture,2

      DDE
      При  использовании  метода  DDE  одно  приложение   Windows   (клиент)
запрашивает у другого приложения (сервера) какую-либо информацию. Для  VB  в
качестве сервера может выступать текстовая  форма, а  клиентами  могут  быть
поля ввода, графические окна или  надписи.  Однако  элементы  управления  на
форме могут также передавать  информацию  с  помощью  своих  свойств.  Любое
приложение  может  выступать  одновременно  и  как  клиент  и  как   сервер:
Excel(VB(WinWord.
      Для установки  связи  нужно  знать  имя  соответствующего  приложения,
например, WinWord, Excel,  имя  DDE  для  формы  VB  соответствующего  имени
исполняемого  файла,  либо  имени  проекта  без  расширения,  если  в  среде
разработки.
      Кроме того, задается предмет  DDE-связи,  в  частности,  специфические
имена файлов. Например для Excel это .xls и .xle.
      И третье, указывается, какая информация передается  -  элемент  данных
DDE-связи. Например для Excel-сервера DDE элементом данных будет ячейка  ...
Для VB как сервера DDE элементом данных будут графические окна, поля  ввода,
надписи.

      Свойства DDE.
      LinkTopic формат: имя сервера \ имя приложения, например
      Excel\ C:\ EXCEL\ Sheet1.xls
      Можно  устанавливать  значение  этого   свойства   для   поля   ввода,
графического окна, надписи. Изменение значения свойства приводит к  закрытию
всех  связей  с  данным  приложением.   Это   позволяет   приложению-клиенту
переключаться на другие  объекты.
      LinkItem - определяет конкретные данные, которые будут передаваться от
сервера к  клиенту.  Например,  содержание  ячейки  первого  столбца  первой
строки листа Excel Ric1/
      Синтаксис: [имя формы, ] имя элемента управления.LinkItem = Item $
Item $ - строкове выражение, которое определяет элемент данных сервера.
      LinkMode - режимя связи: LinkMode = 1 - горячая связь, LinkMode = 2  -
холодная связь, LinkMode = 0 нет (связь разрывается)
      Горячая связь - сервер посылает данные, содержащиеся в элементе  связи
DDE, когда эти данные изменяются в  приложении-сервере;  холодная  -  клиент
должен требовать новой передачи данных.

      События DDE
      LinkOpen - генерируется всякий раз при установлении  связи  (например,
информация пользователю)
      Private Sub picMy_LinkOpen (Cancel As Integer)
          M$ = “DDE связь установлена с” + PicMy.LinkTopic “поданным”+
          M$ = M$ + PicMy.LinkItem
          MsgBox
      End Sub
      LinkClose - завершение сеанса DDE;
      для формы -  Private Sub frmMy_LinkClose( ),
      для элемента управления Private Sub txtMy_LinkClose(Index As Integer)
      LinkExecute  -  если  клиенту  необходима  какая-либо  информация   от
сервера, когда клиент посылает команду серверу.
      Private Sub Form_LinkExcecute(Command As String,  As Integer )
      LinkError - для обработки ошибок в сеансе связи
      Private Sub FormMy_LinkError(LinkErr As Integer )

      Методы DDE
      LinkExecute - для посылки команд серверу DDE
      элемент управления.LinkExecute Командная строка
      LinkPoke -  пересылка  содержимого  любого  элемента  управления  DDE-
клиента серверу.
      Например, txtMy.LinkPoke (посылает содержание .Text)
      LinkRequest - посылка запроса DDE-серверу.
      LinkMode = 2
      txtMy.LinkRequest - запрос на пересылку информации в свойство Text
      LinkSend - если форма выступает в качестве  DDE-сервера  и  необходимо
послать содержание окна изображения.
      picMy.LinkSend (при внесении существенных изменений в изображении).


      OLE
      OLE,  сокращение  от  object  linking  and  embedding  (связывание   и
встраивание объектов), сначала рассматривалась как  технология,  дополняющая
и расширяющая динамический обмен данными DDE. Впоследствии она  далеко  ушла
от  своего  начального  предназначения.  В  частности,  сейчас  этот  термин
рассматривается отдельно от других и имеет собственное предназначение.
      Одним из отличий  OLE  от  DDE  является  то,  что  переданный  объект
полностью сохраняет свой внешний вид  и  свойства,  которыми  он  обладал  в
создавшем  его  приложении.  Т.е.  электронные  таблицы  представляются  как
электронные таблицы, текстовые документы выглядят так же, как они  выглядели
в текстовом  процессоре  и  т.д.  После  того  как  в  проект  Visual  Basic
добавляется  контейнерный  элемент  OLE,  по  сути  дела   создается   мост,
связывающий пользователя  с  другим  приложением  Windows,  и  этот  элемент
выглядит точно так же, как он выглядел в другом приложении.
      При работе с OLE первым  и  самым  важным  понятием  является  объект.
Объект представляет собой данные, которые поставляются приложением  Windows,
поддерживающим OLE, например, для Excel  это  электронная  таблица  (или  ее
часть). Для работы с объектами OLE необходимо использовать  переменные  типа
Object (см. главу II), а для передачи информации в эти объекты  используется
тип данных Variant.
      Для понимания смысла  связывания  представим  себе  группу,  совместно
работающую над  этой  книгой.  Кроме  автора,  в  работе  принимают  участие
технический  редактор,  помощник  редактора,  корректор  и  многие   другие.
Наиболее эффективным способом работы  над  книгой  для  такой  группы  будет
использование  единого  экземпляра   документа   с   возможностью   внесения
изменений в текст книги  каждым  участником  рабочей  группы.  Заметим,  что
необходимо использовать  один  экземпляр  книги  (например,  на  центральном
сервере); в этом случае группе не придется беспокоиться о том, что  какие-то
важные исправления будут  пропущены.  (Выражаясь  на  жаргонном  языке,  это
позволяет работать  в  большей  степени  параллельно,  чем  последовательно,
нескольким участникам группы.)  В  случае  со  связанными  объектами  данные
остаются  в  приложении,  которое  их  создало.  Представим   себе   процесс
связывания как прикрепление связи к уже существующим данным. Технически  при
связывании в приложение Visual  Basic  вставляется  значок,  указывающий  на
связь, а изображение данных cохраняется в элементе управления OLE.
      Идея встраивания находит применение  в  том  случае,  когда  создается
документ, объединяющий различные  приложения  Windows  "под  одной  крышей".
Встраивание в OLE позволяет  пользовательским  элементам  встраивать  внутрь
себя данные. Когда Visual Basic  обращается  к  управляющему  элементу  OLE,
элемент переключается обратно в приложение, в котором  он  был  создан,  что
позволяет использовать  возможности  "родного"  приложения  для  внесения  в
элемент необходимых изменений.
      Одной из основных задач, возложенных фирмой  Microsoft  на  технологию
OLE,  являлось  разрушение  у   пользователей   стереотипов,   при   которых
приложение  рассматривалось  в  качестве   важнейшей   составляющей   работы
пользователя.  Вместо  этого  на  первое  место  было   поставлено   понятие
документа.  Например,  предположим,  что  разрабатывается   сложный   отчет,
включающий в себя табличные данные и графические объекты. При этом надо  при
работе с одной из частей документа  использовать  текстовый  редактор,  а  с
другой  -  систему  управления  электронными  таблицами.  При  использовании
технологии OLE другое приложение временно получает управление при работе  со
специфическими данными, встроенными в элемент  управления.  При  встраивании
объекта в клиентский управляющий элемент OLE ни одно  другое  приложение  не
может получить доступ к этим данным (напротив, в  случае  связывания  другие
приложения могут получить доступ к этим  данным).  Более  того,  приложение,
которое создало встроенные данные, будет  автоматически  запускаться  в  тот
момент, когда пользователь начнет работу с этими данными.
      Другая часть  OLE,  называемая  OLE  Automation,  позволяет  управлять
другим приложением. Несомненно также  и  то,  что  приложения  Visual  Basic
могут управляться из других приложений.  Например,  из  Visual  Basic  можно
управлять приложением Excel, используя его встроенную  версию  языка  Visual
Basic, или можно управлять редактором Word, опять же используя встроенную  в
него версию Visual Basic. (В системе Office'97 присутствует  унифицированная
версия языка для всех его приложений, которая основывается на  Visual  Basic
for Application Version 5.0.)
      И, наконец, необходимо отметить, что в настоящий момент  OLE  является
составной частью  более  общей  технологии,  которую  очень  часто  называют
COM/OLE (сокращение СОМ происходит от component  object  model).  Суть  идеи
основывается на важности понятия объекта для современного  программирования.
В 90-х годах стало ясно, что все большее количество людей считает  пересылку
объектов по  сети  Internet  достаточно  легким  делом,  поэтому  они  вовсю
выступают за  политику,  которую  можно  условно  назвать  "объекты  везде".
Использование COM/OLE представляется достаточно удобным  способом  пересылки
объектов по сети и даже, в скором времени, между различными платформами.


      Использование OLE
      Когда пользователь  добавляет  клиентский  элемент  управления  OLE  в
проект Visual Basic, фактически создается то, что фирма  Microsoft  называет
составным документом OLE (OLE compound document). (При создании  клиентского
элемента управления Visual Basic  выводит  на  экран  диалоговую  панель,  в
которой  запрашивается  имя  приложения,  объект   которого   предполагается
вставить.) Клиентский элемент управления OLE поставляется со всеми  версиями
Visual  Basic.  Его  значок  обычно  находится   в   нижней   части   панели
инструментов и представляет собой сетку с надписью "OLE" внутри.
      Точно так же, как  и  в  случае  с  DDE,  проект  Visual  Basic  может
выступать как в роли приложения-клиента (или контейнера),  которое  получает
информацию,  так  и  в  роли  приложения-сервера  (или  источника),  которое
посылает информацию. В большинстве  случаев  при  работе  с  OLE  приложение
Visual Basic получает информацию, т.е. выступает в  роли  клиента.  В  любом
случае  элемент  управления  OLE,  который  поставляется  с  Visual   Basic,
является клиентским элементом управления и не  позволяет  приложению  Visual
Basic выступать в роли OLE-сервера (хотя Visual  Basic  5.0  позволяет  это:
все, что необходимо, это написать код или свой собственный элемент,  который
будет выступать в роли OLE-сервера).


      Создание OLE-объектов
      Как уже было отмечено ранее, OLE-объект представляет собой  данные,  с
которыми может работать элемент управления OLE. Это может  быть  графическая
диаграмма,  группа  ячеек,  вся  электронная  таблица  или  часть  документа
текстового  процессора.  Любое   приложение,   поддерживающее   OLE,   имеет
библиотеку  объектов,  каждый  из  которых  может   быть   "отдан"   другому
приложению. (Слово "отдан" является жаргонным  и  означает  следующее:  "вот
вещь, с которой можно работать. Кроме того, можно работать с ней  следующими
установленными  путями:  ...")  Перед  тем  как  приступить  к   дальнейшему
описанию технологии ОLE, необходимо  дать  определение  следующему  термину:
класс OLE (OLE-class). Это  приложение,  которое  предоставляет  OLE-объект.
Любое  приложение,  поддерживающее  технологию  OLE,  имеет  уникальное  имя
класса  OLE,  например,  "WordDocument"  или  "ExcelWorksheet".  (Необходимо
отметить,  что  в  названии  класса  учитывается  регистр  символов.)  Можно
получить список доступных имен  классов,  нажав  на  изображение  эллипса  в
свойстве Class в окне Properties для управляющего элемента OLE.
      Существует четыре способа создания объектов  OLE.  Простейшим  из  них
является:

      Встроить или установить связь с объектом  для  контейнерного  элемента
      OLE. Такой  способ  позволяет  изменять  объекты  на  форме  во  время
      выполнения приложения и просто добавлять связанные объекты.

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


      Создание OLE-объекта при помощи панели инструментов

      Для добавления OLE-объекта к панели инструментов необходимо  выполнить
следующие шаги:

      1. Выбрать Project\Components и перейти к закладке Insertable Objects.


      2. Установить необходимый флажок типа объекта в появившейся диалоговой
        панели.
      Например, можно добавить объект Excel Worksheet в панель инструментов,
заполнив диалоговую панель Insertable Objects так, как показано на  рисунке
справа.
      Теперь, при применении выбранного инструмента к форме  соответствующий
объект автоматически встраивается в приложение.


      Доступ к объектам через пункт меню Project|References
      Большинство  современных  OLE-компонентов  приложений  доступно  через
диалоговую панель, появляющуюся при вызове пункта меню  Project|References.
Эти библиотеки объектов очень полезны, так как они содержат  описания  всех
объектов, методов и свойств, которые можно просмотреть  при  помощи  Object
Browser. Более того, всегда оказывается доступной справочная информация  по
используемым форматам команд из Object  Browser.  Например,  если  добавить
подобным  способом  библиотеку  объектов  Excel  в  Visual  Basic  и  затем
использовать Object Browser  для  ее  изучения,  то  можно  одним  взглядом
определить необходимый синтаксис.
      После того, как установлена ссылка на библиотеку объектов  при  помощи
диалоговой  панели  ProjectIReferences,  можно   воспользоваться   функцией
CreateObject  с  предварительно  определенной  объектной   переменной   для
создания такого объекта в коде программы. Ниже  приведен  пример  кода  для
объекта электронной таблицы Excel:

      Dim objExcel As Object

      Set objExcel = CreateObject ("EXCEL.SHEET")

      Приведенные выше две строки кода создают объектную переменную (в нашем
случае она  имеет  имя  objExcel).  Эта  объектная  переменная  может  быть
использована для управления электронной таблицей Excel.


      Создание объектов, которые не поддерживаются библиотекой объектов
      Библиотеки объектов не поддерживают  некоторых  объектов  (таких,  как
Word 6.0); хотя они и поддерживают технологию OLE, однако их поведение  еще
недостаточно удовлетворительно. В частности, приложения, не  поддерживающие
библиотеки объектов, могут не давать информацию об объектах, их  методах  и
свойствах. В таких случаях необходимо использовать функцию CreateObject для
создания ссылки на объект. Например:

      Dim objWordBasic As Object

      Set objWordBasic = CreateObject ("Word.Basic")

    (He надо забывать установить объектную переменную в значение Nothing
                          после ее использования.)


      Использование OLE в процессе разработки приложения
      По сравнению с OLE 1.0 создание  связей  или  встраиваний  в  процессе
разработки приложения стало намного проще. По существу,  необходимо  только
поработать с диалоговыми панелями, которые будут описаны в этом разделе.
      После того, как пользователь добавит клиентский элемент управления OLE
в форму, немедленно появится  диалоговая  панель.  (Чем  больше  приложений
установлено на компьютере, тем  больше  элементов  будет  видно.)  На  этой
панели приведены названия всех приложений Windows, объекты из которых можно
встроить в свое приложение. Можно иметь объекты, изображаемые значком,  или
же с видимыми данными в  элементе  управления  OLE.  Для  этого  необходимо
установить флажок Display as Icon в правой  части  диалоговой  панели.  Два
переключателя  в  левой  части  панели  предназначены  для  указания  того,
предполагается  ли  работать   с   файлами,   созданными   соответствующими
приложениями (связанные объекты) или требуется  вызвать  другое  приложение
для создания нового объекта  (встраиваемые  объекты).  Если  выбрать  опцию
Create from File ( для создания связи с объектом, хранящимся в  файле),  то
на экране появится панель. Можно щелкнуть по  кнопке  Browse  для  открытия
диалоговой панели, позволяющей выбрать необходимый файл.  После  того,  как
будут сделаны все необходимые действия, не надо забывать  проверить  флажок
Link.

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


      Меню Paste Special
      Иногда  бывает  необходимо  установить  связь  или  встроить   объект,
используя информацию, хранящуюся  в  буфере  папки  обмена  Windows,  путем
установки  свойств  SourceDoc  и  Sourceltem.  Для   этого   сперва   нужно
скопировать данные из приложения в  буфер  папки  обмена,  воспользовавшись
находящейся в приложении командой Copy. После  этого  следует  использовать
диалоговую  панель  Paste  Special,  которая  всегда  доступна   во   время
разработки приложения при нажатии правой кнопки  мышки,  при  условии,  что
фокус находится на элементе управления OLE. В появившемся всплывающем  меню
надо выбрать пункт Paste Special. Диалоговая панель автоматически  проверит
содержимое буфера папки обмена для установки соответствующих свойств OLE.

      Совет: Контекстное меню контейнерного элемента управления OLE содержит
      много полезных пунктов, поэтому следует отнестись к нему с вниманием.

      Свойства OLE
      Как наверное, читателю уже ясно, диалоговая панель дает  простой  путь
для установки свойств управляющего элемента OLE. Можно  их  изменять  также
при помощи окна Properties или через код. (Это обязательно должно  делаться
через  код,  если  работа  с  элементами  OLE  идет  во  время   выполнения
приложения).
      Свойство SizeMode позволяет устанавливать, как будет выглядеть элемент
управления во время выполнения программы. Если надо  растянуть  изображение
по размерам управляющего элемента OLE, следует  установить  значение  этого
свойства в I (vbOLESizeStretch). И, наконец, можно указать элементу,  чтобы
он автоматически изменял свои размеры,  установив  значение  свойства  в  2
(vbOLESizeAutoSize).
      Появляющаяся   диалоговая   панель   также   позволяет   устанавливать
определяющее свойство Class, которое указывает  на  приложение,  содержащее
данные.  Свойство  OLETypeAction  определяет  тип  объекта,  который  будет
создаваться, т.е. будет ли он связанным, встроенным  или  и  тем  и  другим
одновременно. Свойство SourceDoc содержит имя связанного объекта или файла,
использующегося  в  качестве  шаблона  для  встроенного  объекта.  Свойство
Sourceltem используется только для связанных объектов и указывает ту  часть
связанного документа приложения Visual Basic, которое будет с ним работать.
(Например,  любая  часть  электронной  таблицы  может  быть  задана   путем
установки этого свойства в значение типа "R1C1 :R1C10".)

Общие методы OLE-контейнера
      И,  наконец,  существует  ряд  важных  методов,  которые  могут   быть
применены с контейнерными элементами управления  OLE  и  которые  позволяют
точно указать  действия,  которые  необходимо  произвести  с  OLE-объектом.
Требуется ли обновить объект, создать или удалить его, сохранить информацию
объекта в файле, считать ее из файла и  многое  другое.  Далее  мы  вкратце
расскажем о наиболее общих методах работы с OLE-объектами.
      CreateEmbed. Этот метод создает встроенный OLE-объект.  Чтобы  сделать
это,  сперва  необходимо  установить  (через  диалоговую  панель  OLE   или
посредством кода)  оба  свойства  Class  и  OleTypeAllowed.  Напомним,  что
свойство OleTypeAllowed равно 0 для связывания, равно 1 для встраивания и 2
- для того и другого. Свойство Class устанавливает  тип  OLE-объекта.  (Имя
класса доступно из диалоговой панели OLE или через окно  Properties.  Можно
использовать  свойство  OLEType  для  определения  типа  связи   во   время
выполнения  приложения.)  При  создании  нового   встроенного   OLE-объекта
необходимо, чтобы приложение, в котором он будет создаваться, было активным
(для этого можно использовать  инструкцию  AppActivate)  или  путь  к  нему
должен быть известен системе.
      CreateLink. Создает связанный OLE-объект из существующего  файла.  Для
этого сперва надо установить свойства OleTypeAllowed и  SourceDoc.  В  этом
случае OleType Allowed  может  быть  равным  0  (связанный  объект)  или  2
(связанный и встроенный объект).
      Свойство SourceDoc содержит имя файла  для  связанного  объекта.  Если
надо работать  только  с  частью  связанного  объекта,  следует  установить
соответствующим образом свойство Sourceltem.
      Точно так же, как и в случае  со  встраиванием  документа,  приложение
должно быть активным или же его путь должен быть известен системе.
      Copy. Этот метод пересылает все данные и свойства связанного объекта в
буфер папки обмена Windows. Как  связанная,  так  и  встроенная  информация
может быть скопирована в буфер папки обмена.
      Paste. Копирует данные из буфера папки  обмена  в  элемент  управления
OLE. Не надо забывать установить свойство PasteOK элемента управления.
      Update. Это очень важный метод, так как именно он передает  данные  из
приложения в элемент управления OLE.
      Do  Verb.  Этот  метод  позволяет  управлять  OLE-объектом.  Для   его
использования  необходимо  передать  параметр   Verb,   который   указывает
действие, которое надо произвести над объектом.

      Примечание: Если установить значение  свойства  AutoActivate  элемента
      управления в double-click  (значение=2),  то  элемент  управления  OLE
      автоматически будет активизировать  текущий  объект  после  того,  как
      пользователь  дважды  щелкнет  по   нему   мышкой.   Если   приложение
      поддерживает  "In  Place  Activation",  то  можно  сделать  так,   что
      приложение будет активизироваться всякий раз, когда элемент управления
      OLE  будет  получать  фокус  (для  этого  надо   установить   значение
      AutoActivate в 1).

      Close. Для OLE-объектов. Этот метод используется только для встроенных
объектов, так как он закрывает OLE-объект и прекращает связь с приложением,
которое отвечает за объект.
      Delete. Этот метод следует использовать для удаления объекта.  Объекты
OLE автоматически удаляются при закрытии формы.
      SaveToFile. Этот метод жизненно важен для встроенных объектов OLE. Так
как данные управляющего элемента OLE принадлежат только самому OLE-объекту,
то  они  могут  быть  потеряны,  если  не  написать  соответствующий   код,
использующий метод SaveToFile.
      ReadFromFile. Этот метод считывает данные объекта из файла после того,
как они  были  там  сохранены  методом  SaveToFile.  Код,  необходимый  для
использования этого метода, похож на код,  предназначенный  для  сохранения
данных в файле при помощи метода SaveToFile.
      InsertObjDlg. При вызове этого  метода  появляется  диалоговая  панель
InsertObject, которую Visual Basic использует при помещении OLE-объекта  на
форму. Во время выполнения приложения можно  использовать  этот  метод  для
обеспечения пользователю простого способа создания связанных  и  встроенных
объектов.
      PasteSpecialDlg. Этот метод вызывает на экран диалоговую панель  Paste
Special.  Во  время  выполнения  приложения  эта  диалоговая  панель   дает
пользователю возможность вставлять объекты из буфера папки обмена Windows.
      Fetch   Verbs.   Используется   для   получения    списка    действий,
поддерживаемых приложением.
      SaveToOLEIFile.  Этот  метод  следует  использовать  для   обеспечения
обратной совместимости с предыдущими версиями OLE.

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

      Использование OLE Automation
      Как уже было показано раньше, можно создать ссылку на  объект  в  коде
программы при помощи ключевого слова New, CreateObject  или  GetObject  без
обращения к OLE-серверу, создавшему объект. Объекты таких  приложений,  как
Microsoft Word и Microsoft Excel, могут использоваться в  качестве  примера
типов объектов. Некоторые вспомогательные объекты,  как,  например,  ячейка
электронной таблицы Excel, могут быть доступными только через методы  более
высокоуровневых объектов.
      Например,  перейдем  к  пункту   ProjectIProperties,   затем   выберем
библиотеку объектов Excel для доступа к  ним  через  Visual  Basic.  Теперь
добавим к форме поле ввода.  Теперь  можно  написать  код  OLE  Automation,
который будет заполнять ячейки из второго столбца электронной таблицы Excel
последовательными значениями, после чего эти значения будут просуммированы,
а результирующее значение будет помещено  в  поле  ввода  на  форме  Visual
Basic:

      Private Sub Form_Ciick()

           Dim obj Excel As Object

           Set obj Excel = CreateObject ("EXCEL .SHEET")

           objExcel .Application .Visible = True

           For I = I To 10

                 objExcel.Cellsd, 2).Value = I

           Next I

           objExcel. Cells (11, 2) .Formula = "=sum(BI.-BIG)"

           Textl.Text=objExcel.Cells(ll, 2)

           objExcel .Application.Quit

           Set objExcel = Nothing
      End Sub

          И напоследок дадим несколько замечаний:

       * OLE Automation требует определенного уровня знакомства с  объектами
         приложения,  с  которым  надо  работать.  При  этом   очень   часто
         используется хитроумный синтаксис.  (В  этом  деле  Object  Browser
         поможет сэкономить много времени.)
       *  На  Pentium  90  с  16  мегабайтами  ОЗУ  представленный  фрагмент
         программы выполняется примерно 0,6 секунды. А на Pentium 166  с  80
         мегабайтами ОЗУ этот фрагмент выполняется практически мгновенно. Из
         этого легко сделать вывод, что для действительно быстрой работы OLE
         Automation необходим быстрый процессор и большой размер  памяти  на
         компьютере.
       * В предыдущем пункте было показано, что хотя OLE Automation является
         действительно очень мощной технологией,  она  требует  значительных
         ресурсов для быстрого выполнения. Поэтому следует очень  четко  все
         обдумать перед  тем,  как  использовать  OLE  Automation  в  работе
         приложения.
       * Для определения типа  аппаратного  обеспечения  можно  использовать
         вызовы функций Windows API. При этом  большее  внимание  необходимо
         уделить объему установленной памяти, чем типу  и  тактовой  частоте
         процессора. Не стоит и пытаться использовать OLE  Automation,  если
         на  компьютере  пользователя  установлено  4  мегабайта  памяти,  и
         следует   хорошенько   подумать,   прежде    чем    воспользоваться
         возможностями  OLE  Automation  на  машине  с  8  мегабайтами.  OLE
         Automation  требует  для  нормальной  работы,  как   минил1ум,   16
         мегабайт, хотя  предпочтительнее  использовать  эту  технологию  на
         машинах с 32 и более мегабайтами ОЗУ.