Visual Basic

Обмен данными

Разбить на страницы
Показывать лекцию целиком

Продукты корпорации Microsoft поддерживают протокол динамического обмена данными - DDE (протокол - правила при коммуникациях). С использованием папки обмена CLIPBRD.EXE выполняются DDE-связи в компьютерной сети (стартует сетевая DDE-служба), при этом данные должны быть сделаны доступными - должен быть реализован общий доступ. В процессе обмена данными устанавливаются связи между папками обмена удалeнных компьютеров; данные буфера обмена должны находиться на страницах папки обмена. Такая связь может быть реализована и средствами Visual Basic. Приложения могут выполнять как роль клиента, запрашивающего и принимающего данные, так и роль сервера - источника данных.

Технология обмена данными между приложениями развита до такого уровня, что данные не нужно заново копировать - они после их изменения автоматически передаются через DDE-связь. OLE - следующий этап разработок в области обмена данных. Это технология связи программ, обеспечивающая приложениям совместное использование данных. Технология OLE поддерживается с помощью внедрённых и связанных объектов. Развитие OLE - это технология ActiveX.

DDE

Рассмотрим примеры использования Microsoft Access в роли сервера DDE для приложения-клиента, запрашивающего и принимающего даные по каналу связи DDE. Сеанс связи начинается с открытия канала связи; при этом используется функция DDEInitiate, в аргументе которой перечисляются: имя приложения (база данных Access), имя файла базы данных, имя таблицы; пример: intChan1 = DDEInitiate("MSAccess", "C:\Winnt\Profiles\Administrator\dde6;TABLE dde1")

После этого становится возможной передача данных в другое приложение по этому каналу. Для передачи требования на пересылку, например, текстовых данных из приложения-сервера по открытому каналу DDE используется функция DDERequest, в аргументе которой указывается номер канала связи и сформулирован запрос, пример: strResp1 = DDERequest(intChan1, "All"). После окончания передачи данных нужно вызвать в приложении-клиенте функцию DDETerminate для закрытия текущего канала обмена или функцию DDETerminateAll для закрытия всех каналов связи.

Практическая работа 40. DDE

40а. DDE. Простейший пример обмена данными

Задание: записать в файл результат запроса к данным таблицы базы данных (Access).

