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

5. Постоянное отслеживание информации на сервере

Для постоянного наблюдения за сервером, осуществляя его оперативный мониторинг. При этом надо соединиться с сервером и, не закрывая этого соединения, установить свойство DDEItem компонента DdeClientltem равным имени того компонента DdeServerltem на сервере, информацию от которого требуется получать. До тех пор, пока соединение открыто, изменяющаяся информация с сервера постоянно будет поступать на компонент DdeClientltem клиента.

Чтобы осуществить это в вашем приложении-клиенте, в обработчик щелчка на кнопке SBLink с надписью Контакт вставьте следующий код:

if SBLink.Down then

begin

DdeClientltem1.DDEItem:='Items'+IntToStr(CBTopics.Itemlndex+l);

if not DdeClientConvl.SetLink(CBServer.Text, CBTopics.Text)

or not DdeClientConvl.OpenLink then

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

else begin

DdeClientConvl.CloseLink;

Editl.Text:='';

end;

Если кнопка SBLink нажата, то свойству DDEItem компонента DdeClientltem присваивается имя компонента Items1 или Items2 на сервере в зависимости от выбранной пользователем темы. Затем тем же способом, что и ранее, осуществляется связь с сервером. Эта связь разрывается только при отпускании кнопки SBLink. Запустите приложение, установите в списках сервер и тему, по которым хотите осуществить связь, и нажмите кнопку Контакт. В окне редактирования появится информация, переданная с сервера. Это все было и ранее. Теперь войдите в приложение-сервер, с которым вы связались, и попробуйте изменять информацию в его окне редактирования. Вы увидите, что все эти изменения немедленно отображаются в окне приложения-клиента. Таким образом между двумя приложениями установлен постоянный контакт. Он прервется только, когда вы отпустите в приложении-клиенте кнопку Контакт.

6. Передача информации от клиента к серверу

Имеется возможность передавать информацию и в обратном направлении — от клиента к серверу. Это может осуществляться методами PokeData, PokeDataLines, ExecuteMacro и ExecuteMacroLines компонента DdeClientConv.

Методы PokeData и PokeDataLines позволяют изменить информацию, хранящуюся в компоненте DdeClientltem на сервере. Их можно использовать, если компонент DdeClientConv уже связан с сервером. Методы определены следующим образом:

function PokeData(Item: string; Data: PChar): Boolean;

function PokeDataLines(Item: string; Data: TStrings): Boolean;

В обеих функциях параметр Item определяет имя компонента DdeServerltem на сервере, в который заносится информация, а параметр Data — тот текст, который должен заменить информацию на сервере. Различие между методами в том, что в PokeData в качестве параметра Data передается строка с нулевым символом в конце, а в функцию PokeDataLines — набор строк типа TStrings.

Функции возвращают true, если передача данных прошла успешно.

Реализовать подобное изменение информации на сервере в вашем приложении-клиенте можно, например, вставив в обработчик щелчка на кнопке PokeData оператор:

if not DdeClientConvl.PokeDataLines(DdeClientlteml.DDEItern, Memo1.Lines)

then

ShowMessage('Данные не переданы, нет контакта с сервером');

При записи этого оператора предполагается, что прежде, чем делать Щелчок на кнопке PokeData, пользователь войдет в контакт с сервером, нажав кнопку Контакт. В этом случае в свойстве DdeCIientltem1.DDEItem хранится имя компонента DdeServerltem на сервере, соответствующего теме, которая задана пользователем. В этот компонент DdeServerltem передается информация, которую пользователь задал в окне редактирования Memo1.

Запустите приложение, установите связь с сервером кнопкой Контакт, наберите строки в окне Memo1 и щелкните на кнопке PokeData. Вы увидите, что информация в окне Editl изменится. Это будет свидетельствовать об изменении информации на сервере. Вы можете в этом убедиться, прервав связь с сервером (отжав кнопку Контакт) и вновь установив связь кнопкой Контакт или Запрос.

