Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ППП, СОМ, ОLE.doc
Скачиваний:
7
Добавлен:
22.11.2019
Размер:
345.6 Кб
Скачать

Во время же выполнения программы эти свойства могут быть установлены методом SetLink, который описывается следующим образом:

Bool SetLink (const System: AnsyString Service, const System: AnsyString Topic);

Способ установления контакта с сервером во время выполнения зависит от значения свойства ConnectMode, определяющего режим соединения. Это свойство может иметь значение ddeManual — ручной или ddeAutomatic — автоматический. При автоматическом режиме SetLink не только задает значения DdeService и DdeTopic, но и устанавливает сам контакт. При ручном режиме метод SetLink после установки значений DdeService и DdeTopic очищает элементы от прошлой информации, но самого соединения не устанавливает. Контакт с сервером в этом случае должен устанавливаться методом OpenLink, не имеющим параметров.

Если сервер запущен в момент попытки установить контакт, то контакт устанавливается описанными выше методами. Если это не удается, то делается попытка запустить программу, путь и имя которой указаны в свойстве ServiceApplication. Если в этом свойстве ничего не указано или запуск не удался, то метод OpenLink возвращает false.

Закрыть контакт с сервером можно методом CloseLink. Этот метод разрывает связь с сервером и очищает значения свойств DdeService и DdeTopic.

Исходя из сказанного выше, наиболее простой способ установления связи вашего приложения с сервером (если приложение будет обмениваться информацией только с одним сервером) заключается в следующем. Во время проектирования надо установить требуемые значения свойств DdeService и DdeTopic, а затем задать свойство ConnectMode = ddeAutomatic. Если сервер в данный момент запущен или он доступен, то с сервером установится связь. Доступность в данном случае означает, что выполняемый файл сервера находится в том же каталоге, в котором находится ваше приложение, или в свойстве Service Application указан выполняемый файл сервера с полным путем к нему и с указанием типа файла (расширения). В этом случае свойство ConnectMode сможет установиться в ddeAutomatic. В противном случае вам будет выдано предупреждение о невозможности контакта.

Если все прошло нормально, то в дальнейшем при выполнении приложения связь с сервером будет устанавливаться автоматически. Если в момент запуска приложения сервер уже запущен, контакт установится сразу. Если же сервер не запущен к моменту запуска вашего приложения, но его выполняемый файл доступен для приложения (в указанном выше смысле), то сервер автоматически запустится и с ним будет установлен контакт. В обоих случаях вам не надо будет заботится о контакте, т.е. не надо будет применять методы SetLink или OpenLink.

Если указанные выше условия не выполнены, т.е. сервер не запущен ни заранее, ни в момент запуска вашего приложения, то даже, если он потом будет запущен, перед установлением контакта с ним вам потребуется применить метод SetLink. Дело в том, что в этих условиях установленные при проектировании значения свойств DdeService и DdeTopic стираются, а повторно установить их можно только методом SetLink. То же самое надо иметь в виду, если вы в своем приложении закрыли соединение с сервером методом CloseLink или установили связь другим сервером. После этого контакт прервется и его надо восстанавливать методом SetLink.

Если свойство ConnectMode компонента установлено в ddeManual, но в процессе проектирования вы установили свойства DdeService и DdeTopic, то для установления контакта вам достаточно выполнить метод OpenLink. Если же Dde Service и DdeTopic не установлены или в процессе работы приложения вы хотите переключаться на связь с другими серверами, то прежде, чем начать работать с сервером, надо выполнить метод SetLink, устанавливающий имена сервера и темы. Если при этом ConnectMode = ddeAutomatic, то автоматически устанавливается контакт с сервером. Если же ConnectMode = ddeManual, то для установления контакта после SetLink надо применить метод OpenLink.

Таким образом, правила установления контакта с сервером доступным или уже запущенным к моменту запуска приложения можно представить следующей таблицей.

ConnectMode

DdeService и DdeTopic

Контакт

ddeAutomatic

Установлены при проектировании

Автоматический

 

Не установлены при проектировании, или изменены, или контакт был прерван

SetLink

ddcManual

Установлены при проектировании

OpenLink

 

Не установлены при проектировании, или изменены, или контакт был прерван

SetLink OpenLink

Так, если Ваше приложение предполагает выполнить какие-то операторы обмена данными только с одним заранее известным сервером по нажатию некоторой кнопки (назовем ее BExchange), то Вы должны разместить на своем приложении эту кнопку вместе с компонентом DdeClientConv (назовем его DdeClientConvl).