Порядок выполнения:

  • создать базу данных (здесь - dde6), таблицу (здесь - dde1), сделать запрос, закрыть приложение Access,
  • создать макрос в приложении Word, код макроса дан ниже,
  • стартовать макроc; в результате его выполнения стартует закрытое ранее приложение Access,
  • открыть файл dde61.txt (в редакторе Блокнот).
  • Sub dde6()' макрос в приложении Word,
    Dim intChan1 As Integer ' канал связи
    Dim strResp1 As Variant ' требование на запрос
    ' открыть канал связи
    intChan1 = DDEInitiate("MSAccess",_
    "C:\Winnt\Profiles\Administrator\dde6;TABLE dde1")
    strResp1 = DDERequest(intChan1, "All") ' требование на запрос
    DDETerminate intChan1 ' закрыть текущий канал связи
    Open "dde61.txt" For Output As #1 ' открыть файл для записи
    Write #1, strResp1 ' записать результат запроса
    Close #1 ' закрыть файл
    End Sub

    Содержимое полученного файла dde61.txt - это результат запроса ("All"): вывести всeсодержимое таблицы базы данных, рис. 6.1.

    (рис 6.1) Простейший пример DDE; данные, выводимые в файл

    40в. DDE

    Приводится аналогичный пример; создаются 4 таблицы: student, (рис. 6.2, рис. 6.3) stipendija, sessija, prikaz; выполняются 4 запроса (рис. 6.4, рис. 6.5), создается макрос в приложении Word (см. код, данный ниже), открываются 4 канала связи, результаты 4-х запросов по 4-м каналам связи выводятся в файлы dde621 - dde624. Пояснения к коду макроса:

  • All - вывести все данные из таблиц, включая имена полей,
  • FildNames,T - вывести список из 2-х строк, содержащий имена полей (первая строка) и их типы данных (вторая строка).
  • Sub dde62() ' макрос в приложении Word
    Dim intChan1 As Integer, intChan2 As Integer, intChan3 As Integer
    Dim intChan4 As Integer, strResp1 As Variant, strResp2 As Variant
    Dim strResp3 As Variant, strResp4 As Variant
    intChan1 = DDEInitiate("MSAccessquot;, quot;A:\nin;TABLE Studentquot;)
    intChan2 = DDEInitiate(quot;MSAccessquot;, quot;A:\nin;TABLE Stipendiumquot;)
    (рис 6.2) Таблица Pruefung (рис 6.3) Таблица Student (рис 6.4) Запрос (рис 6.5) Результат запроса
    intChan3 = DDEInitiate("MSAccess", "A:\nin;TABLE Pruefung")
    intChan4 = DDEInitiate("MSAccess", "A:\nin;QUERY Befehl")
    strResp1 = DDERequest(intChan1, "All")
    strResp2 = DDERequest(intChan2, "All")
    strResp3 = DDERequest(intChan3, "FieldNames;T")
    strResp4 = DDERequest(intChan4, "All")
    DDETerminate intChan1: DDETerminate intChan2
    DDETerminate intChan3: DDETerminate intChan4
    Open "dde621.txt" For Output As #1
    Write #1, strResp1
    Close #1
    Open "dde622.txt" For Output As #1
    Write #1, strResp2
    Close #1
    Open "dde623.txt" For Output As #1
    Write #1, strResp3
    Close #1
    Open "dde624.txt" For Output As #1
    Write #1, strResp4
    Close #1
    End Sub

    OLE

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

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

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

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

    Элемент управления OLE (панель элементов управления) используется для связывания /внедрения объектов в приложениях Visual Basic. Контекстное меню OLE содержит команды:

  • вырезать, копировать, вставить, удалить,
  • перенести
  • вставить объект (имеется список объектов для выбора и возможность выбора типа вставки),
  • специальная вставка - при выборе этой команды выводится диалоговое окно, где отображаются имеющиеся в наличии классы объектов. Имеется возможность сделать выбор - связь/внедрение; имеется возможность использования вместо объекта пиктограммы,
  • создать связь, создать внедренный объект.
  • Не все команды отображаются или являются доступными; это зависит от состояния приложения и буфера обмена. Некоторые параметры элемента управления OLE даны в табл. 6.1.

    Некоторые свойства, методы и события элемента управления OLE
    Свойства Пояснения
    Action Выполняемое действие. Недоступно во время разработки, возможны установочные значения в пределах 0 - 18; среди них: 0 - создаeт внедрeнный объект, 1 - создаeт связанный объект, 7 - открывает объект, 15 - отображает окно Специальная вставка, 18 - сохраняет OLE и т.д. Некоторые действия Action реализованы как методы
    AutoActivate Определяет когда активизируется объект (после двойного щелчка, после получения фокуса и т.д.)
    AutoVerbMenu Должно ли выводиться контекстное меню
    Class Идентифицирует приложение, которое создаeт OLE-объект (например, Word)
    HostName Содержит имя приложения, создавшего объект
    ObjectVerbs Список команд, применимых к OLE-объекту
    ObjectVerbsCount Количество таких команд (см. выше)
    OLEType Возвращает состояние OLE-объекта в контейнере: связанный/внедрeнный
    OLETypeAllowed Задание связывания, внедрения или обоих
    SizeMode Возвращает и задаeт режим согласования размеров элемента управления OLE и загружаемого в него объекта
    SourceDoc Имя файла, где находится объект (или который должен быть загружен в OLE-контейнер)
    SourceItem Указывает на данные объекта, которые будут связаны
    Verb Определяет вид действия, которое будет выполнено при активизации объекта с помощью свойства Action
    UpdateOptions Когда содержимое объекта OLE может быть обновлено
    Методы
    Close Закрыть объект, завершить связывание с приложением, где он был создан
    Copy Копирование из контейнера OLE в буфер обмена
    CreateEmbed Внедрение объекта в OLE-контейнер. CreateEmbed (Action = 0) создает внедренный объект, CreateLink (Action = 1) создает cвязанный объект
    CreateLink Создание связываемого объекта, пользуясь содержимым заданного файла
    Delete Удалить объект
    DoVerb Открыть объект для выполнения над ним одного из действий
    Paste Вставить объект в OLE-контейнер из буфера обмена
    Updаte Обновление объекта в OLE-контейнере (на основании данных приложения, посредством которого объект редактируется)
    События
    ObjectMove Происходит после изменений размеров или перемещения объекта, бывшего в OLE-контейнере
    Updated Происходит после изменения данных в объекте

    Приложение OLE-сервер определяет множество операций (команд), которые могут выполняться над поставляемым им объектом. Каждый объект поддерживает собственный набор команд. Этот набор может изменяться во время работы приложения. OLE-объект получает список команд от приложения-сервера и доступ к этому списку команд осуществляет через свои свойства ( AutoVerbMenu, Verb, ObjectVerbs, ObjectVerbsCount ). Эти свойства доступны во время выполнения.

    Практическая работа 41. OLE

    41а. Элементарная операция OLE

    Последовательность действий:

  • Создать на форме элемент управления OLE для создания, например, связанного объекта,
  • создать соответствующий файл, например, A:\ole1.xls (см. код, данный ниже),
  • ввести код, данный ниже,
  • стартовать проект, сделать щелчок на форме, наблюдать результат.
  • Private Sub Form_Click()
    OLE1.Class = "Worksheet" ' приложение Excel
    OLE1.SourceDoc = "A:\ole1.xls" ' имя файла
    ' использовать указанный блок данных
    OLE1.SourceItem = "A1A3:B1B3" 
    OLE1.Action = 1 ' создать связанный объект
    End Sub

    41в. OLE

    Рассматривается загрузка объектов (см. процедуру Form_Load () в OLE-контейнер и реализация (по желанию пользователя) связывания/внедрения (см. процедуру Public Sub LinkEmb(FileName As String, Embed As Boolean) ). Последовательность действий:

  • создать объекты: текстовый файл (приложение Word), таблицу (приложение Excel), базу данных (приложение Access), рисунок (приложение Paint),
  • создать на форме элемент управления OLE (Name = ole1), два переключателя (Name = opt1 и opt2 соответственно, Caption = Link и Embed cоответственно), командную кнопку (Name = cmd1, Caption = Load Object), поле списка (Name = lst), табл. 6.1.
  • ввести код данный ниже, стартовать проект,
  • маркировать в поле списка lst, элемент, например, "Docum.Word", сделать щелчок на требуемом переключателе (Link или Embedding), затем сделать щелчок на командной кнопке "Load Object". В поле элемента OLE выводится соответствующий файл,
  • сделать двойной щелчок в поле OLE на введeнном объекте.
  • В зависимости от того, какой переключатель использован (Link или Embed), вставленный объект выводится или в приложении Word для редактирования, или появляется возможность редактировать его средствами того приложения, в котором он находится. В случае Link внесeнные (пользователем) изменения остаются в исходном файле. Это можно проверить, загрузив файл в приложение Word.

    ' создать список объектов для загрузки в OLE-контейнер
    Private Sub Form_Load()
    With lst
    .AddItem ("Docum.Word")
    .AddItem ("Table.Excel")
    .AddItem ("Picture.Paint")
    .AddItem ("Database.Access")
    End With
    End Sub
    ' выбор загружаемого объекта (маркировать его в списке, см.:
    ' Select Case lst.ListIndex) и определение режима 
    ' связывание/внедрение с учётом состояния переключателей 
    Private Sub cmd1_Click()
    Select Case lst.ListIndex
    Case 0: LinkEmb "A:\nin.doc", opt1.Value
    Case 1: LinkEmb "A:\nin.xls", opt1.Value
    Case 2: LinkEmb "A:\nin.bmp", opt1.Value
    Case 3: LinkEmb "A:\nin.mdb", opt1.Value
    End Select
    End Sub
    ' в зависимости от значений переданных аргументов
    'реализовать связь/внедрение
    Public Sub LinkEmb(FileName As String, Embed As Boolean)
    If Embed Then
    ole1.CreateEmbed FileName
    Else
    ole1.CreateLink FileName
    End If
    End Sub

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

    Имеется возможность перетаскивать наборы данных (тексты, рисунки, таблицы, деревья файлов и т.д.) с применением OLE. При этом различают перемещение данных (после перемещения данные в источнике удаляют) и копирование данных. Для обеспечения перетаскивания действия (начало перетаскивания, сбрасывание) должны быть запрограммированы. Рассматриваются два объекта: источник - OLEDrag и приeмник - OLEDrop. В случае автоматического перетаскивания свойствам OLEDragMode, OLEDropMode элементов управления, например,

    (рис 6.6) OLE

    TextBox, Image должно быть присвоено значение vbOLEDragAutomatic (в окне свойств), альтернативно (ручное перетаскивание) - vbManual. Установки свойств OLEDragMode/OLEDropMode могут быть сделаны и программным путeм.

    Ниже рассматриваются параметры объекта DataObject, содержащего перетаскиваемые данные. Он фигурирует в процедурах обработки событий, в которые передаeтся параметр Data (см. код). Объект (аналогичен объекту Clipboard) имеет 4 метода:

  • SetData устанавливает данные в требуемом формате (vbCFText - текст, vbCFRTF расширенный текстовый формат, vbCFBitmap - растровое изображение vbCFFiles - список файлов и .т.д.),
  • GetFormat проверяет наличие данных в требуемом формате (сможет ли приeмник использовать данные),
  • Clear удаляет содержимое объекта,
  • GetData копирует данные в требуемом формате из DataObject в приeмник.
  • Ниже приводится перечень параметров элементов управления, обеспечивающих перетаскивание, затем даeтся практическая работа 42 для усвоения материала:

    Метод: OLEDrag - начать перетаскивание,

    Свойства: OLEDragMode/OLEDropMode - установить элемент управления в качестве источника/приeмника, OLEDropAllowed - установить разрешение сбрасывания OLE в контейнере.

    События: OLEDragDrop происходит при сбрасывании-OLE в контейнер OLE, синтаксис:

    Private Sub Object_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Singlе, y As Single). Здесь:

  • DataObject - см. выше,
  • Effect (действие) определяет предпринимаемые после завершения перетаскивания действия, см., например, процедуру: Private Sub Image1_OLEDragDrop(:),
  • Button определяет (нажатую при перетаскивании) кнопку мыши,
  • Shift определяет использование при перетаскивании клавиш Shift, Ctrl, Alt,
  • x, y - координаты курсора мыши.
  • OLEDragOver происходит при перемещении одного объекта над другим, OLEGiveFeedback происходит после события OLEDragOver ; может быть использовано для создания визуальных признаков действий, OLEStartDrag происходит или для источников с ручным режимом перетаскивания или при инициализации автоматического перетаскивания, OLESetData происходит для источника после применения приeмником метода GetData, OLECompleteDrag происходит после перемещения объекта из источника в приeмник.

    Практическая работа 42. Перетаскивание данных

    Последовательность действий:

  • присвоить свойству Picture обоих элементов управления Image значения - 2 любых имени файла с расширением .bmp, см. рис. 6.7
  • ввести код, данный ниже, стартовать проект,
  • перетащить мышью рисунок из первого элемента управления Image в приложение Word или WordPad (предварительно стартовать Word/WordPad),
  • при нажатой клавише CTRL скопировать перетаскиванием рисунок из второго элемента управления Image в Word. Затем из Word переместить объекты назад в поля элементов управления Image. Пояснения даны под комментариями в коде.
  • ' установить требуемый формат данных
    Private Sub Image1_OLEStartDrag(Data As DataObject, AllowedEffects As Long) 
    Data.SetData Image1.Picture, vbCFBitmap
    End Sub
    
    ' копировать/переместить в требуемом формате
    Private Sub Image1_OLEDragDrop(Data As DataObject, Effect As _
    Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Shift > 0 Then
    Effect = vbDropEffectCopy
    Else
    Effect = vbDropEffectMove
    End If
    Image1.Picture = Data.GetData(vbCFBitmap)
    End Sub
    
    Private Sub Image2_OLEStartDrag(Data As DataObject, AllowedEffects As Long)
    Data.SetData Image2.Picture, vbCFBitmap
    End Sub
    
    Private Sub Image2_OLEDragDrop(Data As DataObject, Effect As _
    Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Shift > 0 Then
    Effect = vbDropEffectCopy
    Else
    Effect = vbDropEffectMove
    End If
    Image2.Picture = Data.GetData(vbCFBitmap)
    End Sub
    (рис 6.7) Перетаскивание данных

    Программирование объектов; продолжение

    Программирование объектов обеспечивает приложениям возможность предоставлять свои объекты в распоряжение средств разработки и других приложений. Visul Basic позволяет проводить работу с объектами с помощью их (объектов) методов или установки/чтения их свойств, например:

    seinObjekt.Bold = True ' форматировать текст
    seinObjekt.SaveAs = "A:\txt.doc" ' сохранить текст

    при этом программируемый объект seinObjekt был заранее создан.

    Visual Basic позволяет создавать новые объекты и работать с имеющимися в приложениях Microsoft. Функции CreateObject/GetObject используются для создания нового объекта/получения существующего из другого приложения. Ключевое слово New используется для создания объекта некоторого класса, примеры:

    Set ExcelWorksheet = GetObject("SHEET5.XLS") - стартовать Excel и открыть лист уже существующий, Dim x As New Field - описание нового объекта.

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

    Практическая работа 43. Работа с объектом - экземпляр приложения Word: создание файла, запись текста и т.д.

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

    Последовательность действий:

  • создать ссылку на библиотеку объектов: Проект $$\to$$ Ссылки $$\to$$ Microsoft Word Object Library,
  • cоздать на форме командную кнопку (Name = cmd1) и текстовое поле (Name = txt1),
  • ввести код, данный ниже, пояснения даны под комментариями к коду, стартовать проект,
  • ввести в текстовое поле текст, сделать щелчок на командной кнопке,
  • для проверки работы проекта стартовать приложение Word, рис. 6.8
  • Private Sub cmd1_Click()
    Dim str As String ' описание переменной для работы с текстом 
    ' с использованием ключевого слова New создать объектную 
    ' переменную (ссылка проводится на объект Word.Application - 
    ' экземпляр приложения Word)
    Dim edi As New Word.Application 
    ' присвоить переменной значение: текст, 
    ' вводимый в текстовое ' поле
    str = txt1.Text 
    ' создать новый документ Word (Documents - дочерний 
    ' объект по отношению к объекту Word.Application)
    edi.Documents.Add 
    ' вставить в документ Word (метод Type) текст из
    ' текстового поля 
    edi.Selection.Type Text (str) 
    ' cохранить документ
    edi.ActiveDocument.SaveAs FileName:="A:\nnn.doc" 
    ' закрыть документ
    edi.ActiveDocument.Close 
    edi.Application.Quit ' закрыть приложение
    Set edi = Nothing ' очистить объектную переменную
    End Sub
    (рис 6.8) Работа с объектом - экземпляр приложения Word

    Практическая работа 44. Использование объектов Excel и Access: результаты SQL-запроса передать средствами языка программирования для дальнейшей математической обработки в Excel

  • Создать элементарный фрагмент базы данных, см. табл. 6.2 Подключить 3 библиотеки (для обеспечения работы с DAO, Access и Excel): Microsoft Excel 10.0 Object Library, Microsoft Access 10.0 Object Library, Microsoft DAO 3,51Object Library
    Анализ прибыли, фрагмент
    Kode Lad Jan Febr SumGes Proz
    1 Lad1 256 381 0 0,00%
    2 Lad2 786 982 0 0,00%
    3 Lad3 528 436 0 0,00%
    4 Sum 0 0 0
  • создать на форме (рис. 6.9) поле списка (Name = lst) свойству Microsoft присвоить значение, обеспечивающее возможность одновременной маркировки нескольких строк, 3 командных кнопки - cmd1 (Caption = Access), cmd2, Caption = Excel), cmdEnd, CommonDialog (Name = cdlg), cм. 6.2, (для обеспечения диалога с пользователем при передаче данных Access $$\to$$ Exсel), см. код процедуры Private Sub cmd2_Click(). Элемент управления CommonDialog не виден на рис. 6.9, т.к. там изображена форма после старта проекта,
  • ввести код, данный ниже, стартовать проект, сделать щелчок на кнопке Access - имена полей таблицы базы данных выводятся в поле списка lst, рис. 6.9,
  • в поле lst (на рис. 6.9 - Fields) маркировать поля, которые нужно передать в приложение Excel для дальнейшей математической обработки; далее сделать щелчок на кнопке Excel,
  • подтвердить желание сохранить файл: сделать щелчок на кнопке ОК в окне MsgBox, ввести имя файла - выводится сообщение о том, что данные Access сохранены на листе Exсel,
  • открыть этот файл с данными, просмотреть таблицу, рис. 6.9, сделать щелчок на кнопке End проекта. Пояснения даны под комментариями к коду.
  • ' Средствами DAO, см. процедуру cmd1_Click(), выполня-
    ' ется работа с таблицей nin2 базы данных nin1.mdb и 
    ' имена полей таблицы, (см. цикл For Next), заносятся в
    ' поле списка lst. Далее пользователь должен выбрать
    ' поля таблицы для переноса в приложение Excel
    Private Sub cmd1_Click()
    Dim ws As Workspace, db As Database 
    Dim tdef As TableDef, i As Integer
    lst.Clear
    Set ws = DBEngine.Workspaces(0)
    Set db = ws.OpenDatabase("A:\nin1.mdb")
    Set tdef = db.TableDefs("nin2")
    For i = 0 To tdef.Fields.Count - 1
    lst.AddItem tdef.Fields(i).Name
    Next i
    db.Close: ws.Close
    End Sub
    ' программируется передача таблицы из Access в Excel.
    ' Cначала объявляются новые объекты Excel, затем - DAO
    Private Sub cmd2_Click()
    ' объект Excel.Application содержит коллекцию Workbooks
    Dim xla As New Excel.Application 
    ' объект Workbook содержит коллекцию Worksheet
    Dim xlb As New Excel.Workbook 
    ' объект Worksheet содержит ячейки
    Dim xls As New Excel.Worksheet 
    ' объект Range - непрерывный набор ячеек
    Dim xlr As Excel.Range
    Dim ws As Workspace, db As Database, rs As Recordset 
    Dim i As Integer, j As Integer, k As Integer, rc As Integer
    Dim r As Integer, c As Integer
    ' описание массива полей таблицы базы данных, выделенных 
    ' пользователем в поле lst после старта проекта и 
    ' щелчка на кнопке Access
    Dim masFields() As String
    ' определить выделенные пользователем в поле списка 
    ' lst поля (таблицы базы данных) для переноса в Excel и
    ' определить размерность массива masFields() 
    ' для их (выделенных полей) хранения (ReDim - 
    ' изменить размерность массива)
    For i = 0 To lst.ListCount - 1
    If lst.Selected(i) = True Then j = j + 1
    Next i
    ReDim masFields(j - 1)
    ' занести данные в массив masFields(j) из поля
    ' списка (свойство ListCount содержит число 
    ' элементов списка)
    j = 0
    For i = 0 To lst.ListCount - 1
    If lst.Selected(i) = True Then masFields(j) = lst.List(i): j = j + 1
    Next i
    ' создать рабочее пространство, открыть базу данных
    Set ws = DBEngine.Workspaces(0)
    Set db = ws.OpenDatabase("A:\nin1")
    ' создать объекты Excel (экземпляр книги и листа) и 
    ' активизировать лист Excel
    Set xlb = xla.Workbooks.Add
    Set xls = xlb.Worksheets.Add
    xls.Activate
    ' в цикле For : Next перебрать выбранные пользователем и 
    ' занесeнные ранее в массив поля. Для каждого поля 
    ' формируется SQL-запрос. Далее просматривается 
    ' весь набор записей для определения количества 
    ' соответствующих записей
    For i = 0 To UBound(masFields)
    Set rs = db.OpenRecordset("SELECT nin2."  masFields(i)  " _
    FROM nin2")
    rs.MoveLast: rs.MoveFirst
    ' выбрать номера столбцов таблицы Excel, где будут 
    ' размещены выбранные данные. В первую строку поместить 
    ' названия полей. Ячейки первой строки делаются 
    ' объектом xlr и выделяются
    c = i + 1 
    xls.Cells(1, c) = masFields(i)
    Set xlr = xls.Cells(1, c)
    xlr.Select
    xlr.Font.Bold = True
    ' ограничить набор данных некоторым числом (например, 10) 
    If rs.RecordCount > 10 Then rc = 10 Else rc = rs.RecordCount
    ' в тот же столбец таблицы (аргумент с) перенести 
    ' все записи. Далее (цикл For i : Next i) - возврат к 
    ' началу цикла для перебора всех полей
    For r = 2 To rc + 1
    xls.Cells(r, c) = rs(masFields(i))
    rs.MoveNext
    Next r
    Next i
    ' сообщение пользователю о передаче данных в Excel; 
    ' вопрос о необходимости сохранения их в файле, ввод в 
    ' диалоговом режиме имени файла; сообщение о 
    ' сохранении/несохранении файла; закрыть объект - 
    ' приложение Excel. Синтаксис функции MsgBox дан
    ' после кода
    If MsgBox("I have transported the Access data "  "to an Excel." _
    vbCrLf  vbCrLf  "Do you want to save ?", vbQuestion  _
    vbYesNo) = vbYes Then
    cdlg.FileName = ""
    cdlg.ShowSave
    xls.SaveAs (cdlg.FileName)
    MsgBox "Data has been saved to file:"  vbCrLf  vbCrLf _
    cdlg.FileName, vbInformation, "Data has been saved"
    Else
    MsgBox "Data has not been saved!", vbCritical, "Data has not been saved!"
    End If
    xlb.Saved = True
    xla.Quit
    End Sub
    (рис 6.9) Передача данных Access - Excel, вид формы после старта проекта и результат на листе Excel

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

    (рис 6.10) Функция MsgBox. Диалоговое окно

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

    Упрощeнный синтаксис функции: MsgBox(Prompt[, Buttons][, Title]), здесь:

  • Prompt - сообщение пользователя в выводимом диалоговом окне, на рис. 6.10: A Happy New Millenniun !!!,
  • Buttons - константа, определяющая наличие в диалоговом окне кнопок/пикторгаммм, см. табл. 6.3
  • Title - текст заголовка диалогового окна, на рис. 6.10: MsgBox-Study.
  • Кнопки MsgBox()
    Константа Значение Описание
    vbOKOnly 0 Вывод кнопки ОК
    vbOKCancel 1 Вывод кнопок OK, Cancel
    vbAbortRetryIgnore 2 Вывод кнопок Abort, Retry, Ignore
    vbYesNoCancel 3 Вывод кнопок Yes, No, Cancel
    vbYesNo 4 Вывод кнопок Yes, No
    vbRetryCancel 5 Вывод кнопок Retry, Cancel,
    vbCritical 16 Вывод пиктограммы - критическое сообщение
    vbQuestion 32 Вывод пиктограммы - вопрос
    vbExclamation 48 Вывод пиктограммы - предупреждение
    vbInformation 64 Вывод пиктограммы - информация
    vbDefaultButton1 0 Первая кнопка является кнопкой по умолчанию
    vbDefaultButton2 256 Вторая кнопка является кнопкой по умолчанию
    vbDefaultButton3 512 Третья кнопка является кнопкой по умолчанию
    vbApplicationModal 0 Нужно ответить на сообщение
    vbSystemModal 4096 Программы не выполняются до ответа пользователя на сообщение в диалоговом окне

    Пример: MsgBox("A Happy New Millennium !!!", vbOKOnly + vbExclamation, "MsgBox()-Study") После ответного действия пользователя возвращается код, по которому можно определить кнопку, нажатую пользователем, табл. 6.4.

    Возвращаемые функцией MsgBox значения
    Константа Значение Описание
    vbOk 1 Пользователь сделал щелчок на кнопке OK
    vbCancel 2 Пользователь сделал щелчок на кнопке Cancel
    vbAbort 3 Пользователь сделал щелчок на кнопке Abort
    vbIgnore 5 Пользователь сделал щелчок на кнопке Ignore
    vbYes 6 Пользователь сделал щелчок на кнопке Yes
    vbNo 7 Пользователь сделал щелчок на кнопке No

    При работе с функцией MsgBox после ввода имени функции, пробела/открывающейся скобки выводится всплывающая подсказка, содержащая синтаксис функции. После набора сообщения пользователя - Prompt и ввода символа "запятая" выводится окно со списоком констант; можно выбрать требуемую из списка (для этого нужно использовать сочетание клавиш CTRL и Enter) или ввести константу вручную. Из всплывающего списка после ввода символа + можно выбрать следующую константу. Возвращаемое функцией значение может использоваться для управления ходом выполения программы.

    Пример: переменной ккКК присваивается возвращаемое функцией значение, это значение используется далее:

    kkKK = MsgBox("Do you work ?", vbYesNoCancel + vbExclamation, "MsgBox()-Study")
    If kkKK = vbYes Then
    Form1.Print "He works !!"
    ElseIf kkKK = vbNo Then
    Form1.Print "He does not work !!"
    Else: Form1.Print "He won't work !!"
    End If

    Если возвращаемое функцией значение не используется, то используется другой синтаксис, скобки опускаются; пример: MsgBox "Kindest regards and best wishes !", 0, "regards"

    Обмен данными

    ActiveX - это набор технологий, используемых для обеспечения эффективной работы приложений типа клиент-сервер . ActiveX - часть модели COM - Component Object Model (модель многокомпонентных объектов) и обеспечивает для COM интерфейс, работающий в разнородных средах. Совокупность ActiveX (см. окно Новый проект рис. 6.11) содержит, среди прочего, следующие компоненты:

    (рис 6.11) Окно создания нового проекта
  • ActiveX EXE - предоставляет другим приложениям связанные/внедрeнные объекты и множество клиентов могут иметь доступ к этому сервер-приложению,
  • ActiveX DLL - элементы динамически подключаемой библиотеки (объектов, доступных для программирования). Их можно писать на языках, поддерживающих СОМ,
  • ActiveX Control - управляющий элемент; может использоваться в различных средах программирования,
  • ActiveX Document - приложение, которое программа, обрабатывающая сетевые документы (контейнер ActiveX документа) может интерпретировать как Web-страницу.
  • При создании проекта, реализуемого как исполняемый компонент - ActiveX.EXE (см. окно Новый проект рис. 6.11), создаeтся модуль класса, рис. 6.12

    (рис 6.12) Схема проекта

    Может быть реализована также и динамическая библиотека ActiveX.DLL (см. следующую пиктограмму на рис. 6.11). Динамические библиотеки загружаются в область памяти программы-клиентa, использующей их в данный момент (клиент должен загрузить собственную копию компонента), в то время как исполняемый ActiveX-компонент работает как приложение в своей области памяти. Аналогично, документы ActiveX можно выполнять или как исполняемые или как динамические библиотеки. Схема проекта в обоих случаях содержит по умолчанию один компонент - UserDocument, который сходен с формой. Документ выполняется в приложениях-контейнерах, обрабатывающих сетевые материалы; ему доступно почти всe, что и проекту Visual Basic. Объект PropertyBag может в течение одного рабочего сеанса сохранять, среди прочего, текстовые элементы документа, это удобно при частом обращении к документу.

    ActiveX Control после его создания помещается на панель элементов управления Visual-Basic и может быть использован в других проектах; он может исполняться в приложениях, поддерживающих ActiveX, может быть размещён на Web-страницах. ActiveX-компонет включается в программы и расширяет возможности среды разработки. ActiveX-документы - это приложения, написанные на языке Visual Basic и работающее в приложениях, обрабатывающих сетевые материалы. Материал по теме ActiveX поддерживается практиескими работами 45 и 46.

    ActiveX Control

    Приводится пример создания ActiveX Control. После создания он автоматически добавляется к объектам на панели элементов управления Visual Basic и может быть использован в проекте.

    Практическая работа 45. Создание ActiveX Control

    Выполнить следующее:

  • в окне Новый проект (рис. 6.11) выбрать элемент ActiveX Control (форма теперь будет объектом UserControl) $$\to$$ OK $$\to$$ задать имя проекта: щелчок правой клавишей мыши в окне проекта на Project1 $$\to$$ Свойства $$\to$$ в поле Имя проекта ввести MeinCont $$\to$$ OK,
  • свойству ControlContainer присвоить значение True - создать элемент-контейнер,
  • создать процедуры Timer1_Timer() и Timer2_Timer(), обеспечивающие перемещение объекта Image с рисунком и поля метки в созданном элементе-контейнере, для этого:
  • создать поле метки; присвоить значения: Label1.Caption = A Happy New Millennium !!!, AutoSize = Тrue, создать элемент управления Image (см. рис. 6.16); свойству Stretch присвоить значение True,
  • создать 2 элемента управления Timer, свойствам Interval присвоить значения 50 и 100 соответственнно,
  • создать набор параметров (свойств, методов, событий); для этого использовать программу-мастер: ActiveX Control Interface Wizard: меню Добавления $$\to$$ Менеджер расширений $$\to$$ включить флажок Загружен $$\to$$ ОК; имя программы появляется в выпадающем меню Добавления $$\to$$ стартовать эту программу. В результате действий пользователя (их последовательность дана ниже) система программирования генерирует соответствующий код (см. код ниже: курсивом выделен частично распечатанный сгенерированный системой код),
  • после старта программы-мастера во втором окне-ассистенте, рис. 6.13, нужно выбрать имеющиеся параметры из списка: свойства: BackСolor, BorderStyl, Caption, Font, ForeColor, ControlContainer, Picture, Stretch, Interval; событие Resize, для этого:
  • удалить всe содержимое правого поля за исключением параметров, перечисленных выше, добавить недостающее из левого поля в правое. Тем не менее параметров нехватает, поэтому следует:
  • перейти к следующему окну-ассистенту, рис 6.14(рис 6.13) Второе окно-ассистент - выбор имеющихся в наличии параметров (рис 6.14) Следующее окно-ассистент - создание собственных параметров
  • распределить все параметры между объектами: создаваемый элемент, поле метки, Timer, Image; для этого перейти к следующему окну-ассистенту, рис. 6.15, при этом использовать данные табл. 6.5.
    Соответствие объекты - параметры
    Name Control Member
    BackColor UserControl BackColor
    BorderStyle UserControl BorderStyle
    Caption Label1 Caption
    ControlContainer UserControl ControlContainer
    Resize UserControl Resize
    Font Label1 Font
    ForeColor Label1 ForeColor
    Interval Timer1 Interval
    Stretch Image1 Stretch
    Picture Image1 Picture
    (рис 6.15) Следующее окно-ассистент
  • cделать щелчок на кнопке Finish; код сгенерирован, его можно просмотреть,
  • сохранить проект,
  • ввести код, данный ниже (за исключением строк, данных курсивом); пояснения даны под комментариями к коду,
  • проверить функционирование созданного элемента, для этого: стартовать проeкт: выполнение проводится в приложении-Browser рис. 6.16.
  • остановить выполнение, закрыть окна кода и объект UserControl (форма); пиктограмма ActiveX Control автоматически добавляется к объектам панели элементов управления и его можно использовать в других проектах. Можно, например, выполнить следующее: меню Файл $$\to$$ Добавить проект $$\to$$ Standard.EXE $$\to$$ OK $$\to$$ разместить новый элемент на форме.
  • ' описание переменных, используемых в процедурах,
    ' обеспечивающих перемещение элементов 
    ' управления Label1, Image1
    Private Go As Integer, Go1 As Integer 
    ' обработка события объекта Timer
    Private Sub Timer1_Timer()
    GoMeinCont
    End Sub
    'WARNING! DO NOT REMOVE OR MODIFY THE FOLLOWING COMMENTED LINES!
    'MappingInfo=UserControl,UserControl,-1,BackColor
    Public Property Get BackColor() As OLE_COLOR
    BackColor = UserControl.BackColor
    End Property
    Public Property Let BackColor(ByVal New_BackColor As OLE_COLOR)
    UserControl.BackColor() = New_BackColor
    PropertyChanged "BackColor"
    End Property
    Private Sub Timer2_Timer()
    Go1MeinCont
    End Sub
    'Load property values from storage
    Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
    UserControl.BackColor = PropBag.ReadProperty("BackColor", H8000000F)
    ' центрировать элементы, задать начальные значения 
    ' переменным. Обратить внимание на использование в 
    ' данном случае события Initialize
    Private Sub UserControl_Initialize 
    Label1.Move (UserControl.Width - Label1.Width)/2, _
    (UserControl.Height - Label1.Height)/2
    Image1.Move (UserControl.Width - Image1.Width)/4, _
    (UserControl.Height - Image1.Height)/4
    Go = 1: Go1 = 2
    End Sub
    Private Sub UserControl_Resize() ' масштабировать объекты 
    Label1.Width = (ScaleWidth - Label1.Left) 
    Label1.Height = (ScaleHeight - Label1.Top) 
    Image1.Width = (ScaleWidth - Image1.Left) 
    Image1.Height = (ScaleHeight - Image1.Top) 
    End Sub
    Private Sub GoMeinCont() ' реализация перемещения
    Select Case Go
    Case 1: Label1.Move Label1.Left - 45, Label1.Top - 45
    If Label1.Left <= 0 Then
    Go = 2
    ElseIf Label1.Top <= 0 Then
    Go = 4
    End If
    Case 2: Label1.Move Label1.Left + 45, Label1.Top - 45
    If Label1.Left >= (UserControl.Width - Label1.Width) Then
    Go = 1
    ElseIf Label1.Top <= 0 Then
    Go = 3
    End If
    Case 3: Label1.Move Label1.Left + 45, Label1.Top + 45
    If Label1.Left >= (UserControl.Width - Label1.Width) Then
    Go = 4
    ElseIf Label1.Top >= (UserControl.Height - Label1.Height) Then
    Go = 2
    End If
    Case 4: Label1.Move Label1.Left - 45, Label1.Top + 45
    If Label1.Left <= 0 Then
    Go = 3
    ElseIf Label1.Top >= (UserControl.Height - Label1.Height) Then
    Go = 1
    End If
    End Select
    End Sub
    Private Sub Go1MeinCont()
    Select Case Go1
    Case 1: Image1.Move Image1.Left - 60, Image1.Top - 60
    If Image1.Left <= 0 Then
    Go1 = 2
    ElseIf Image1.Top <= 0 Then
    Go1 = 4
    End If
    Case 2: Image1.Move Image1.Left + 60, Image1.Top - 60
    If Image1.Left >= (UserControl.Width - Image1.Width) Then
    Go1 = 1
    ElseIf Image1.Top <= 0 Then
    Go1 = 3
    End If
    Case 3: Image1.Move Image1.Left + 60, Image1.Top + 60
    If Image1.Left >= (UserControl.Width - Image1.Width) Then
    Go1 = 4
    ElseIf Image1.Top >= (UserControl.Height - Image1.Height) Then
    Go1 = 2
    End If
    Case 4: Image1.Move Image1.Left - 60, Image1.Top + 60
    If Image1.Left <= 0 Then
    Go1 = 3
    ElseIf Image1.Top >= (UserControl.Height - Image1.Height) Then
    Go1 = 1
    End If
    End Select
    End Sub
    (рис 6.16) ActiveX Control

    ActiveX Document.DLL

    Приложения Visual Basic ActiveX Document выполняются в контейнере - приложении, обрабатывающем сетевые материалы. ActiveX Document обладает большими функциональными возможностями, например, применение ActiveX Document'a может предоставить внешнему пользователю сети доступ к локальным базам данных.

    Практическая работа 46. ActiveX Document.DLL

    Здесь создаeтся документ ActiveX Document.DLL, в котором используем доступ к данным посредством элемента управления Data с выводом их в поле элемента управления MSFlexGrid; тогда имеется возможность предоставить доступ к локальным базам данных пользователю сети. Документы ActiveX инициализируются (в отличие от формы) в процедуре UserDocument_Initialize (). В примере используем материалы практической работы 28 (доступ к данным с выводом результатов в поле элемента управления MSFlexGrid).

    Последовательность действий:

  • Cоздать проект типа ActiveX Document.DLL,
  • скопировать проект (практическая работа 28), при этом использовать свойство MSFlexGrid.DataSource = Data1 вместо части программы, описывающей работу с ячейками MSFlexGrid (см. комментарии к коду практической работы 28),
  • для ввода SQL-запроса добавить командную кнопку Command1 (командная кнопка практики 28 не используется), см. код, данный ниже. Первый запрос (Select Name From Student) вводится в окне свойств текстового поля,
  • ввести код, данный ниже, стартовать проект - проект выполняется в приложении Browser. Новый запрос вводится в текстовое поле, затем делается щелчок на командной кнопке, рис. 6.17
  • Private Sub UserDocument_Initialize()
    Dim i As Integer
    CommonDialog1.FileName = ""
    CommonDialog1.Action = 1
    Data1.Connect = ""
    Data1.DatabaseName = CommonDialog1.FileName
    Data1.Refresh
    For i = 0 To Data1.Database.TableDefs.Count - 1
    Combo1.AddItem (Data1.Database.TableDefs(i).Name)
    Next i
    Combo1.Text = ""
    Data1.RecordSource = Text1.Text
    Data1.Refresh
    End Sub
    
    ' SQL-запрос, вводимый в текстовое поле, присваивается 
    ' свойству RecordSource
    Private Sub Command1_Click() 
    Data1.RecordSource = Text1.Text
    Data1.Refresh
    End Sub
    (рис 6.17) ActiveX Document.DLL
    Страницы:

    Продукты корпорации Microsoft поддерживают протокол динамического обмена данными - DDE (протокол - правила при коммуникациях). С использованием папки обмена CLIPBRD.EXE выполняются DDE-связи в компьютерной сети (стартует сетевая DDE-служба), при этом данные должны быть сделаны доступными - должен быть реализован общий доступ. В процессе обмена данными устанавливаются связи между папками обмена удалeнных компьютеров; данные буфера обмена должны находиться на страницах папки обмена. Такая связь может быть реализована и средствами Visual Basic. Приложения могут выполнять как роль клиента, запрашивающего и принимающего данные, так и роль сервера - источника данных.

    Технология обмена данными между приложениями развита до такого уровня, что данные не нужно заново копировать - они после их изменения автоматически передаются через DDE-связь. OLE - следующий этап разработок в области обмена данных. Это технология связи программ, обеспечивающая приложениям совместное использование данных. Технология OLE поддерживается с помощью внедрённых и связанных объектов. Развитие OLE - это технология ActiveX.

    DDE

    Рассмотрим примеры использования Microsoft Access в роли сервера DDE для приложения-клиента, запрашивающего и принимающего даные по каналу связи DDE. Сеанс связи начинается с открытия канала связи; при этом используется функция DDEInitiate, в аргументе которой перечисляются: имя приложения (база данных Access), имя файла базы данных, имя таблицы; пример: intChan1 = DDEInitiate("MSAccess", "C:\Winnt\Profiles\Administrator\dde6;TABLE dde1")

    После этого становится возможной передача данных в другое приложение по этому каналу. Для передачи требования на пересылку, например, текстовых данных из приложения-сервера по открытому каналу DDE используется функция DDERequest, в аргументе которой указывается номер канала связи и сформулирован запрос, пример: strResp1 = DDERequest(intChan1, "All"). После окончания передачи данных нужно вызвать в приложении-клиенте функцию DDETerminate для закрытия текущего канала обмена или функцию DDETerminateAll для закрытия всех каналов связи.

    Практическая работа 40. DDE

    40а. DDE. Простейший пример обмена данными

    Задание: записать в файл результат запроса к данным таблицы базы данных (Access).

    Порядок выполнения:

  • создать базу данных (здесь - dde6), таблицу (здесь - dde1), сделать запрос, закрыть приложение Access,
  • создать макрос в приложении Word, код макроса дан ниже,
  • стартовать макроc; в результате его выполнения стартует закрытое ранее приложение Access,
  • открыть файл dde61.txt (в редакторе Блокнот).
  • Sub dde6()' макрос в приложении Word,
    Dim intChan1 As Integer ' канал связи
    Dim strResp1 As Variant ' требование на запрос
    ' открыть канал связи
    intChan1 = DDEInitiate("MSAccess",_
    "C:\Winnt\Profiles\Administrator\dde6;TABLE dde1")
    strResp1 = DDERequest(intChan1, "All") ' требование на запрос
    DDETerminate intChan1 ' закрыть текущий канал связи
    Open "dde61.txt" For Output As #1 ' открыть файл для записи
    Write #1, strResp1 ' записать результат запроса
    Close #1 ' закрыть файл
    End Sub

    Содержимое полученного файла dde61.txt - это результат запроса ("All"): вывести всeсодержимое таблицы базы данных, рис. 6.1.

    (рис 6.1) Простейший пример DDE; данные, выводимые в файл

    40в. DDE

    Приводится аналогичный пример; создаются 4 таблицы: student, (рис. 6.2, рис. 6.3) stipendija, sessija, prikaz; выполняются 4 запроса (рис. 6.4, рис. 6.5), создается макрос в приложении Word (см. код, данный ниже), открываются 4 канала связи, результаты 4-х запросов по 4-м каналам связи выводятся в файлы dde621 - dde624. Пояснения к коду макроса:

  • All - вывести все данные из таблиц, включая имена полей,
  • FildNames,T - вывести список из 2-х строк, содержащий имена полей (первая строка) и их типы данных (вторая строка).
  • Sub dde62() ' макрос в приложении Word
    Dim intChan1 As Integer, intChan2 As Integer, intChan3 As Integer
    Dim intChan4 As Integer, strResp1 As Variant, strResp2 As Variant
    Dim strResp3 As Variant, strResp4 As Variant
    intChan1 = DDEInitiate("MSAccessquot;, quot;A:\nin;TABLE Studentquot;)
    intChan2 = DDEInitiate(quot;MSAccessquot;, quot;A:\nin;TABLE Stipendiumquot;)
    (рис 6.2) Таблица Pruefung (рис 6.3) Таблица Student (рис 6.4) Запрос (рис 6.5) Результат запроса
    intChan3 = DDEInitiate("MSAccess", "A:\nin;TABLE Pruefung")
    intChan4 = DDEInitiate("MSAccess", "A:\nin;QUERY Befehl")
    strResp1 = DDERequest(intChan1, "All")
    strResp2 = DDERequest(intChan2, "All")
    strResp3 = DDERequest(intChan3, "FieldNames;T")
    strResp4 = DDERequest(intChan4, "All")
    DDETerminate intChan1: DDETerminate intChan2
    DDETerminate intChan3: DDETerminate intChan4
    Open "dde621.txt" For Output As #1
    Write #1, strResp1
    Close #1
    Open "dde622.txt" For Output As #1
    Write #1, strResp2
    Close #1
    Open "dde623.txt" For Output As #1
    Write #1, strResp3
    Close #1
    Open "dde624.txt" For Output As #1
    Write #1, strResp4
    Close #1
    End Sub

    OLE

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

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

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

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

    Элемент управления OLE (панель элементов управления) используется для связывания /внедрения объектов в приложениях Visual Basic. Контекстное меню OLE содержит команды:

  • вырезать, копировать, вставить, удалить,
  • перенести
  • вставить объект (имеется список объектов для выбора и возможность выбора типа вставки),
  • специальная вставка - при выборе этой команды выводится диалоговое окно, где отображаются имеющиеся в наличии классы объектов. Имеется возможность сделать выбор - связь/внедрение; имеется возможность использования вместо объекта пиктограммы,
  • создать связь, создать внедренный объект.
  • Не все команды отображаются или являются доступными; это зависит от состояния приложения и буфера обмена. Некоторые параметры элемента управления OLE даны в табл. 6.1.

    Некоторые свойства, методы и события элемента управления OLE
    Свойства Пояснения
    Action Выполняемое действие. Недоступно во время разработки, возможны установочные значения в пределах 0 - 18; среди них: 0 - создаeт внедрeнный объект, 1 - создаeт связанный объект, 7 - открывает объект, 15 - отображает окно Специальная вставка, 18 - сохраняет OLE и т.д. Некоторые действия Action реализованы как методы
    AutoActivate Определяет когда активизируется объект (после двойного щелчка, после получения фокуса и т.д.)
    AutoVerbMenu Должно ли выводиться контекстное меню
    Class Идентифицирует приложение, которое создаeт OLE-объект (например, Word)
    HostName Содержит имя приложения, создавшего объект
    ObjectVerbs Список команд, применимых к OLE-объекту
    ObjectVerbsCount Количество таких команд (см. выше)
    OLEType Возвращает состояние OLE-объекта в контейнере: связанный/внедрeнный
    OLETypeAllowed Задание связывания, внедрения или обоих
    SizeMode Возвращает и задаeт режим согласования размеров элемента управления OLE и загружаемого в него объекта
    SourceDoc Имя файла, где находится объект (или который должен быть загружен в OLE-контейнер)
    SourceItem Указывает на данные объекта, которые будут связаны
    Verb Определяет вид действия, которое будет выполнено при активизации объекта с помощью свойства Action
    UpdateOptions Когда содержимое объекта OLE может быть обновлено
    Методы
    Close Закрыть объект, завершить связывание с приложением, где он был создан
    Copy Копирование из контейнера OLE в буфер обмена
    CreateEmbed Внедрение объекта в OLE-контейнер. CreateEmbed (Action = 0) создает внедренный объект, CreateLink (Action = 1) создает cвязанный объект
    CreateLink Создание связываемого объекта, пользуясь содержимым заданного файла
    Delete Удалить объект
    DoVerb Открыть объект для выполнения над ним одного из действий
    Paste Вставить объект в OLE-контейнер из буфера обмена
    Updаte Обновление объекта в OLE-контейнере (на основании данных приложения, посредством которого объект редактируется)
    События
    ObjectMove Происходит после изменений размеров или перемещения объекта, бывшего в OLE-контейнере
    Updated Происходит после изменения данных в объекте

    Приложение OLE-сервер определяет множество операций (команд), которые могут выполняться над поставляемым им объектом. Каждый объект поддерживает собственный набор команд. Этот набор может изменяться во время работы приложения. OLE-объект получает список команд от приложения-сервера и доступ к этому списку команд осуществляет через свои свойства ( AutoVerbMenu, Verb, ObjectVerbs, ObjectVerbsCount ). Эти свойства доступны во время выполнения.

    Практическая работа 41. OLE

    41а. Элементарная операция OLE

    Последовательность действий:

  • Создать на форме элемент управления OLE для создания, например, связанного объекта,
  • создать соответствующий файл, например, A:\ole1.xls (см. код, данный ниже),
  • ввести код, данный ниже,
  • стартовать проект, сделать щелчок на форме, наблюдать результат.
  • Private Sub Form_Click()
    OLE1.Class = "Worksheet" ' приложение Excel
    OLE1.SourceDoc = "A:\ole1.xls" ' имя файла
    ' использовать указанный блок данных
    OLE1.SourceItem = "A1A3:B1B3" 
    OLE1.Action = 1 ' создать связанный объект
    End Sub

    41в. OLE

    Рассматривается загрузка объектов (см. процедуру Form_Load () в OLE-контейнер и реализация (по желанию пользователя) связывания/внедрения (см. процедуру Public Sub LinkEmb(FileName As String, Embed As Boolean) ). Последовательность действий:

  • создать объекты: текстовый файл (приложение Word), таблицу (приложение Excel), базу данных (приложение Access), рисунок (приложение Paint),
  • создать на форме элемент управления OLE (Name = ole1), два переключателя (Name = opt1 и opt2 соответственно, Caption = Link и Embed cоответственно), командную кнопку (Name = cmd1, Caption = Load Object), поле списка (Name = lst), табл. 6.1.
  • ввести код данный ниже, стартовать проект,
  • маркировать в поле списка lst, элемент, например, "Docum.Word", сделать щелчок на требуемом переключателе (Link или Embedding), затем сделать щелчок на командной кнопке "Load Object". В поле элемента OLE выводится соответствующий файл,
  • сделать двойной щелчок в поле OLE на введeнном объекте.
  • В зависимости от того, какой переключатель использован (Link или Embed), вставленный объект выводится или в приложении Word для редактирования, или появляется возможность редактировать его средствами того приложения, в котором он находится. В случае Link внесeнные (пользователем) изменения остаются в исходном файле. Это можно проверить, загрузив файл в приложение Word.

    ' создать список объектов для загрузки в OLE-контейнер
    Private Sub Form_Load()
    With lst
    .AddItem ("Docum.Word")
    .AddItem ("Table.Excel")
    .AddItem ("Picture.Paint")
    .AddItem ("Database.Access")
    End With
    End Sub
    ' выбор загружаемого объекта (маркировать его в списке, см.:
    ' Select Case lst.ListIndex) и определение режима 
    ' связывание/внедрение с учётом состояния переключателей 
    Private Sub cmd1_Click()
    Select Case lst.ListIndex
    Case 0: LinkEmb "A:\nin.doc", opt1.Value
    Case 1: LinkEmb "A:\nin.xls", opt1.Value
    Case 2: LinkEmb "A:\nin.bmp", opt1.Value
    Case 3: LinkEmb "A:\nin.mdb", opt1.Value
    End Select
    End Sub
    ' в зависимости от значений переданных аргументов
    'реализовать связь/внедрение
    Public Sub LinkEmb(FileName As String, Embed As Boolean)
    If Embed Then
    ole1.CreateEmbed FileName
    Else
    ole1.CreateLink FileName
    End If
    End Sub

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

    Имеется возможность перетаскивать наборы данных (тексты, рисунки, таблицы, деревья файлов и т.д.) с применением OLE. При этом различают перемещение данных (после перемещения данные в источнике удаляют) и копирование данных. Для обеспечения перетаскивания действия (начало перетаскивания, сбрасывание) должны быть запрограммированы. Рассматриваются два объекта: источник - OLEDrag и приeмник - OLEDrop. В случае автоматического перетаскивания свойствам OLEDragMode, OLEDropMode элементов управления, например,

    (рис 6.6) OLE

    TextBox, Image должно быть присвоено значение vbOLEDragAutomatic (в окне свойств), альтернативно (ручное перетаскивание) - vbManual. Установки свойств OLEDragMode/OLEDropMode могут быть сделаны и программным путeм.

    Ниже рассматриваются параметры объекта DataObject, содержащего перетаскиваемые данные. Он фигурирует в процедурах обработки событий, в которые передаeтся параметр Data (см. код). Объект (аналогичен объекту Clipboard) имеет 4 метода:

  • SetData устанавливает данные в требуемом формате (vbCFText - текст, vbCFRTF расширенный текстовый формат, vbCFBitmap - растровое изображение vbCFFiles - список файлов и .т.д.),
  • GetFormat проверяет наличие данных в требуемом формате (сможет ли приeмник использовать данные),
  • Clear удаляет содержимое объекта,
  • GetData копирует данные в требуемом формате из DataObject в приeмник.
  • Ниже приводится перечень параметров элементов управления, обеспечивающих перетаскивание, затем даeтся практическая работа 42 для усвоения материала:

    Метод: OLEDrag - начать перетаскивание,

    Свойства: OLEDragMode/OLEDropMode - установить элемент управления в качестве источника/приeмника, OLEDropAllowed - установить разрешение сбрасывания OLE в контейнере.

    События: OLEDragDrop происходит при сбрасывании-OLE в контейнер OLE, синтаксис:

    Private Sub Object_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Singlе, y As Single). Здесь:

  • DataObject - см. выше,
  • Effect (действие) определяет предпринимаемые после завершения перетаскивания действия, см., например, процедуру: Private Sub Image1_OLEDragDrop(:),
  • Button определяет (нажатую при перетаскивании) кнопку мыши,
  • Shift определяет использование при перетаскивании клавиш Shift, Ctrl, Alt,
  • x, y - координаты курсора мыши.
  • OLEDragOver происходит при перемещении одного объекта над другим, OLEGiveFeedback происходит после события OLEDragOver ; может быть использовано для создания визуальных признаков действий, OLEStartDrag происходит или для источников с ручным режимом перетаскивания или при инициализации автоматического перетаскивания, OLESetData происходит для источника после применения приeмником метода GetData, OLECompleteDrag происходит после перемещения объекта из источника в приeмник.

    Практическая работа 42. Перетаскивание данных

    Последовательность действий:

  • присвоить свойству Picture обоих элементов управления Image значения - 2 любых имени файла с расширением .bmp, см. рис. 6.7
  • ввести код, данный ниже, стартовать проект,
  • перетащить мышью рисунок из первого элемента управления Image в приложение Word или WordPad (предварительно стартовать Word/WordPad),
  • при нажатой клавише CTRL скопировать перетаскиванием рисунок из второго элемента управления Image в Word. Затем из Word переместить объекты назад в поля элементов управления Image. Пояснения даны под комментариями в коде.
  • ' установить требуемый формат данных
    Private Sub Image1_OLEStartDrag(Data As DataObject, AllowedEffects As Long) 
    Data.SetData Image1.Picture, vbCFBitmap
    End Sub
    
    ' копировать/переместить в требуемом формате
    Private Sub Image1_OLEDragDrop(Data As DataObject, Effect As _
    Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Shift > 0 Then
    Effect = vbDropEffectCopy
    Else
    Effect = vbDropEffectMove
    End If
    Image1.Picture = Data.GetData(vbCFBitmap)
    End Sub
    
    Private Sub Image2_OLEStartDrag(Data As DataObject, AllowedEffects As Long)
    Data.SetData Image2.Picture, vbCFBitmap
    End Sub
    
    Private Sub Image2_OLEDragDrop(Data As DataObject, Effect As _
    Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Shift > 0 Then
    Effect = vbDropEffectCopy
    Else
    Effect = vbDropEffectMove
    End If
    Image2.Picture = Data.GetData(vbCFBitmap)
    End Sub
    (рис 6.7) Перетаскивание данных

    Программирование объектов; продолжение

    Программирование объектов обеспечивает приложениям возможность предоставлять свои объекты в распоряжение средств разработки и других приложений. Visul Basic позволяет проводить работу с объектами с помощью их (объектов) методов или установки/чтения их свойств, например:

    seinObjekt.Bold = True ' форматировать текст
    seinObjekt.SaveAs = "A:\txt.doc" ' сохранить текст

    при этом программируемый объект seinObjekt был заранее создан.

    Visual Basic позволяет создавать новые объекты и работать с имеющимися в приложениях Microsoft. Функции CreateObject/GetObject используются для создания нового объекта/получения существующего из другого приложения. Ключевое слово New используется для создания объекта некоторого класса, примеры:

    Set ExcelWorksheet = GetObject("SHEET5.XLS") - стартовать Excel и открыть лист уже существующий, Dim x As New Field - описание нового объекта.

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

    Практическая работа 43. Работа с объектом - экземпляр приложения Word: создание файла, запись текста и т.д.

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

    Последовательность действий:

  • создать ссылку на библиотеку объектов: Проект $$\to$$ Ссылки $$\to$$ Microsoft Word Object Library,
  • cоздать на форме командную кнопку (Name = cmd1) и текстовое поле (Name = txt1),
  • ввести код, данный ниже, пояснения даны под комментариями к коду, стартовать проект,
  • ввести в текстовое поле текст, сделать щелчок на командной кнопке,
  • для проверки работы проекта стартовать приложение Word, рис. 6.8
  • Private Sub cmd1_Click()
    Dim str As String ' описание переменной для работы с текстом 
    ' с использованием ключевого слова New создать объектную 
    ' переменную (ссылка проводится на объект Word.Application - 
    ' экземпляр приложения Word)
    Dim edi As New Word.Application 
    ' присвоить переменной значение: текст, 
    ' вводимый в текстовое ' поле
    str = txt1.Text 
    ' создать новый документ Word (Documents - дочерний 
    ' объект по отношению к объекту Word.Application)
    edi.Documents.Add 
    ' вставить в документ Word (метод Type) текст из
    ' текстового поля 
    edi.Selection.Type Text (str) 
    ' cохранить документ
    edi.ActiveDocument.SaveAs FileName:="A:\nnn.doc" 
    ' закрыть документ
    edi.ActiveDocument.Close 
    edi.Application.Quit ' закрыть приложение
    Set edi = Nothing ' очистить объектную переменную
    End Sub
    (рис 6.8) Работа с объектом - экземпляр приложения Word

    Практическая работа 44. Использование объектов Excel и Access: результаты SQL-запроса передать средствами языка программирования для дальнейшей математической обработки в Excel

  • Создать элементарный фрагмент базы данных, см. табл. 6.2 Подключить 3 библиотеки (для обеспечения работы с DAO, Access и Excel): Microsoft Excel 10.0 Object Library, Microsoft Access 10.0 Object Library, Microsoft DAO 3,51Object Library
    Анализ прибыли, фрагмент
    Kode Lad Jan Febr SumGes Proz
    1 Lad1 256 381 0 0,00%
    2 Lad2 786 982 0 0,00%
    3 Lad3 528 436 0 0,00%
    4 Sum 0 0 0
  • создать на форме (рис. 6.9) поле списка (Name = lst) свойству Microsoft присвоить значение, обеспечивающее возможность одновременной маркировки нескольких строк, 3 командных кнопки - cmd1 (Caption = Access), cmd2, Caption = Excel), cmdEnd, CommonDialog (Name = cdlg), cм. 6.2, (для обеспечения диалога с пользователем при передаче данных Access $$\to$$ Exсel), см. код процедуры Private Sub cmd2_Click(). Элемент управления CommonDialog не виден на рис. 6.9, т.к. там изображена форма после старта проекта,
  • ввести код, данный ниже, стартовать проект, сделать щелчок на кнопке Access - имена полей таблицы базы данных выводятся в поле списка lst, рис. 6.9,
  • в поле lst (на рис. 6.9 - Fields) маркировать поля, которые нужно передать в приложение Excel для дальнейшей математической обработки; далее сделать щелчок на кнопке Excel,
  • подтвердить желание сохранить файл: сделать щелчок на кнопке ОК в окне MsgBox, ввести имя файла - выводится сообщение о том, что данные Access сохранены на листе Exсel,
  • открыть этот файл с данными, просмотреть таблицу, рис. 6.9, сделать щелчок на кнопке End проекта. Пояснения даны под комментариями к коду.
  • ' Средствами DAO, см. процедуру cmd1_Click(), выполня-
    ' ется работа с таблицей nin2 базы данных nin1.mdb и 
    ' имена полей таблицы, (см. цикл For Next), заносятся в
    ' поле списка lst. Далее пользователь должен выбрать
    ' поля таблицы для переноса в приложение Excel
    Private Sub cmd1_Click()
    Dim ws As Workspace, db As Database 
    Dim tdef As TableDef, i As Integer
    lst.Clear
    Set ws = DBEngine.Workspaces(0)
    Set db = ws.OpenDatabase("A:\nin1.mdb")
    Set tdef = db.TableDefs("nin2")
    For i = 0 To tdef.Fields.Count - 1
    lst.AddItem tdef.Fields(i).Name
    Next i
    db.Close: ws.Close
    End Sub
    ' программируется передача таблицы из Access в Excel.
    ' Cначала объявляются новые объекты Excel, затем - DAO
    Private Sub cmd2_Click()
    ' объект Excel.Application содержит коллекцию Workbooks
    Dim xla As New Excel.Application 
    ' объект Workbook содержит коллекцию Worksheet
    Dim xlb As New Excel.Workbook 
    ' объект Worksheet содержит ячейки
    Dim xls As New Excel.Worksheet 
    ' объект Range - непрерывный набор ячеек
    Dim xlr As Excel.Range
    Dim ws As Workspace, db As Database, rs As Recordset 
    Dim i As Integer, j As Integer, k As Integer, rc As Integer
    Dim r As Integer, c As Integer
    ' описание массива полей таблицы базы данных, выделенных 
    ' пользователем в поле lst после старта проекта и 
    ' щелчка на кнопке Access
    Dim masFields() As String
    ' определить выделенные пользователем в поле списка 
    ' lst поля (таблицы базы данных) для переноса в Excel и
    ' определить размерность массива masFields() 
    ' для их (выделенных полей) хранения (ReDim - 
    ' изменить размерность массива)
    For i = 0 To lst.ListCount - 1
    If lst.Selected(i) = True Then j = j + 1
    Next i
    ReDim masFields(j - 1)
    ' занести данные в массив masFields(j) из поля
    ' списка (свойство ListCount содержит число 
    ' элементов списка)
    j = 0
    For i = 0 To lst.ListCount - 1
    If lst.Selected(i) = True Then masFields(j) = lst.List(i): j = j + 1
    Next i
    ' создать рабочее пространство, открыть базу данных
    Set ws = DBEngine.Workspaces(0)
    Set db = ws.OpenDatabase("A:\nin1")
    ' создать объекты Excel (экземпляр книги и листа) и 
    ' активизировать лист Excel
    Set xlb = xla.Workbooks.Add
    Set xls = xlb.Worksheets.Add
    xls.Activate
    ' в цикле For : Next перебрать выбранные пользователем и 
    ' занесeнные ранее в массив поля. Для каждого поля 
    ' формируется SQL-запрос. Далее просматривается 
    ' весь набор записей для определения количества 
    ' соответствующих записей
    For i = 0 To UBound(masFields)
    Set rs = db.OpenRecordset("SELECT nin2."  masFields(i)  " _
    FROM nin2")
    rs.MoveLast: rs.MoveFirst
    ' выбрать номера столбцов таблицы Excel, где будут 
    ' размещены выбранные данные. В первую строку поместить 
    ' названия полей. Ячейки первой строки делаются 
    ' объектом xlr и выделяются
    c = i + 1 
    xls.Cells(1, c) = masFields(i)
    Set xlr = xls.Cells(1, c)
    xlr.Select
    xlr.Font.Bold = True
    ' ограничить набор данных некоторым числом (например, 10) 
    If rs.RecordCount > 10 Then rc = 10 Else rc = rs.RecordCount
    ' в тот же столбец таблицы (аргумент с) перенести 
    ' все записи. Далее (цикл For i : Next i) - возврат к 
    ' началу цикла для перебора всех полей
    For r = 2 To rc + 1
    xls.Cells(r, c) = rs(masFields(i))
    rs.MoveNext
    Next r
    Next i
    ' сообщение пользователю о передаче данных в Excel; 
    ' вопрос о необходимости сохранения их в файле, ввод в 
    ' диалоговом режиме имени файла; сообщение о 
    ' сохранении/несохранении файла; закрыть объект - 
    ' приложение Excel. Синтаксис функции MsgBox дан
    ' после кода
    If MsgBox("I have transported the Access data "  "to an Excel." _
    vbCrLf  vbCrLf  "Do you want to save ?", vbQuestion  _
    vbYesNo) = vbYes Then
    cdlg.FileName = ""
    cdlg.ShowSave
    xls.SaveAs (cdlg.FileName)
    MsgBox "Data has been saved to file:"  vbCrLf  vbCrLf _
    cdlg.FileName, vbInformation, "Data has been saved"
    Else
    MsgBox "Data has not been saved!", vbCritical, "Data has not been saved!"
    End If
    xlb.Saved = True
    xla.Quit
    End Sub
    (рис 6.9) Передача данных Access - Excel, вид формы после старта проекта и результат на листе Excel

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

    (рис 6.10) Функция MsgBox. Диалоговое окно

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

    Упрощeнный синтаксис функции: MsgBox(Prompt[, Buttons][, Title]), здесь:

  • Prompt - сообщение пользователя в выводимом диалоговом окне, на рис. 6.10: A Happy New Millenniun !!!,
  • Buttons - константа, определяющая наличие в диалоговом окне кнопок/пикторгаммм, см. табл. 6.3
  • Title - текст заголовка диалогового окна, на рис. 6.10: MsgBox-Study.
  • Кнопки MsgBox()
    Константа Значение Описание
    vbOKOnly 0 Вывод кнопки ОК
    vbOKCancel 1 Вывод кнопок OK, Cancel
    vbAbortRetryIgnore 2 Вывод кнопок Abort, Retry, Ignore
    vbYesNoCancel 3 Вывод кнопок Yes, No, Cancel
    vbYesNo 4 Вывод кнопок Yes, No
    vbRetryCancel 5 Вывод кнопок Retry, Cancel,
    vbCritical 16 Вывод пиктограммы - критическое сообщение
    vbQuestion 32 Вывод пиктограммы - вопрос
    vbExclamation 48 Вывод пиктограммы - предупреждение
    vbInformation 64 Вывод пиктограммы - информация
    vbDefaultButton1 0 Первая кнопка является кнопкой по умолчанию
    vbDefaultButton2 256 Вторая кнопка является кнопкой по умолчанию
    vbDefaultButton3 512 Третья кнопка является кнопкой по умолчанию
    vbApplicationModal 0 Нужно ответить на сообщение
    vbSystemModal 4096 Программы не выполняются до ответа пользователя на сообщение в диалоговом окне

    Пример: MsgBox("A Happy New Millennium !!!", vbOKOnly + vbExclamation, "MsgBox()-Study") После ответного действия пользователя возвращается код, по которому можно определить кнопку, нажатую пользователем, табл. 6.4.

    Возвращаемые функцией MsgBox значения
    Константа Значение Описание
    vbOk 1 Пользователь сделал щелчок на кнопке OK
    vbCancel 2 Пользователь сделал щелчок на кнопке Cancel
    vbAbort 3 Пользователь сделал щелчок на кнопке Abort
    vbIgnore 5 Пользователь сделал щелчок на кнопке Ignore
    vbYes 6 Пользователь сделал щелчок на кнопке Yes
    vbNo 7 Пользователь сделал щелчок на кнопке No

    При работе с функцией MsgBox после ввода имени функции, пробела/открывающейся скобки выводится всплывающая подсказка, содержащая синтаксис функции. После набора сообщения пользователя - Prompt и ввода символа "запятая" выводится окно со списоком констант; можно выбрать требуемую из списка (для этого нужно использовать сочетание клавиш CTRL и Enter) или ввести константу вручную. Из всплывающего списка после ввода символа + можно выбрать следующую константу. Возвращаемое функцией значение может использоваться для управления ходом выполения программы.

    Пример: переменной ккКК присваивается возвращаемое функцией значение, это значение используется далее:

    kkKK = MsgBox("Do you work ?", vbYesNoCancel + vbExclamation, "MsgBox()-Study")
    If kkKK = vbYes Then
    Form1.Print "He works !!"
    ElseIf kkKK = vbNo Then
    Form1.Print "He does not work !!"
    Else: Form1.Print "He won't work !!"
    End If

    Если возвращаемое функцией значение не используется, то используется другой синтаксис, скобки опускаются; пример: MsgBox "Kindest regards and best wishes !", 0, "regards"

    Обмен данными

    ActiveX - это набор технологий, используемых для обеспечения эффективной работы приложений типа клиент-сервер . ActiveX - часть модели COM - Component Object Model (модель многокомпонентных объектов) и обеспечивает для COM интерфейс, работающий в разнородных средах. Совокупность ActiveX (см. окно Новый проект рис. 6.11) содержит, среди прочего, следующие компоненты:

    (рис 6.11) Окно создания нового проекта
  • ActiveX EXE - предоставляет другим приложениям связанные/внедрeнные объекты и множество клиентов могут иметь доступ к этому сервер-приложению,
  • ActiveX DLL - элементы динамически подключаемой библиотеки (объектов, доступных для программирования). Их можно писать на языках, поддерживающих СОМ,
  • ActiveX Control - управляющий элемент; может использоваться в различных средах программирования,
  • ActiveX Document - приложение, которое программа, обрабатывающая сетевые документы (контейнер ActiveX документа) может интерпретировать как Web-страницу.
  • При создании проекта, реализуемого как исполняемый компонент - ActiveX.EXE (см. окно Новый проект рис. 6.11), создаeтся модуль класса, рис. 6.12

    (рис 6.12) Схема проекта

    Может быть реализована также и динамическая библиотека ActiveX.DLL (см. следующую пиктограмму на рис. 6.11). Динамические библиотеки загружаются в область памяти программы-клиентa, использующей их в данный момент (клиент должен загрузить собственную копию компонента), в то время как исполняемый ActiveX-компонент работает как приложение в своей области памяти. Аналогично, документы ActiveX можно выполнять или как исполняемые или как динамические библиотеки. Схема проекта в обоих случаях содержит по умолчанию один компонент - UserDocument, который сходен с формой. Документ выполняется в приложениях-контейнерах, обрабатывающих сетевые материалы; ему доступно почти всe, что и проекту Visual Basic. Объект PropertyBag может в течение одного рабочего сеанса сохранять, среди прочего, текстовые элементы документа, это удобно при частом обращении к документу.

    ActiveX Control после его создания помещается на панель элементов управления Visual-Basic и может быть использован в других проектах; он может исполняться в приложениях, поддерживающих ActiveX, может быть размещён на Web-страницах. ActiveX-компонет включается в программы и расширяет возможности среды разработки. ActiveX-документы - это приложения, написанные на языке Visual Basic и работающее в приложениях, обрабатывающих сетевые материалы. Материал по теме ActiveX поддерживается практиескими работами 45 и 46.

    ActiveX Control

    Приводится пример создания ActiveX Control. После создания он автоматически добавляется к объектам на панели элементов управления Visual Basic и может быть использован в проекте.

    Практическая работа 45. Создание ActiveX Control

    Выполнить следующее:

  • в окне Новый проект (рис. 6.11) выбрать элемент ActiveX Control (форма теперь будет объектом UserControl) $$\to$$ OK $$\to$$ задать имя проекта: щелчок правой клавишей мыши в окне проекта на Project1 $$\to$$ Свойства $$\to$$ в поле Имя проекта ввести MeinCont $$\to$$ OK,
  • свойству ControlContainer присвоить значение True - создать элемент-контейнер,
  • создать процедуры Timer1_Timer() и Timer2_Timer(), обеспечивающие перемещение объекта Image с рисунком и поля метки в созданном элементе-контейнере, для этого:
  • создать поле метки; присвоить значения: Label1.Caption = A Happy New Millennium !!!, AutoSize = Тrue, создать элемент управления Image (см. рис. 6.16); свойству Stretch присвоить значение True,
  • создать 2 элемента управления Timer, свойствам Interval присвоить значения 50 и 100 соответственнно,
  • создать набор параметров (свойств, методов, событий); для этого использовать программу-мастер: ActiveX Control Interface Wizard: меню Добавления $$\to$$ Менеджер расширений $$\to$$ включить флажок Загружен $$\to$$ ОК; имя программы появляется в выпадающем меню Добавления $$\to$$ стартовать эту программу. В результате действий пользователя (их последовательность дана ниже) система программирования генерирует соответствующий код (см. код ниже: курсивом выделен частично распечатанный сгенерированный системой код),
  • после старта программы-мастера во втором окне-ассистенте, рис. 6.13, нужно выбрать имеющиеся параметры из списка: свойства: BackСolor, BorderStyl, Caption, Font, ForeColor, ControlContainer, Picture, Stretch, Interval; событие Resize, для этого:
  • удалить всe содержимое правого поля за исключением параметров, перечисленных выше, добавить недостающее из левого поля в правое. Тем не менее параметров нехватает, поэтому следует:
  • перейти к следующему окну-ассистенту, рис 6.14(рис 6.13) Второе окно-ассистент - выбор имеющихся в наличии параметров (рис 6.14) Следующее окно-ассистент - создание собственных параметров
  • распределить все параметры между объектами: создаваемый элемент, поле метки, Timer, Image; для этого перейти к следующему окну-ассистенту, рис. 6.15, при этом использовать данные табл. 6.5.
    Соответствие объекты - параметры
    Name Control Member
    BackColor UserControl BackColor
    BorderStyle UserControl BorderStyle
    Caption Label1 Caption
    ControlContainer UserControl ControlContainer
    Resize UserControl Resize
    Font Label1 Font
    ForeColor Label1 ForeColor
    Interval Timer1 Interval
    Stretch Image1 Stretch
    Picture Image1 Picture
    (рис 6.15) Следующее окно-ассистент
  • cделать щелчок на кнопке Finish; код сгенерирован, его можно просмотреть,
  • сохранить проект,
  • ввести код, данный ниже (за исключением строк, данных курсивом); пояснения даны под комментариями к коду,
  • проверить функционирование созданного элемента, для этого: стартовать проeкт: выполнение проводится в приложении-Browser рис. 6.16.
  • остановить выполнение, закрыть окна кода и объект UserControl (форма); пиктограмма ActiveX Control автоматически добавляется к объектам панели элементов управления и его можно использовать в других проектах. Можно, например, выполнить следующее: меню Файл $$\to$$ Добавить проект $$\to$$ Standard.EXE $$\to$$ OK $$\to$$ разместить новый элемент на форме.
  • ' описание переменных, используемых в процедурах,
    ' обеспечивающих перемещение элементов 
    ' управления Label1, Image1
    Private Go As Integer, Go1 As Integer 
    ' обработка события объекта Timer
    Private Sub Timer1_Timer()
    GoMeinCont
    End Sub
    'WARNING! DO NOT REMOVE OR MODIFY THE FOLLOWING COMMENTED LINES!
    'MappingInfo=UserControl,UserControl,-1,BackColor
    Public Property Get BackColor() As OLE_COLOR
    BackColor = UserControl.BackColor
    End Property
    Public Property Let BackColor(ByVal New_BackColor As OLE_COLOR)
    UserControl.BackColor() = New_BackColor
    PropertyChanged "BackColor"
    End Property
    Private Sub Timer2_Timer()
    Go1MeinCont
    End Sub
    'Load property values from storage
    Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
    UserControl.BackColor = PropBag.ReadProperty("BackColor", H8000000F)
    ' центрировать элементы, задать начальные значения 
    ' переменным. Обратить внимание на использование в 
    ' данном случае события Initialize
    Private Sub UserControl_Initialize 
    Label1.Move (UserControl.Width - Label1.Width)/2, _
    (UserControl.Height - Label1.Height)/2
    Image1.Move (UserControl.Width - Image1.Width)/4, _
    (UserControl.Height - Image1.Height)/4
    Go = 1: Go1 = 2
    End Sub
    Private Sub UserControl_Resize() ' масштабировать объекты 
    Label1.Width = (ScaleWidth - Label1.Left) 
    Label1.Height = (ScaleHeight - Label1.Top) 
    Image1.Width = (ScaleWidth - Image1.Left) 
    Image1.Height = (ScaleHeight - Image1.Top) 
    End Sub
    Private Sub GoMeinCont() ' реализация перемещения
    Select Case Go
    Case 1: Label1.Move Label1.Left - 45, Label1.Top - 45
    If Label1.Left <= 0 Then
    Go = 2
    ElseIf Label1.Top <= 0 Then
    Go = 4
    End If
    Case 2: Label1.Move Label1.Left + 45, Label1.Top - 45
    If Label1.Left >= (UserControl.Width - Label1.Width) Then
    Go = 1
    ElseIf Label1.Top <= 0 Then
    Go = 3
    End If
    Case 3: Label1.Move Label1.Left + 45, Label1.Top + 45
    If Label1.Left >= (UserControl.Width - Label1.Width) Then
    Go = 4
    ElseIf Label1.Top >= (UserControl.Height - Label1.Height) Then
    Go = 2
    End If
    Case 4: Label1.Move Label1.Left - 45, Label1.Top + 45
    If Label1.Left <= 0 Then
    Go = 3
    ElseIf Label1.Top >= (UserControl.Height - Label1.Height) Then
    Go = 1
    End If
    End Select
    End Sub
    Private Sub Go1MeinCont()
    Select Case Go1
    Case 1: Image1.Move Image1.Left - 60, Image1.Top - 60
    If Image1.Left <= 0 Then
    Go1 = 2
    ElseIf Image1.Top <= 0 Then
    Go1 = 4
    End If
    Case 2: Image1.Move Image1.Left + 60, Image1.Top - 60
    If Image1.Left >= (UserControl.Width - Image1.Width) Then
    Go1 = 1
    ElseIf Image1.Top <= 0 Then
    Go1 = 3
    End If
    Case 3: Image1.Move Image1.Left + 60, Image1.Top + 60
    If Image1.Left >= (UserControl.Width - Image1.Width) Then
    Go1 = 4
    ElseIf Image1.Top >= (UserControl.Height - Image1.Height) Then
    Go1 = 2
    End If
    Case 4: Image1.Move Image1.Left - 60, Image1.Top + 60
    If Image1.Left <= 0 Then
    Go1 = 3
    ElseIf Image1.Top >= (UserControl.Height - Image1.Height) Then
    Go1 = 1
    End If
    End Select
    End Sub
    (рис 6.16) ActiveX Control

    ActiveX Document.DLL

    Приложения Visual Basic ActiveX Document выполняются в контейнере - приложении, обрабатывающем сетевые материалы. ActiveX Document обладает большими функциональными возможностями, например, применение ActiveX Document'a может предоставить внешнему пользователю сети доступ к локальным базам данных.

    Практическая работа 46. ActiveX Document.DLL

    Здесь создаeтся документ ActiveX Document.DLL, в котором используем доступ к данным посредством элемента управления Data с выводом их в поле элемента управления MSFlexGrid; тогда имеется возможность предоставить доступ к локальным базам данных пользователю сети. Документы ActiveX инициализируются (в отличие от формы) в процедуре UserDocument_Initialize (). В примере используем материалы практической работы 28 (доступ к данным с выводом результатов в поле элемента управления MSFlexGrid).

    Последовательность действий:

  • Cоздать проект типа ActiveX Document.DLL,
  • скопировать проект (практическая работа 28), при этом использовать свойство MSFlexGrid.DataSource = Data1 вместо части программы, описывающей работу с ячейками MSFlexGrid (см. комментарии к коду практической работы 28),
  • для ввода SQL-запроса добавить командную кнопку Command1 (командная кнопка практики 28 не используется), см. код, данный ниже. Первый запрос (Select Name From Student) вводится в окне свойств текстового поля,
  • ввести код, данный ниже, стартовать проект - проект выполняется в приложении Browser. Новый запрос вводится в текстовое поле, затем делается щелчок на командной кнопке, рис. 6.17
  • Private Sub UserDocument_Initialize()
    Dim i As Integer
    CommonDialog1.FileName = ""
    CommonDialog1.Action = 1
    Data1.Connect = ""
    Data1.DatabaseName = CommonDialog1.FileName
    Data1.Refresh
    For i = 0 To Data1.Database.TableDefs.Count - 1
    Combo1.AddItem (Data1.Database.TableDefs(i).Name)
    Next i
    Combo1.Text = ""
    Data1.RecordSource = Text1.Text
    Data1.Refresh
    End Sub
    
    ' SQL-запрос, вводимый в текстовое поле, присваивается 
    ' свойству RecordSource
    Private Sub Command1_Click() 
    Data1.RecordSource = Text1.Text
    Data1.Refresh
    End Sub
    (рис 6.17) ActiveX Document.DLL
    Вернуться к учебному плану