Страница 54 из 59 Компонент TDDECIIentConv TObject->TPersistent->TComponent—>TDDEClientConv Модуль DDEMAN Страница Палитры компонентов System Компонент TDDEClientConv осуществляет контакт на клиентской стороне. Именно в нем описаны методы, отвечающие за установление контакта. Имена требуемых сервера DDE и темы содержатся в свойствах: § property DDEService: String; property DDETopic: String; Сервер и тема устанавливаются при вхождении в контакт. Предусмотрены два режима вхождения в него: (Pb) property ConnectMode: TDataMode; TDataMode= (ddeAutomatic, ddeManual); Метод function SetLink(const Service: string; const Topic: string): Boolean; присваивает серверу и теме имена, равные Service и Topic, а если выбран режим контакта ddeAutomatic — то и устанавливает контакт. Будьте внимательны при задании параметров метода— здесь учитывается регистр символов. В случае режима ddeManual для установления контакта необходимо вызвать дополнительно метод: function OpenLink: Boolean; Этот метод сначала закрывает предыдущий контакт, затем он пытается связаться с сервером DDEService на тему DDETopic. Если это не удается сразу (например, если требуемый сервер DDE отсутствует), то делается попытка загрузить программу с именем, определенным в свойстве (Pb) property ServiceApplication: String; и установить контакт с ней. Если оно не определено (ServiceApplication = "), то в качестве последней попытки для контакта пробуется имя, представляющее собой конкатенацию имен сервера и темы, разделенных пробелом. В случае неудачи метод OpenLink возвращает False. Можно связаться с сервером, если он поместил данные о контакте в буфер обмена. В этом случае метод function PasteLink: Boolean; переключит компонент на новый контакт и вернет значение True. Наконец, метод procedure CloseLink; разрывает контакт с сервером DDE. Метод function StartAdvise: Boolean; инициирует начало обмена данными. Обычно он вызывается в методе OpenLink. Как уже упоминалось, основное направление потоков данных — от сервера к клиенту, однако возможно и обратное. При помощи двух методов можно присвоить новые значения элементу данных сервера: function PokeDataLines(const Item: string; Data: TStrings): Boolean; function PokeData(const Item: string; Data: PChar): Boolean; Здесь Item — имя элемента данных, Data — передаваемые текстовые данные. Кроме того, некоторые серверы DDE имеют собственные наборы макрокоманд, запрос на выполнение которых можно послать от клиента. К ним относятся многие приложения, в т. ч. СУБД и электронные таблицы, такие, как Paradox и MS Excel; наиболее типичным примером служит Program Manager. Запрос на выполнение макрокоманд посылают методы: function ExecuteMacroLines(Cmd: TStrings; waitFIg: Boolean): Boolean-function ExecuteMacro(Cmd: PChar; waitFIg: Boolean): Boolean; Серверу может потребоваться определенное время для выполнения этих операций. Если до их окончания снова загрузить его работой, то это может привести к непредсказуемым результатам. Чтобы отследить состояние сервера, нужно установить параметр функции waitFIg в True. С началом операции свойство (Ro) property WaitStat: Boolean; устанавливается в True. При этом вызовы последних четырех описанных методов отрабатываться не будут, пока сервер не известит об окончании операции, и WaitStat не примет значение False. Это свойство доступно только по чтению. Клиент может запросить данные от сервера немедленно с помощью метода: function RequestData(const Item: string): PChar; Формат обмена данными можно узнать из свойства: (Ro) property DDEPmt: Integer; Перефразируя Генри Форда, скажем, что можно обмениваться данными любого формата, если этот формат — CF_TEXT. Если возможностей, предоставляемых методами и свойствами класса, недостаточно, то для вызова процедур библиотеки DDEML программисту доступен дескриптор контакта: (Ro) property Conv: HConv; В полученном от сервера тексте могут быть специальные управляющие символы — <Enter>, <Tab>, <Backspace> и другие. Их можно отфильтровать (подавить), если свойство (Pb) property FormatChars: Boolean; установлено в False. В этом случае все символы ASCII с десятичными кодами от 1 до 31 заменяются на пробел (код 32). В случае True преобразования не происходит. Так же, как и в TDDEServerConv, при открытии и закрытии контакта вы можете выполнить специфотеские действия путем обработки событий: (pk) property OnOpen: TNotifyEvent; (Pb) property OnClose: TNotifyEvent; Свойство property DataMode: TDataMode; по-видимому, зарезервировано ддя дальнейших применений. |