Далее (наиболее простой путь) Вы устанавливаете в DdeClientConvl требуемые значения свойств DdeService и DdeTopic, а затем задаете свойство ConnectMode равным ddeAutomatic. Тогда в обработчике события OnClick кнопки BExchange вам достаточно просто написать операторы обмена данными с сервером.

DdeClientConvl->OpenLink(); < операторы обмена данными с сервером >

Если по каким-то причинам во время проектирования сервер вам не доступен, то, задав при проектировании требуемые значения свойств DdeService и DdeTopic, вы оставляете свойство ConnectMode, равным ddeManual. В этом случае, например, в обработчике события формы OnCreate вы можете поместить оператор

if (!DdeClientConvl->OpenLink()) ShowMessage("Нет контакта с сервером '" + DdeClientConvl->DdeService + "' по теме '" + DdeClientConvl->DdeTopic + "'");

Этот оператор обеспечит контакт с сервером в момент запуска приложения или соответствующее сообщение об ошибке. Другой путь — поместить в обработчик события OnClick кнопки BExchange операторы

DdeClientConvl->SetLink(sServer, sTopic); if (!DdeClientConvl->OpenLink()) ShowMessage("Нет контакта с сервером '" + DdeClientConvl->DdeService + "' по теме '" + DdeClientConvl->DdeTopic + "'"); < операторы обмена данными с сервером >

В этих операторах предполагается, что параметры sServer и sTopic содержат соответственно имя сервера и имя темы. Отметим, что в этом случае нельзя ограничиться только вторым оператором OpenLink. Дело в том, что в первый раз он сработает нормально. Но при последующих щелчках на кнопке BExchange он будет выдавать ошибки, поскольку метод OpenLink возвращает false не только в случае невозможности связаться с сервером, но и в случаях, когда контакт в данный момент уже установлен. Впрочем, это относится только к возвращаемой величине.

Компоненты DdeClientltem и DdeServerltem нужны только для обмена информацией о конкретных элементах данных.

Данные, содержащиеся на сервере, которые могут быть переданы клиентам, обеспечивает компонент DdeServerltem. Он связывается с TDdeServerConv и определяет, что, собственно, будет пересылаться по DDE.

Основные свойства этого компонента — Lines- набор строк, представляющий собой передаваемую информацию, и ServerConv — имя компонента DdeServerConv, т.е. имя темы, к которой относится данная информация. Если свойство ServerConv не установлено, то считается, что имя темы — заголовок (Caption) формы приложения-сервера. Свойство Text компонента DdeServerltem автоматически устанавливается равным первой строке свойства Lines. Но если вы устанавливаете свойство Text непосредственно, это значение заносится в первую строку Lines, а остальные строки очищаются.

При изменении значения этих свойств автоматически происходит пересылка обновленных данных во все приложения-клиенты, установившие связь с сервером.

Компонент DdeServerltem имеет метод CopyToClipboard. При выполнении этого метода в буфер обмена Clipboard заносится содержимое хранимой в компоненте информации в специальном формате, который содержит информацию о контакте: имена сервера и темы.

Так, в примере приложения, приведенного на рис. 2.5 изменение значения свойства Lines может происходить в обработчике события OnChange компонента Edit1:

procedure TDdeSrvrForm.doOnChange(Sender: TObject); begin if not FInPoke then DdeTestItem.Lines := Edit1.Lines; end;

Этот же компонент может отвечать за получение данных от клиента при нажатии кнопки Poke Data и реализации в обработчике события OnPokeData:

procedure TDdeSrvrForm.doOnPoke(Sender: TObject); begin FInPoke := True; Edit1.Lines := DdeTestItem.Lines; FInPoke := False; end;

Реализация динамического обмена данными методом OLE

Технолгия внедрения и связывания объектов (Object Linking and Embed-ding - OLE), которая успешно реализована фирмой Microsoft в рамках стандарта OLE 1.0 при разработке операционной системы Windows, предполагает [Сим]:

  • создание комплексных документов, содержащих несколько разных типов данных;

  • обеспечение совместной работы нескольких приложений при подготовке одного документа;

  • перенос и копирование объектов между приложениями.

Так, например, рисунок, созданный в графическом редакторе Paint, можно скопировать в текстовый документ, разрабатываемый в текстовом процессоре WordPad. То же можно делать и с фрагментами звукозаписи и видеозаписи. Разумеется, звуковой объект нельзя отобразить на печатной странице, но если документ электронный, то его можно вставить в текст в виде значка. Щелчок на этом значке во время просмотра документа позволит прослушать связанную с ним звукозапись.

