Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MB_REF_7.pdf
Скачиваний:
25
Добавлен:
13.02.2015
Размер:
2.96 Mб
Скачать

Оператор DDEExecute

Оператор DDEExecute

Назначение:

Посылает на выполнение команду для другой программы по каналу DDE-связи (динамического обмена данными).

Предупреждение:

Использование этого оператора возможно только в среде Microsoft Windows.

Синтаксис:

DDEExecute channel , command

где

channel – номер открытого канала DDE-связи, целое число;

command – команда, посылаемая для выполнения в другую программу (DDE-сервер), строковая величина.

Описание:

Посылает на выполнение команду в другую программу, присоединенную к каналу DDE-связи.

Номер канала должен быть задан функцией DDEInitiate( ), которая открывает канал динамического обмена данными. Оператор DDEExecute возможен только после выполнения функции DDEInitiate( ). Параметр command должен зависеть от той программы, которой будет послана команда. Обе программы должны поддерживать DDE-связь. Правильный формат команды зависит от правил, принятых в подсоединенной программе. Вы должны изучить документацию другой программы, прежде чем налаживать DDE-связь.

Ошибки:

Оператор может генерировать следующие коды ошибок: ERR_CMD_NOT_SUPPORTED, если программа выполняется не в среде Windows; ERR_NO_RESPONSE_FROM_APP, если программа-сервер не отвечает.

Пример:

Программными средствами MapBasic Вы можете открыть канал DDE-связи c Microsoft Excel и обращаться к нему как к программе-серверу. Если канал был открыт для объекта (topic) "System", Вы можете выполнить как команду, так и макрофункцию Excel. В следующем примере открывается рабочая таблица "TRIAL.XLS" в программе Excel:

Dim i_chan As Integer

i_chan = DDEInitiate("Excel", "System")

DDEExecute i_chan, "[OPEN(""C:\DATA\TRIAL.XLS"")]"

Смотрите также:

DDEInitiate, DDEPoke, DDERequest$( )

186

Справочник MapBasic

Функция DDEInitiate( )

Функция DDEInitiate( )

Назначение:

Открывает новый канал DDE-связи и возвращает его номер.

Предупреждение:

Использование этой функции возможно только в среде Microsoft Windows.

Синтаксис:

DDEInitiate(appl_name, topic_name)

где

appl_name – имя подсоединяемой программы (например, "MapInfo"), строковая величина; topic_name – имя документа или некоторого объекта (topic) программы (например, "System"), строковая величина.

Величина, полученная в результате:

Целое число. Величина типа Integer.

Описание:

Функция инициирует один канал DDE-связи (динамического обмена данными), назначая ему номер.

Этот канал связи позволяет соединить две программы, работающие в среде Microsoft Windows, для пересылки информации. Как только канал открыт, MapBasic может читать информацию из документа другой программы (функция DDERequest$( )) или записывать в этот документ (оператор DDEPoke). После информационного обмена каналы связи рекомендуется закрыть, используя операторы DDETerminate или DDETerminateAll.

DDE-связь возможна только в среде Microsoft Windows. И, если Ваше приложение будет обращаться к услугам DDE в среде другой вычислительной платформы, то MapBasic выдаст ошибку. Для обхода такого рода конфликта, Вы можете определить, в какой среде выполняется Ваша программа с помощью функции SystemInfo( ).

Параметр appl_name задает имя программы, которое понятно для DDE-связи (например, для Microsoft Excel имя "Excel"). Программа, с которой связывается MapBasic, должна быть уже загружена перед выполнением функции DDEInitiate( ). Из программы на MapBasic это можно сделать при помощи оператора Run Program.

Замечание: Не все программы Windows поддерживают DDE-связь. Для получения информации о поддержке DDE смотрите документацию этих программ.

Параметр topic_name задает некоторый объект для программы и зависит от нее. Каждая программа обладает некоторым набором объектов. О списке объектов, сопровождающих определенную программу, Вы можете прочитать в соответствующей документации. Для многих программ именем объекта является имя файла документа. Например, пусть "ORDERS.XLS" – имя файла рабочей таблицы программы Microsoft Excel и канал связи с ним открывается так:

Dim i_chan As Integer

i_chan = DDEInitiate("Excel", "C:\ORDERS.XLS")

Многие программы поддерживают специальный объект "System". Начав DDE-обмен, используя объект "System", Вы можете с помощью функции DDERequest$( ) получить список строк, представляющих корректные имена объектов, поддерживаемые данной программой, например, список открытых файлов. Получив список открытых файлов, можно начать новый сеанс DDE-связи с любым документом.

Справочник MapBasic

187

Функция DDEInitiate( )

В следующей таблице приводится список некоторых программ и их объектов для использования в функции DDEInitiate( ):

Вызов функции

Что происходит при DDE8обмене

DDEInitiate("Excel", "System")

Функция DDERequest$( ) может извлечь системную

 

информацию Excel, такую, как список рабочих таблиц,

 

загруженных сейчас в среде Excel, и оператор DDEEx-

 

ecute может послать команду на выполнение в Excel.

