Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
17
Добавлен:
14.12.2015
Размер:
72.66 Кб
Скачать

6 6. Лекция: Обмен данными: версия для печати и PDA

Рассматривается DDE - динамический обмен данными и следующий этап разработки в области обмена данными - OLE. Особый интерес представляет практическая работа 44 - передача данных между приложениями Access и Excel. Приводятся две практические работы, относящиеся к области ActiveX - технологии, обеспечивающей эффективную работу приложений типа клиент- сервер.   Продукты корпорации 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.

  Таблица 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.

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

  создать ссылку на библиотеку объектов: Проект Ссылки 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 Таблица 6.2. Анализ прибыли, фрагмент 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 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.

  Таблица 6.3. Кнопки 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.

  Таблица 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) OK задать имя проекта: щелчок правой клавишей мыши в окне проекта на Project1 Свойства в поле Имя проекта ввести MeinCont 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: меню Добавления Менеджер расширений включить флажок Загружен ОК; имя программы появляется в выпадающем меню Добавления стартовать эту программу. В результате действий пользователя (их последовательность дана ниже) система программирования генерирует соответствующий код (см. код ниже: курсивом выделен частично распечатанный сгенерированный системой код),

после старта программы-мастера во втором окне-ассистенте, рис. 6.13, нужно выбрать имеющиеся параметры из списка: свойства: BackСolor, BorderStyl, Caption, Font, ForeColor, ControlContainer, Picture, Stretch, Interval; событие Resize, для этого: удалить всe содержимое правого поля за исключением параметров, перечисленных выше, добавить недостающее из левого поля в правое. Тем не менее параметров нехватает, поэтому следует:

перейти к следующему окну-ассистенту, рис. 6.14; ввести собственные параметры в имеющееся поле ввода, нажимая после каждого ввода кнопку Next :,  

Рис. 6.13.  Второе окно-ассистент - выбор имеющихся в наличии параметров  

   

Рис. 6.14.  Следующее окно-ассистент - создание собственных параметров  

 

распределить все параметры между объектами: создаваемый элемент, поле метки, Timer, Image; для этого перейти к следующему окну-ассистенту, рис. 6.15, при этом использовать данные табл. 6.5. Таблица 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 автоматически добавляется к объектам панели элементов управления и его можно использовать в других проектах. Можно, например, выполнить следующее: меню Файл Добавить проект Standard.EXE OK разместить новый элемент на форме.

  ' описание переменных, используемых в процедурах, ' обеспечивающих перемещение элементов ' управления 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

Соседние файлы в папке INTUIT Лекции Visual Basic