OLE-компоненты, входящие в комплект поставки Visual FoxPro
В состав профессиональной версии Visual FoxPro входит несколько OLE-компонентов в формате OCX. Число компонентов зависит от той Windows-платформы, на которую вы устанавливаете FoxPro.
В настоящей статье дается описание каждого из компонентов и приводятся принципы их использования. Мы рассмотрим следующие OLE-компоненты:
MSCOMM32.OCX: для использования в коммуникационных программах. MSMAPI32.OCX: для работы с интерфейсом MAPI (Messaging Application Program Interface). MSOUTL32.OCX: для вывода данных в иерархическом виде. PICCLP32.OCX: для вывода графики.
Обзор OLE-компонентов
В состав профессиональной версии Visual FoxPro входит несколько компонентов в виде OCX, которые вы можете использовать в разрабатываемых приложениях. В зависимости от платформы, на которую вы устанавливаете Visual FoxPro (Windows 3.1, Windows for Workgroups, Windows NT или Windows 95), число таких компонентов составляет до четырех. Эти компоненты устанавливаются в системный каталог Windows.
Свойство, метод или событие могут относиться к контейнеру (форме) или самому компоненту Важно понимать, что при работе с компонентом многие свойства, события или методы устанавливаются не непосредственно для самого компонента, а для контейнера, в который этот компонент помещен.
Например, свойство MAPI DownLoadMail относится непосредственно к компоненту MAPI, тогда как MAPI DocumentFile относится к контейнеру, в котором помещен компонент. В результате эти свойства для компонента MAPI устанавливаются следующим образом:
<ИмяФормы>.DocumentFile <ИмяКомпонента>.DownLoadMail
Пример кода использования компонента Приведенный ниже код показывает каким образом в форму можно добавить OLE-контейнер и как его можно использовать для модификации таблицы Microsoft Excel из программы на Visual FoxPro:
* В нашем примере мы добавим * OLE-контейнер на форму и с использованием * свойств OleClass и DocumentFile * определим Microsoft Excel в качестве * OLE-сервера, а таблицу Microsoft Excel * в качестве объекта редактирования. * * Свойство DocumentFile определяет * таблицу в файле с именем BOOK1.XLS в * каталоге EXCEL на диске C. * Если ваша структура каталогов отличается, * то прежде чем запустить пример * вам нужно отредактировать программу и * указать ей действительно существующий файл * и каталог (свойство DocumentFile). * * Для перехода в режим редактирования * документа используется метод DoVerb * Создаем форму frmMyForm = CREATEOBJECT('Form') * Отключаем элемент управления frmMyForm.Closable = .F. * Добавляем кнопку frmMyForm.AddObject ; ('cmdCommand1','cmdMyCmdBtn') * Добавляем OLE-объект frmMyForm.AddObject ; ("oleObject","oleExcelObject") * Делаем кнопку видимой frmMyForm.cmdCommand1.Visible=.T. * Делаем OLE-объект видимым frmMyForm.oleObject.Visible=.T. * Определяем высоту OLE-объекта frmMyForm.oleObject.Height = 50 * Делаем форму видимой frmMyForm.Show * Значение -1 означает режим редактирования frmMyForm.oleObject.DoVerb(-1) * Начинаем обработку событий READ EVENTS * Имя OLE-сервера DEFINE CLASS oleExcelObject as OLEControl OleClass ="Excel.Sheet" * Этот файл должен существовать DocumentFile = "C:\EXCEL\BOOK1.XLS" ENDDEFINE * Создаем кнопку DEFINE CLASS cmdMyCmdBtn AS CommandButton * Определяем текст на кнопке Caption = '\<Quit' * Принимаем ее по умолчанию * на нажатие клавиши Esc Cancel = .T. * Определяем положение кнопки Left = 125 Top = 210 * Определяем высоту кнопки Height = 25 PROCEDURE Click * Прекращаем обработку событий и * закрываем форму CLEAR EVENTS ENDDEFINE * Конец примера
Компонент для использования в коммуникационных программах (MSCOMM32.OCX)
Синтаксис: MSComm.Компонент MSCOMM32.OCX дает вашему приложению возможность осуществлять связь по последовательному порту для приема или передачи данных. Этот компонент устанавливается только если вы инсталлируете Visual FoxPro под Windows NT или Windows 95.
Компонент предоставляет следующие два способа работы с портом:
Использование событийно-управляемых коммуникаций для обработки взаимодействия с портом. Во многих ситуациях вам необходимо получить уведомление о возникновении определенного события, например, о получении символа или изменении состояния, Carrier Detect (CD) или Request To Send (RTS). В этих случаях вы можете использовать событие OnComm компонента для перехвата и обработки. Событие OnComm также позволяет перехватывать и обрабатывать ошибки связи.
Опрашивание на наличие событий путем проверки значения свойства CommEvent после выполнения каждой важной операции вашей программы. Если ваше приложение невелико и самодостаточно, то это может быть наилучший метод. Например, если вы пишете небольшую программу для набора телефонного номера, может оказаться более удобным генерировать событие после передачи каждого символа, так как все, что может поступить в ответ, - это OK от модема.
Каждый компонент, который вы используете, соединяется с одним последовательным портом. Если вы предполагаете обращаться к более чем одному порту, вам необходимо использовать соответствующее число компонентов. Адрес и прерывание, на котором "сидит" порт, можно настроить через панель управления Windows.
При распространении приложений, использующих MSCOMM32.OCX, вам необходимо инсталлировать этот файл в системный каталог Windows.
В приведенном ниже примере показано как можно выполнить основные обращения к последовательному порту:
* Используем COM1. Comm1.CommPort = 1 * 9600 бод, без четности, * 8 бит данных и 1 стоп-бит. Comm1.Settings = "9600,N,8,1" * Укажите, что компонент должен * читать весь буфер при вводе Comm1.InputLen = 0 * откройте порт Comm1.PortOpen = .T. * Посылаем первую команду модему. Comm1.Output = "AT" + CHR(13) * Ждем, пока вернутся данные DO WHILE Comm1.InBufferCount <= 2 * Ждем, пока не получим в ответ "OK". InString = Comm1.Input ENDDO * Закрываем порт. Comm1.PortOpen = .F.MAPI-компонент (MSMAPI32.OCX)
Компонент, использующий MAPI (Messaging Application Program Interface), позволяет создавать приложения Visual FoxPro, которые работают с электронной почтой. Этот компонент инсталлируется только если вы устанавливаете Visual FoxPro на Windows NT или Windows 95.
MAPI-компоненты невидимы на форме во время исполнения. Кроме того, эти компоненты не обрабатывают события. Для использования этих компонентов вам необходимо определить соответствующие методы. Для работы компоненты требуют наличия сервисов MAPI (MAPI Services). Эти сервисы предоставляются системой электронной почты Microsoft Mail версии 3.0 или более поздней.
MAPI OLE-компонентыПри использовании компонента MSMAPI32.OCX вы можете создать два OLE-объекта: MAPI Session и MAPI Messages. Объект MAPI Session определяет MAPI-сессию, а объект MAPI Messages позволяет пользователю выполнить ряд действий по работе с системой сообщений.
Объект MAPI Session
Синтаксис: MapiSession.
Объект MAPI Session выполняет подключение, установку MAPI-сессии и отключение от сессии.
После успешного подключения в свойстве SessionID хранится указатель сессии. Этот указатель необходимо передать объекту MAPI Messages, иначе при попытке использования этого объекта будет выдано сообщение об ошибке. Кроме того, необходимо выполнить принудительное отключение после завершения сессии.
Объект MAPI Messages
Синтаксис: MapiMessages.
После того как сессия создана посредством использования объекта MAPI Session, объект MAPI Messages выполняет ряд функций работы с системой сообщений.
При использовании объекта MAPI Messages вы можете:
Получать доступ к письмам, находящимся в почтовом ящике (inbox).
Готовить новые письма.
Добавлять и удалять получателей письма и создавать/удалять вложения (attachments) в письмо.
Посылать письма с использованием пользовательского интерфейса или без него.
Сохранять, копировать и удалять сообщения.
Выводить диалоговое окно со списком адресов (Address Book).
Выводить диалоговое окно с дополнительной информацией об адресате.
Обрабатывать вложения в письма, в том числе и те, доступ к которым организован через протокол OLE Automation.
Определять полное имя адресата при отправке письма.
Создавать ответ, ответ всем и переадресовку (reply, reply-all и forward) писем.
Большинство свойств объекта MAPI Messages может быть разделено на четыре категории: работа с адресной книгой, работа с вложениями, работа с собственно письмом и параметры адресата. Вложение, письмо и адресат контролируются свойствами AttachmentIndex, MsgIndex и RecipIndex соответственно.
Например, при изменении значения индекса свойства MsgIndex все остальные свойства письма, вложения, адресата меняются для отражения характеристик соответствующего письма. Набор свойств письма и адресата работает аналогично. Свойства адресной книги отражают внешний вид диалогового окна Address Book.
При использовании объекта MAPI Messages вам необходимо отслеживать значения двух буферов: буфера чтения и буфера составления письма (read buffer и compose buffer).
Буфер чтения включает информацию об индексированном наборе писем, полученных из почтового ящика адресата. Свойство MsgIndex используется для доступа к индивидуальным письмам. Индекс первого письма равен 0 и увеличивается на единицу для каждого последующего. Набор сообщений формируется использованием метода Fetch.
Набор писем включает все письма, характеристики которых соответствуют свойству FetchMsgType. Сортировка писем в наборе соответствует установке FetchSorted. Ранее прочитанные сообщения могут быть отброшены при создании набора. Это достигается соответствующей установкой свойства FetchUnreadOnly.
Сообщения в буфере чтения не могут быть модифицированы непосредственно в нем, но могут быть скопированы в буфер составления письма для изменения.
Буфер составления письма служит для создания новых или редактирования существующих писем. Если свойство MsgIndex равно -1, то буфер составления письма является активным. Большинство действий над сообщениями могут быть выполнены только в буфере составления письма, к таким действиям относятся посылка сообщений, сохранение сообщений, удаление адресатов и вложений.
Компонент для представления данных в иерархическом виде (MSOUTL32.OCX)
Синтаксис: Outline.
Этот компонент представляет собой особый вид списка, позволяющего представить иерархию элементов в списке. Это может быть полезно для представления информации о дисках и каталогах, подобно тому, как это сделано в Windows File Manager.
Каждый элемент в этом компоненте может иметь подчиненные элементы, обычно представленные отступом. При раскрытии очередного уровня подчиненные элементы видны, при закрытии уровня эти элементы также скрываются. Для более наглядного представления в каком состоянии (открытом или закрытом) находится уровень можно использовать пиктограммы.
Визуальные элементы Outline Control
Outline Control может использовать символы "+", "-", пиктограммы и текст для каждого элемента в списке. Пример использования символов "+", "-" и текста и пример использования линий, связывающих элементы, пиктограммы и текст, показан на рис. 1.
С каждым элементом в списке могут быть связаны следующие графические элементы:
При щелчке на знаке "+" подчиненные элементы становятся видимыми, и знак "+" заменяется на знак "-". При щелчке на знаке "-" подчиненные элементы скрываются, и знак заменяется на "+".
Пиктограммы: определяют состояние элемента. Например, пиктограмма закрытой папки показывает, что элемент может быть раскрыт (аналогично знаку "+"). Состояние элемента определяется разработчиком. С пиктограммой связаны события PictureClick и PictureDblClick.
Текст: строка описания элемента. Каждый графический элемент может представлять собой "активную область" (hot-spot). Щелчок на активной области вызывает особый набор событий. Использование свойства Style позволяет показать все, некоторые или ни один из упомянутых графических элементов Outline Control.
Примечание: вы не можете выбрать элемент щелчком на графическом элементе Outline Control. Для выбора элемента необходимо один или два раза щелкнуть на текстовом пояснении элемента.
Помимо мыши для выбора элементов можно использовать клавиатуру. В приведенной ниже таблице перечислены клавиши и вызываемые ими действия:
Клавиша Действие Left Arrow Перемещает фокус на родительский элемент, если текущий элемент имеет таковой. Right Arrow Перемещает фокус на первый подчиненный элемент, если такой имеется. Up Arrow Перемещает фокус на предыдущий элемент, если такой есть. Down Arrow Перемещает фокус на следующий элемент, если такой есть. Home Перемещает фокус на первый элемент в списке. End Перемещает фокус на последний видимый элемент. Page Up Перемещает фокус на одну страницу назад или на первый видимый элемент. Page Down Перемещает фокус на одну страницу вперед или на последний видимый элемент. Плюс (+) Раскрывает элемент, у которого есть подчиненные элементы. Минус (-) Закрывает элемент, у которого есть подчиненные элементы.
Ниже приведена поэтапная инструкция по выводу диалогового окна со свойствами Outline Control:
Создайте новую форму или откройте существующую в конструкторе форм.
На панели инструментов Form Controls щелкните на кнопке OLE Container Control и поместите OLE Control на форму. После этого появится диалоговое окно Insert Object.
В диалоговом окне Insert Object выберите пункт Insert Control.
В списке Control Type выберите Outline Control.
Щелкните на кнопке OK. На форме появится Outline Control.
Щелкните правой клавишей мыши на Outline Control чтобы появилось контекстное меню.
Из контекстного меню выберите пункт Properties. Появится диалоговое окно Properties.
Вкладки окна Outline Control Properties
В диалоговом окне Outline Control Properties имеется несколько вкладок, которые позволяют определить характеристики объекта:
Компонент для вывода графики (Picture Clip Control - PICCLP32.OCX)
Синтаксис: PictureClip.
Данный компонент позволяет выбрать область на растровом рисунке и затем вывести этот участок на форме. Объекты, созданные с помощью Picture Clip Control, невидимы во время исполнения.
Picture Clip Control предлагает эффективный способ хранения многочисленных рисунков, используемых вашим приложением. Вместо того чтобы иметь множество файлов с изображениями в формате BMP или ICO, вы можете создать одну картинку со всеми графическими ресурсами, необходимыми вашему приложению. При необходимости обратиться к индивидуальной картинке вы можете использовать Picture Clip Control для выбора области на исходном изображении, которое содержит всю необходимую графику.
Ссылка на графический объект, которую создает Picture Clip Control для графического файла, может быть использована только другими OLE-компонентами. Это может быть графика, используемая Outline Control и определяемая для свойств PictureOpen и PictureClosed. Объекты самого Visual FoxPro не могут использовать ссылку, которую создает Picture Clip Control.
Вы можете использовать способы Random Access или Enumerated Access для указания области на исходной картинке. Это делается следующим образом:
Используйте Random Access для выбора любого участка исходной картинки и области вырезания (clipping region). Укажите положение верхнего левого угла области вырезания посредством свойств ClipX и ClipY. Свойства ClipHeight и ClipWidth определяют размеры области вырезания. Этот способ полезен для вывода части изображения.
Используйте Enumerated Access для разделения изображения на определенное число столбцов и строк. В результате вы получаете однородную матрицу с номерами ячеек 0, 1, 2 и т. д. Используя свойство GraphicCell, вы можете обращаться к индивидуальным ячейкам. Это удобно, когда изображение представляет собой набор более мелких изображений, к которым вам нужно обращаться индивидуально.
Для загрузки изображения в Picture Clip Control используйте свойство Picture. Picture Clip Control работает только с изображениями в формате BMP.
Примечание: при распространении приложений, использующих Picture Clip, вам следует поместить PICCLP32.OCX в системный каталог WINDOWS.
Диалоговое окно свойств PicClip
Диалоговое окно назначения свойств компонента PicClip позволяет определить поведение компонента, являющегося OLE-контейнером, позволяющим выбрать область на исходном рисунке и вывести эту область на форме. Ниже приведена поэтапная инструкция по выводу диалогового окна со свойствами PicClip:
Создайте новую форму или откройте существующую в конструкторе форм.
На панели инструментов Form Controls щелкните на кнопке OLE Container Control и поместите OLE Control на форму. После этого появится диалоговое окно Insert Object.
В диалоговом окне Insert Object выберите пункт Insert Control.
В списке Control Type выберите PicClip.
Щелкните на кнопке OK. На форме появится Outline Control.
Щелните правой клавишей мыши на Outline Control для вывода контекстного меню.
Из контекстного меню выберите пункт Properties. Появится диалоговое окно Properties.
Вкладки окна Properties
В диалоговом окне PipClip Control Properties есть следующие вкладки:
Пример использования компонента Outline Control
В нашем примере пользователь выбирает базу данных, и все таблицы, поля и индексы выводятся в иерархическом виде с использованием Outline Control.
**** Пример 1 *** *: TEST PUBLIC frm1 frm1=CREA('Myform') frm1.SHOW FOR i=1 TO frm1.CONTROLCOUNT frm1.CONTROLS(i).VISIBLE=.T. ENDFOR *:********************************************* *: *: Class:myform BaseClass: FORM *: *:********************************************* DEFINE CLASS myform AS FORM SCALEMODE=3 WIDTH=600 HEIGHT=600 ADD OBJECT CtnOle AS cont1 ADD OBJECT cmd1 AS cmdbtn PROCEDURE INIT THISFORM.CtnOle.ole1.ADDITEM('test') THISFORM. CtnOle.ole1.ADDITEM('test1') THISFORM. CtnOle.ole1.indent(0)=1 THISFORM. CtnOle.ole1.indent(1)=2 ENDPROC ENDDEFINE *:********************************************* *: *: Class:Cont1 BaseClass: CONTAINER *: *:********************************************* DEFINE CLASS Cont1 AS CONTAINER WIDTH=400 TOP=50 LEFT=50 HEIGHT=400 ADD OBJECT ole1 AS OleCtrl ENDDEFINE *:********************************************* *: *: Class:OleCtrl BaseClass: OLECONTROL *: *:********************************************* DEFINE CLASS OleCtrl AS OLECONTROL OLECLASS='MSoutl.outline' TOP=60 LEFT=60 WIDTH=280 HEIGHT=250 VISIBLE=.T. ENDDEFINE *:********************************************* *: *: Class:cmdbtn BaseClass: COMMANDBUTTON *: *:********************************************* DEFINE CLASS cmdbtn AS COMMANDBUTTON TOP=80 LEFT=460 HEIGHT=30 WIDTH=100 VISIBLE=.T. CAPTION="Move" PROCEDURE CLICK THISFORM.CtnOle.ole1.MOVE(120,120,200) ENDPROC ENDDEFINE **** Конец примера 1 *** Следующий пример демонстрирует использование оператора "::" для вызова метода Init компонента Outline Control. * Пример 2 PUBLIC oForm oForm=CREATE('form') oForm.ADDOBJECT('oRedOutl','out1') oForm.oRedOutl.VISIBLE=.T. oForm.oRedOutl.CLICK oForm.SHOW *:********************************************* *: *: Class:out BaseClass: OLECONTROL *: *:********************************************* DEFINE CLASS out AS OLECONTROL TOP = 24 LEFT = 24 HEIGHT = 193 WIDTH = 289 OLECLASS='msoutl.outline' PROCEDURE INIT THIS.ADDITEM('test') THIS.ADDITEM('test') THIS.ADDITEM('test') THIS.ADDITEM('test') THIS.ADDITEM('test') THIS.ADDITEM('test') THIS.indent(0)=1 THIS.indent(1)=2 THIS.indent(2)=2 THIS.indent(3)=2 THIS.indent(4)=2 THIS.indent(5)=2 ENDPROC ENDDEFINE *:********************************************* *: *: Class:out1 BaseClass: out *: *:********************************************* DEFINE CLASS out1 AS out PROCEDURE INIT out::INIT THIS.OBJECT.BACKCOLOR = RGB(255,0,0) ENDPROC PROCEDURE CLICK WAIT WINDOW ENDPROC ENDDEFINE **** Конец примера 2 ***
В качестве примера использования формы (файла SCX), использующей Outline Control, посмотрите OUTLINE1.SCX, расположенный в каталоге VFP\SAMPLES\OLE.