В данной технологии под внедрением объектов подразумевается создание комплексного документа, содержащего два или более автономных объектов. Обычным средством внедрения объектов в документ является их импорт из готового файла, в котором данный объект хранится (рис.2.24).

Рис. 2.24. Технолгия внедрения объектов

Так, например, если в графическом редакторе Paint был создан и сохранен на диске файл рисунка ABCD.bmp, то в текстовом процессоре WordPad этот рисунок можно вставить в текстовый документ с помощью команды «Вставка > Обьект». При этом открывается диалоговое окно «Вставка объекта».

Импорт вставляемого объекта обеспечивается переключателем «Создать из файла», а его выбор на диске — кнопкой Обзор, Кроме графических объектов в текстовый документ можно внедрять и объекты другой природы - тексты, фрагменты звукозаписи и видеозаписи.

При сохранении комплексного документа происходит сохранение и текста, и всех внедренных в него объектов. Рисунок, ранее существовавший в виде отдельного графического файла, теперь внедрен в текстовый документ и располагается внутри него. Разумеется, при этом размер исходного текстового документа возрастает на величину внедренных объектов.

Внедренные объекты могли редактироваться простым двойным щелчком мыши на соответствующем элементе данных. Например, можно было дважды щелкнуть на электронной таблице Excel, встроенной в документ редактора Word, и в отдельном окне запускался Excel с загруженным рабочим листом, готовым к редактированию. После завершения редактирования Excel позволял сохранить изменения во внедренном в документ Word объекте Excel.

Связывание отличается от внедрения тем, что сам объект не вставляется в документ, а вместо этого вставляется только указатель на местоположение объекта. Когда при просмотре документа читатель дойдет до этого указателя, текстовый процессор обратится по адресу, имеющемуся в указателе, и отобразит рисунок в тексте документа (рис.2.25).

Рис. 2.25. Технолгия связывания объектов

При использовании связывания объектов, а не внедрения, размер результирующего комплексного документа практически не увеличивается, так как указатель занимает очень мало места. Однако если не принять специальные меры, то при передаче такого документа заказчику не произойдет передача связанных объектов, поскольку они останутся в своих местах хранения. Это явление называется разрывом, или потерей связи. Потерянные связи надо восстанавливать. Потеря связи может происходить даже при простом перемещении связанных объектов из одной папки в другую. Таким образом, при использовании метода связывания объектов необходимо специально контролировать целостность связей между объектами и выполнять операции обслуживания этих связей (обновления и восстановления).

И тот и другой методы имеют свои области применения. Все зависит от формы и назначения документа. Внедряя объекты, мы избавляемся от необходимости поддерживать и обслуживать связи, но при этом можем получать файлы огромных размеров, с которыми трудно оперировать. Связывая объекты, мы резко уменьшаем размеры файлов и значительно повышаем производительность компьютера, но вынуждены следить за тем, чтобы все связанные объекты хранились строго в тех папках, в которые они были помещены в момент создания связи.

С принципами связывания и внедрения объектов непосредственно соприкасается принцип совместного использования объектов. В корпоративных вычислительных системах нередко используют стандартизированные объекты (бланки документов, логотипы предприятий и т. п.), доступ к которым (без права изменения) имеют большие группы сотрудников.

Такие объекты удобно вставлять в результирующий документ методом связывания. Во-первых, это позволяет значительно сократить объем документации предприятия, так как один и тот же объект может использоваться во всех документах без размножения. Во-вторых, такой подход позволяет администрации предприятия легко изменять (в случае необходимости) стандартный объект и иметь уверенность в том, что при использовании любого документа, имеющего с ним связь, произойдет автоматическая подмена объекта. При таком подходе за пределы предприятия не выйдет ни один документ, напечатанный на устаревшем бланке, имеющем устаревшие реквизиты, и т. п.

На практике обычно поступают следующим образом. Если документ готовится для печати на принтере или для просмотра на экране в пределах локальной сети предприятия, то объекты в него вставляют методом связывания. Если же документ готовится для передачи в электронном виде во внешние структуры, в него объекты внедряются.

Следует заметить, что в данной технологии объект — это очень специфическое образование, и не каждое приложение может его создать. Те приложения, которые способны создавать объекты для передачи другим приложениям, называются OLE-серверами, а те, которые позволяют внедрять или связывать чужие объекты в свои документы, называются OLE-клиентами. Например, при вставке рисунка в текстовый документ графический редактор играет роль OLE-сервера, а текстовый процессор — роль OLE-клиента.