Продукты корпорации Microsoft поддерживают протокол динамического обмена данными -
Технология обмена данными между приложениями развита до такого уровня, что данные не нужно заново копировать - они после их изменения автоматически передаются через
Рассмотрим примеры использования Microsoft Access в роли сервера intChan1 = DDEInitiate("MSAccess", "C:\Winnt\Profiles\Administrator\dde6;TABLE dde1")
После этого становится возможной передача данных в другое приложение по этому каналу. Для передачи требования на пересылку, например, текстовых данных из приложения-сервера по открытому каналу DDERequest, в аргументе которой указывается номер канала связи и сформулирован запрос, пример: strResp1 = DDERequest(intChan1, "All"). После окончания передачи данных нужно вызвать в приложении-клиенте функцию DDETerminate для закрытия текущего канала обмена или функцию DDETerminateAll для закрытия всех каналов связи.
Задание: записать в файл результат запроса к данным таблицы базы данных (Access).
Порядок выполнения:
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; данные, выводимые в файл
Приводится аналогичный пример; создаются 4 таблицы: student, (рис. 6.2, рис. 6.3) stipendija, sessija, prikaz; выполняются 4 запроса (рис. 6.4, рис. 6.5), создается макрос в приложении Word (см. код, данный ниже), открываются 4 канала связи, результаты 4-х запросов по 4-м каналам связи выводятся в файлы dde621 - dde624. Пояснения к коду макроса:
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
При реализации обмена данными приложений данные/наборы данных могут представлять собой связанные или внедрeнные объекты. Связывание (Link) используется, если нужно, чтобы при изменении данных в исходном файле данные в другом файле также изменялись. Внедрение используется, если нужно использовать конечный файл (на другом компьютере) и нежелательно изменение данных в нeм при изменении исходных данных
Внедрeнный объект является частью файла, в который он вставлен. При двойном щелчке на связанном объекте он открывается в приложении, в котором он был создан; при двойном щелчке на внедрeнном объекте появляется возможность редактирования его средствами текущего приложения.
Элемент управления OLE (панель элементов управления) используется для связывания /внедрения объектов в приложениях Visual Basic. Контекстное меню OLE содержит команды:
Не все команды отображаются или являются доступными; это зависит от состояния приложения и буфера обмена. Некоторые параметры элемента управления OLE даны в табл. 6.1.
| Свойства | Пояснения |
|---|---|
Action |
Выполняемое действие. Недоступно во время разработки, возможны установочные значения в пределах 0 - 18; среди них: 0 - создаeт внедрeнный объект, 1 - создаeт |
AutoActivate |
Определяет когда активизируется объект (после двойного щелчка, после получения фокуса и т.д.) |
AutoVerbMenu |
Должно ли выводиться контекстное меню |
Class |
Идентифицирует приложение, которое создаeт OLE-объект (например, Word) |
HostName |
Содержит имя приложения, создавшего объект |
ObjectVerbs |
Список команд, применимых к OLE-объекту |
ObjectVerbsCount |
Количество таких команд (см. выше) |
OLEType |
Возвращает состояние OLE-объекта в контейнере: связанный/внедрeнный |
OLETypeAllowed |
Задание связывания, внедрения или обоих |
SizeMode |
Возвращает и задаeт режим согласования размеров элемента управления OLE и загружаемого в него объекта |
SourceDoc |
Имя файла, где находится объект (или который должен быть загружен в OLE-контейнер) |
SourceItem |
Указывает на данные объекта, которые будут связаны |
|
Определяет вид действия, которое будет выполнено при активизации объекта с помощью свойства 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, , ObjectVerbs, ObjectVerbsCount ). Эти свойства доступны во время выполнения.
Последовательность действий:
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
Рассматривается загрузка объектов (см. процедуру Form_Load () в OLE-контейнер и реализация (по желанию пользователя) связывания/внедрения (см. процедуру Public Sub LinkEmb(FileName As String, Embed As Boolean) ). Последовательность действий:
В зависимости от того, какой переключатель использован (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. При этом различают перемещение данных (после перемещения данные в источнике удаляют) и копирование данных. Для обеспечения перетаскивания действия (начало перетаскивания, сбрасывание) должны быть запрограммированы. Рассматриваются два объекта: источник - OLEDrag и приeмник - OLEDrop. В случае автоматического перетаскивания свойствам OLEDragMode, OLEDropMode элементов управления, например,
(рис 6.6) OLE
TextBox, Image должно быть присвоено значение vbOLEDragAutomatic (в окне свойств), альтернативно (ручное перетаскивание) - vbManual. Установки свойств OLEDragMode/OLEDropMode могут быть сделаны и программным путeм.
Ниже рассматриваются параметры объекта DataObject, содержащего перетаскиваемые данные. Он фигурирует в процедурах обработки событий, в которые передаeтся параметр Data (см. код). Объект (аналогичен объекту
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мник.
Последовательность действий:
Picture обоих элементов управления Image значения - 2 любых имени файла с расширением .bmp, см. рис. 6.7' установить требуемый формат данных 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 позволяет просмотреть их свойства, методы и события; можно получить также их краткое описание, выполнить поиск. При использовании в проекте объектов из другого приложения нужно сделать ссылку на библиотеку типов этого приложения.
Задание: создать программно экземпляр приложения Word; создать файл, ввести тест, сохранить файл. После создания
Последовательность действий:
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
| Kode | 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 |
' Средствами 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]), здесь:
A Happy New Millenniun !!!,| Константа | Значение | Описание |
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()- После ответного действия пользователя возвращается код, по которому можно определить кнопку, нажатую пользователем, табл. 6.4.
| Константа | Значение | Описание |
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 (см. окно Новый проект рис. 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. После создания он автоматически добавляется к объектам на панели элементов управления Visual Basic и может быть использован в проекте.
Выполнить следующее:
(рис 6.14) Следующее окно-ассистент - создание собственных параметров
| 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) Следующее окно-ассистент
' описание переменных, используемых в процедурах,
' обеспечивающих перемещение элементов
' управления 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
Приложения Visual Basic ActiveX Document выполняются в контейнере - приложении, обрабатывающем сетевые материалы. ActiveX Document обладает большими функциональными возможностями, например, применение ActiveX Document'a может предоставить внешнему пользователю сети доступ к локальным базам данных.
Здесь создаeтся документ ActiveX Document.DLL, в котором используем доступ к данным посредством элемента управления Data с выводом их в поле элемента управления MSFlexGrid; тогда имеется возможность предоставить доступ к локальным базам данных пользователю сети. Документы ActiveX инициализируются (в отличие от формы) в процедуре UserDocument_Initialize (). В примере используем материалы практической работы 28 (доступ к данным с выводом результатов в поле элемента управления MSFlexGrid).
Последовательность действий:
MSFlexGrid.DataSource = Data1 вместо части программы, описывающей работу с ячейками MSFlexGrid (см. комментарии к коду практической работы 28),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 поддерживают протокол динамического обмена данными -
Технология обмена данными между приложениями развита до такого уровня, что данные не нужно заново копировать - они после их изменения автоматически передаются через
Рассмотрим примеры использования Microsoft Access в роли сервера intChan1 = DDEInitiate("MSAccess", "C:\Winnt\Profiles\Administrator\dde6;TABLE dde1")
После этого становится возможной передача данных в другое приложение по этому каналу. Для передачи требования на пересылку, например, текстовых данных из приложения-сервера по открытому каналу DDERequest, в аргументе которой указывается номер канала связи и сформулирован запрос, пример: strResp1 = DDERequest(intChan1, "All"). После окончания передачи данных нужно вызвать в приложении-клиенте функцию DDETerminate для закрытия текущего канала обмена или функцию DDETerminateAll для закрытия всех каналов связи.
Задание: записать в файл результат запроса к данным таблицы базы данных (Access).
Порядок выполнения:
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; данные, выводимые в файл
Приводится аналогичный пример; создаются 4 таблицы: student, (рис. 6.2, рис. 6.3) stipendija, sessija, prikaz; выполняются 4 запроса (рис. 6.4, рис. 6.5), создается макрос в приложении Word (см. код, данный ниже), открываются 4 канала связи, результаты 4-х запросов по 4-м каналам связи выводятся в файлы dde621 - dde624. Пояснения к коду макроса:
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
При реализации обмена данными приложений данные/наборы данных могут представлять собой связанные или внедрeнные объекты. Связывание (Link) используется, если нужно, чтобы при изменении данных в исходном файле данные в другом файле также изменялись. Внедрение используется, если нужно использовать конечный файл (на другом компьютере) и нежелательно изменение данных в нeм при изменении исходных данных
Внедрeнный объект является частью файла, в который он вставлен. При двойном щелчке на связанном объекте он открывается в приложении, в котором он был создан; при двойном щелчке на внедрeнном объекте появляется возможность редактирования его средствами текущего приложения.
Элемент управления OLE (панель элементов управления) используется для связывания /внедрения объектов в приложениях Visual Basic. Контекстное меню OLE содержит команды:
Не все команды отображаются или являются доступными; это зависит от состояния приложения и буфера обмена. Некоторые параметры элемента управления OLE даны в табл. 6.1.
| Свойства | Пояснения |
|---|---|
Action |
Выполняемое действие. Недоступно во время разработки, возможны установочные значения в пределах 0 - 18; среди них: 0 - создаeт внедрeнный объект, 1 - создаeт |
AutoActivate |
Определяет когда активизируется объект (после двойного щелчка, после получения фокуса и т.д.) |
AutoVerbMenu |
Должно ли выводиться контекстное меню |
Class |
Идентифицирует приложение, которое создаeт OLE-объект (например, Word) |
HostName |
Содержит имя приложения, создавшего объект |
ObjectVerbs |
Список команд, применимых к OLE-объекту |
ObjectVerbsCount |
Количество таких команд (см. выше) |
OLEType |
Возвращает состояние OLE-объекта в контейнере: связанный/внедрeнный |
OLETypeAllowed |
Задание связывания, внедрения или обоих |
SizeMode |
Возвращает и задаeт режим согласования размеров элемента управления OLE и загружаемого в него объекта |
SourceDoc |
Имя файла, где находится объект (или который должен быть загружен в OLE-контейнер) |
SourceItem |
Указывает на данные объекта, которые будут связаны |
|
Определяет вид действия, которое будет выполнено при активизации объекта с помощью свойства 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, , ObjectVerbs, ObjectVerbsCount ). Эти свойства доступны во время выполнения.
Последовательность действий:
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
Рассматривается загрузка объектов (см. процедуру Form_Load () в OLE-контейнер и реализация (по желанию пользователя) связывания/внедрения (см. процедуру Public Sub LinkEmb(FileName As String, Embed As Boolean) ). Последовательность действий:
В зависимости от того, какой переключатель использован (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. При этом различают перемещение данных (после перемещения данные в источнике удаляют) и копирование данных. Для обеспечения перетаскивания действия (начало перетаскивания, сбрасывание) должны быть запрограммированы. Рассматриваются два объекта: источник - OLEDrag и приeмник - OLEDrop. В случае автоматического перетаскивания свойствам OLEDragMode, OLEDropMode элементов управления, например,
(рис 6.6) OLE
TextBox, Image должно быть присвоено значение vbOLEDragAutomatic (в окне свойств), альтернативно (ручное перетаскивание) - vbManual. Установки свойств OLEDragMode/OLEDropMode могут быть сделаны и программным путeм.
Ниже рассматриваются параметры объекта DataObject, содержащего перетаскиваемые данные. Он фигурирует в процедурах обработки событий, в которые передаeтся параметр Data (см. код). Объект (аналогичен объекту
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мник.
Последовательность действий:
Picture обоих элементов управления Image значения - 2 любых имени файла с расширением .bmp, см. рис. 6.7' установить требуемый формат данных 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 позволяет просмотреть их свойства, методы и события; можно получить также их краткое описание, выполнить поиск. При использовании в проекте объектов из другого приложения нужно сделать ссылку на библиотеку типов этого приложения.
Задание: создать программно экземпляр приложения Word; создать файл, ввести тест, сохранить файл. После создания
Последовательность действий:
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
| Kode | 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 |
' Средствами 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]), здесь:
A Happy New Millenniun !!!,| Константа | Значение | Описание |
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()- После ответного действия пользователя возвращается код, по которому можно определить кнопку, нажатую пользователем, табл. 6.4.
| Константа | Значение | Описание |
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 (см. окно Новый проект рис. 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. После создания он автоматически добавляется к объектам на панели элементов управления Visual Basic и может быть использован в проекте.
Выполнить следующее:
(рис 6.14) Следующее окно-ассистент - создание собственных параметров
| 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) Следующее окно-ассистент
' описание переменных, используемых в процедурах,
' обеспечивающих перемещение элементов
' управления 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
Приложения Visual Basic ActiveX Document выполняются в контейнере - приложении, обрабатывающем сетевые материалы. ActiveX Document обладает большими функциональными возможностями, например, применение ActiveX Document'a может предоставить внешнему пользователю сети доступ к локальным базам данных.
Здесь создаeтся документ ActiveX Document.DLL, в котором используем доступ к данным посредством элемента управления Data с выводом их в поле элемента управления MSFlexGrid; тогда имеется возможность предоставить доступ к локальным базам данных пользователю сети. Документы ActiveX инициализируются (в отличие от формы) в процедуре UserDocument_Initialize (). В примере используем материалы практической работы 28 (доступ к данным с выводом результатов в поле элемента управления MSFlexGrid).
Последовательность действий:
MSFlexGrid.DataSource = Data1 вместо части программы, описывающей работу с ячейками MSFlexGrid (см. комментарии к коду практической работы 28),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
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.