Выполнение методов PokeData и PokeDataLines сопровождается событием OnPokeData того компонента DdeServerltem на сервере, в который передается информация. Вы можете использовать это событие в серверах, чтобы, например, отобразить пользователю полученную информацию. Для этого добавьте в серверы метку Label и в обработчик событий OnPokeData обоих компонентов DdeServerItem внесите оператор

Labell.Caption:='Получены данные: "'+ (Sender as TDdeServerltem) .Text+'"':

Этот оператор занесет в надпись метки информацию того компонента DdeServerltem, в который она поступила.

Другой способ передачи данных серверу — методы ExecuteMacro и ExecuteMacroLines компонента DdeClientConv. Эти методы не изменяют информацию на сервере, а просто передают на сервер некоторый текст — макрос. Сервер может анализировать переданный макрос и выполнять те или иные действия. Для этого анализа используется событие OnExecuteMacro компонента DdeServerConv серве­ра.

Методы ExecuteMacro и ExecuteMacroLines можно использовать, если компонент DdeClientConv уже связан с сервером. Методы определены следующим образом:

function ExecuteMacro(Cmd: PChar; WaitFlg: Boolean): Boolean;

function ExecuteMacroLines(Cmd: TStrings; WaitFlg: Boolean): Boolean;

Параметр Cmd содержит строку макроса (в ExecuteMacro) или набор макросов (в ExecuteMacroLines), которые должны передаваться на сервер. Параметр WaitFlg определяет, должен ли клиент ждать завершения выполнения сервером всех макросов. Если WaitFlg = true, то последующие вызовы методов ExecuteMacro, ExecuteMacroLines, PokeData, PokeDataLines и RequestData не будут успешны­ми, пока сервер не обработает всех переданных ему макросов. Проверить, завер­шил ли сервер обработку предыдущих макросов, можно, обратившись к свойству WaitStat компонента DdeClientConv. Пока WaitStat = true, вызов методов ExecuteMacro, ExecuteMacroLines, PokeData, PokeDataLines и RequestData не имеет смысла, так как сервер занят, и эти методы все равно не будут выполнены.

Функции возвращают true при успешной передаче макросов серверу.

Обработчик события OnExecuteMacro компонента TDdeServerConv, которому передан макрос, имеет заголовок вида:

procedure ...(Sender: TObject; Msg: TStrings);

Параметр Msg содержит тексты переданных макросов.

Чтобы ввести передачу макросов в наш текстовый пример, сделайте следующее. В приложении-клиенте в обработчик щелчка на кнопке Выполнить вставьте код:

var Pch:array[0..20] of char; begin

StrPCopy(Pch,EMacro.Text);

if not DdeClientConvl.ExecuteMacro(Pch,false)

then ShowMessage('Макрос не выполнен, нет контакта с сервером'); end;

Первый оператор копирует строку, набранную пользователем в окне редактирования ЕМасго, в строку Pch с нулевым символом в конце. Следующий оператор передает макрос на сервер.

На серверах надо ввести обработчики событий OnExecuteMacro компонентов TDdeServerConv. Давайте в нашем текстовом примере просто ограничимся отображением переданного макроса в надписи метки Label 1. Тогда обработчик события OnExecuteMacro обоих компонентов TDdeServerConv сервера может иметь вид:

procedure TFServer.TopiclExecuteMacro(Sender: TObject; Msg: TStrings);

begin

if (Msg.Count = 0) then

ShowMessage(Application.Exename+': Макрос не получен') else

Labell.Caption:='Получен макрос "'+Msg.Strings[0] + '"';

end;

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

Контрольные вопросы:

  1. Для чего предназначен динамический обмен данными?

  2. Какие функции выполняет динамический обмен данными?

  3. Перечислите этапы создания приложения-сервера.

  4. Перечислите этапы создания приложения-клиента.

Рекомендуемая литература: 1.1, 1.7, 1.10.