Справочник по компонентам Delphi. Часть 2 - Компонент TDDECIIentConv
ОГЛАВЛЕНИЕ
Компонент 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. Наконец, метод
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;
по-видимому, зарезервировано ддя дальнейших применений.