Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекций по дисциплине Объектно-ориентирован...doc
Скачиваний:
34
Добавлен:
01.07.2025
Размер:
14 Мб
Скачать
☆

3.2. Построение приложения-клиента

Теперь рассмотрим приложение-клиент. Но, разместив сразу все его компоненты, код для них мы будем писать постепенно, осваивая различные способы связи с сервером.

Итак, начнем с разработки формы клиента.

1. Перенесите на форму компонент DdeClientConv и установите его свойство ConnectMode равным ddeManual, поскольку мы будем связываться с разными серверами.

2. Перенесите на форму компонент DdeClientltem и установите его свойство DdeConv равным DdeClientConvl.

3. Перенесите на форму два компонента ComboBox. Первый из них, предназначенный для выбора сервера, назовите CBServer. В его свойство Items занесите список серверов: «Server» и «Server1». Второй ComboBox, предназначенный для выбора темы, назовите CBTopics. В его свойство Items занесите список тем: «Topic1» и «Topic2». В обработчик события OnCreate формы вставьте операторы, задающие значения индексов обоих компонентов ComboBox равными 0.

4. Перенесите на форму компонент Memo и два компонента Edit. Тексты Memo и первого Edit (Editl) очистите. Второй компонент Edit назовите ЕМасго и задайте в нем какой-нибудь текст, например, «Макрос 1». Этот компонент будет в дальнейшем использоваться для передачи макросов на сервер.

5. Перенесите на форму четыре кнопки Button, расположите их согласно рисунку 84 и задайте на них надписи Запрос, Clipboard, PokeData и Выполнить.

Рис.84. Приложение-клиент DDE

6. Перенесите на форму кнопку SpeedButton, назовите ее SBLink и установите на ней надпись Контакт. Эта кнопка должна фиксироваться в нажатом состоянии. Поэтому установите у нее свойство AllowAllUp равным true, а свойство Grouplndex равным 1.

На этом размещение всех компонентов окончено. Теперь можно приступать к рассмотрению различных способов обмена информацией с сервером.

4. Запрос данных сервера

Запросить данные сервера по инициативе клиента можно методом RequestData компонента DdeClientConv. Этот метод объявлен следующим образом:

function RequestData (const Item: string): PChar;

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

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

var Info:Pchar; begin

if not DdeClientConvl.SetLink(CBServer.Text, CBTopics.Text) or not DdeClientConvl.OpenLink then

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

begin Info:=DdeClientConvl.RequestData('Items'+IntToStr(CBTopics.Itemlndex+l)); Memol.SetTextBuf(Info) ;

DdeClientConvl.CloseLink;

end; end;

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

Отметим, что для осуществления такого запроса в приложении-клиенте вообще не нужен компонент DdeCIientltem. Он нам потребуется для иных целей. Однако, если уж он имеется на форме, то его тоже можно использовать для получения информации по запросу. Для этого в обработчик его события OnChange вставьте оператор

Editl.Text:= DdeClientltem1.Text;

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

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

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

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

DdeClientConvl.RequestData('Items'+IntToStr(CBTopics.Itemlndex+l)); не используя переменную Info и компонент Memo1.

Внеся указанные тексты в приложение-клиент, запустите его на выполнение. Предварительно можно запустить серверы Server и Server1, с которыми будет осуществляться связь, но не из Delphi, а, например, программой Windows «Проводник». Запуск из Delphi одновременно нескольких приложений в режиме отладки возможен только в случае, если вы работаете в Windows NT.

Проверьте наличие связи с разными серверами по разным темам.

Мы рассмотрели запрос к серверу, посылаемый методом RequestData. Возможен и другой способ связи с сервером — через буфер обмена Clipboard. Для того, чтобы можно было связаться с сервером, пославшим информацию в Clipboard, существует метод PasteLink компонента DdeClientConv. Поместите в обработчик щелчка кнопки Clipboard команду

DDEClientConv1.PasteLink;

Запустите опять ваше приложение на выполнение, запустив одновременно ваши серверы. Нажимая кнопки Clipboard того или иного сервера и затем, нажимая кнопку Clipboard клиента, вы увидите, что в данном случае связь осуществляется с тем сервером, который последним поместил информацию в буфер обмена.