DDEInitiate("Excel", wks)

Если wks – это имя документа Excel (например,

 

"Sheet1" или "May.xls"), то следующий оператор DDE

 

Poke может поместить какую-нибудь величину в

 

таблицу Excel и функция DDERequest$( ) может

 

прочитать информацию из нее.

DDEInitiate("MapInfo", "System")

Следующая функция DDERequest$( ) может извлечь

 

такую информацию, как список выполняемых сейчас в

 

MapInfo программ MapBasic.

DDEInitiate("MapInfo", mbx)

Если mbx – это имя программы на MapBasic, которая

 

сейчас выполняется (например, "C:\GRIDS.MBX"), то

 

следующий оператор DDEPoke может назначить

 

какую-нибудь величину глобальной переменной

 

определенной программы MapBasic и функция

 

DDERequest$( ) может прочитать текущее значение

 

такой переменной.

Когда программа MapBasic выполняет функцию DDEInitiate( ), то MapBasic выступает как "клиент" в DDE-связи. Другие программы Windows выступают как программы-"серверы". В пределах одной связи клиент всегда активен, а сервер только отвечает на запросы клиента. MapBasic может поддерживать одновременно сразу столько каналов, сколько могут позволить ресурсы памяти и системы Вашего компьютера.

Прикладная программа одновременно может быть как клиентом в сеансе одной связи (выполняя такие операторы как DDEInitiate( ) и др.), так и сервером для другого сеанса связи (выполняя процедуру со стандартным именем RemoteMsgHandler).

Ошибки:

Функция может вернуть следующие коды ошибок: ERR_CMD_NOT_SUPPORTED, если программа выполняется не в среде Windows; ERR_INVALID_CHANNEL, если неправильно задан номер канала.

Пример:

Следующий фрагмент текста программы иллюстрирует DDE-связь Microsoft Excel. Целью является передача простого сообщения ("Привет от MapInfo!") в первую ячейку первой рабочей таблицы, но только если она пуста. Если ячейка не пуста, ничего записываться не будет, содержимое ячейки будет показано пользователю MapInfo.

Dim chan_num, tab_marker As Integer

Dim topiclist, topicname, cell As String

188

Справочник MapBasic

Функция DDEInitiate( )

chan_num = DDEInitiate("EXCEL", "System") If chan_num = 0 Then

Note "Простите, но Excel не отзывается." End Program

End If

'Вызов списка документов – рабочих таблиц сейчас

'загруженных в среде Excel

topiclist = DDERequest$(chan_num, "topics")

'Здесь должен быть получен список topiclist

'с элементами в виде:

'

": Sheet1

System"

'(если раб. таблица еще не имеет имени)

'или в таком виде:

' ": C:Orders.XLS Sheet1 System"

'Если мы имеем дело с Excel версии 5,

'то topiclist может выглядеть так:

'"[Book1]Sheet1 [Book2]Sheet2 ..."

'Теперь выделим из списка первое имя (может быть "Sheet1")

'для этого извлечем из строки текст между первым и

'вторым символом табуляции;

'или для Excel 5 версии текст до первой табуляции.

If Left$(topiclist, 1) = ":" Then ' ...then it's Excel 4.

tab_marker = InStr(3, topiclist, Chr$(9) ) If tab_marker = 0 Then

Note "В программе Excel нет открытых документов! Остановка." End Program

End If

topicname = Mid$(topiclist, 3, tab_marker – 3) Else

' ... для Excel 5.x

tab_marker = Instr(1, topiclist, Chr$(9) ) topicname = Left$( topiclist, tab_marker – 1)

End If

' Открываем канал для связи с открытым документом

'(например, "Sheet1") DDETerminate chan_num

chan_num = DDEInitiate("Excel", topicname) If chan_num = 0 Then

Note "Problem communicating with " + topicname End Program

End If

'Теперь проверим первую ячейку таблицы Excel.

'Если она пуста, напишем туда сообщение.

'Если нет, то прочитаем содержимое и, используя

'оператор NOTE, покажем его в MapBasic.

'Заметим, что чистая ячейка возвращает знаки

'"возврат каретки" и "перевод строки": Chr$(13) + Chr$(10). cell = DDERequest$( chan_num, "R1C1" )

If cell <> Chr$(13) + Chr$(10) Then Note

Справочник MapBasic

189

Функция DDEInitiate( )

"Сообщение не послано; В ячейке уже содержится:" + cell Else

DDEPoke chan_num, "R1C1", "Привет от MapInfo!"

Note "Сообщение послано в Excel,"+topicname+ ",R1C1." End If

DDETerminateAll

Приведенный пример не гарантирует от ошибок. Например, в Excel может в момент вызова быть активно окно графика (“Chart1” или подобные ему); тогда обращение к ячейке R1C1 будет ошибочным. Кроме того, если Вы работаете с русской версией Excel, то обращаться нужно не к R1C1, а к С1К1 и т.д.

Смотрите также:

DDEExecute, DDEPoke, DDERequest$, DDETerminate, DDETerminateAll

190

Справочник MapBasic

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]