Взаимодействие приложения с внешними программами______________409

Здесь Item — строка, содержащая имя компонента DdeServerItem на сервере,
в котором хранится требуемая информация. Функция RequestData возвращает
эту информацию в виде строки с нулевым символом в конце.

Чтобы воспользоваться этой функцией вы можете в обработчике щелчка на
кнопке с надписью Запрос написать следующий текст:

char Info[256];

if (( ! DdeClientConvl->SetLink(CBServer->Text, CBTopics->Text))

II ! DdeClientConvl->OpenLink())

ShowMessage("Нет контакта с сервером '" + CBServer->Text +
"' по теме '" + CBTopics->Text + "'");

else
{
Info = DdeClientConvl->RequestData("Items" +

IntToStr(CBTopics->ItemIndex+l)) ;

Memol->SetTextBuf(Info);

DdeClientConvl->CloseLink() ;

1

В начале этого обработчика осуществляется связь методами SetLink и Open-
Link с сервером, заданным пользователем в списке CBServer по теме, заданной в
списке CBTopics. Если связь осуществилась, то в переменную Info типа char зано-
сится информация от компонента Itemsl или Items2 на сервере в зависимости от
выбранной пользователем темы. Затем эта информация методом SetTextBuf зано-
сится в компонент Memol. Последний оператор методом CloseLink разрывает
связь с сервером.

Отметим, что для осуществления такого запроса в приложении-клиенте вооб-
ще не нужен компонент DdeClientItem. Он нам потребуется для иных целей. Одна-
ко, если уж он имеется на форме, то его тоже можно использовать для получения
информации по запросу. Для этого сделайте следующее. В свойстве Ddeltem ком-
понента DdeClientItem 1 укажите Itemsl — тему по умолчанию. В обработчик со-
бытия OnChange списка CBTopics вставьте оператор

DdeClientIteml->DdeItem = "Items" + IntToStr(CBTopics->ItemIndex+l);

который обеспечит смену темы компонента DdeClientItem при изменении этой
темы пользователем. В зависимости от выбора пользователя свойству Ddeltem этот
оператор присваивает имя компонента Itemsl или Items2 на сервере. В обработчик
события OnChange компонента DdeClientIteml вставьте оператор

Editl->Text = DdeClientIteml->Text;

Поскольку функция RequestData заносит информацию в DdeClientConv и в
связанный с ним компонент DdeClientItem, то при изменении в результате запроса
этой информации она отобразится в окне редактирования Editl.

При этом мы продублировали получение информации. В действительности до-
статочно одной из двух альтернатив:

• Ограничиться приведенной ранее процедурой занесения информации в Me-
mol, и не вводить обработчик события OnChange компонента DdeClientItem.

• Ввести обработчик события OnChange компонента DdeClientItem, а в проце-
дуре обработки щелчка на кнопке Запрос заменить два оператора чтения ин-
формации на один:

DdeClientConvl->RequestData("Items" + IntToStr(CBTopics->ItemIndex+l)) ;

не используя переменную Info и компонент Memol.

Внеся указанные тексты в приложение-клиент, запустите его на выполнение.
Предварительно можно запустить (а можно и не запускать) серверы Server и Ser-
veri, с которыми будет осуществляться связь, но не из C++Builder, а, например,
программой Windows «Проводник». Запуск из C++Builder одновременно несколь-