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.

Hosted by uCoz