Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
17 / 17 / 0
Регистрация: 04.06.2012
Сообщений: 88
1

Последовательность при работе с TDde

18.07.2012, 16:03. Показов 3686. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Дело вот в чём: есть приложение, которое в режиме реального времени просчитывает некие параметры. Далее часть параметров записывается в одну строку и эта строка должна передаваться другому приложению, запущенному из первой программы.
Как я понимаю смысл всего этого:
1. В основной программе необходимо использовать TDdeServerConv и TDdeServerItem.
2. Во вспомогательной - TDdeClientConv и TDdeClientItem.

Вопрос: что именно нужно прописывать в основной программе и что именно во вспомогательной?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.07.2012, 16:03
Ответы с готовыми решениями:

Нераспознанная управляющая последовательность при работе с путями
Доброго времени суток! Делая программу, столкнулся с такой проблемой: ...

Последовательность директив #include при работе со списками структур
Компилятор выдает лог: Как я понял, все ошибки - это следствие первых двух. Только вот неясно,...

Исключение при работе с pictureBox (задание картинки при работе с формой)
Хочу задать изображение в компоненте pictureBox во время разработки формы, чтоб при запуске проги...

Грабли при работе STM32f4 при работе с ftp
Столкнулся с такой проблемой. Работаю в связке Stm32f4+cinterion bgs2e8 при сливании файла с ftp,...

3
422 / 352 / 19
Регистрация: 14.05.2012
Сообщений: 1,437
18.07.2012, 16:13 2
https://www.cyberforum.ru/atta... 1337702903 посмотри здесь

Добавлено через 4 минуты
DDE-Чат

В очередной своей работе я хочу рассказать о DDE - Dynamic Data Exchange, то есть о динамическом обмене данными между приложениями. Начав изучать тему DDE, я понял, что это как-то похоже на чат. Принцип работы с DDE - это технология Клиент-Сервер. Delphi позволяет создавать как сервер, так и клиент. Все компоненты для организации технологии DDE находятся на странице System Палитры компонентов. Сразу хочу отметить, что при использовании DDE возникает множество проблем, которые будут оговорены далее.
Приложение Сервера:

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

1. TDdeServerConv;
2. TDdeServerItem;
3. Два компонента TMemo для отправляемых и принимаемых сообщений;
4. Кнопку TButton.

Компонент TDdeServerConv представляет собой сеанс передачи данных, а компонент TDdeServerItem - сами передаваемые данные. Обычно приложение Сервера содержит один компонент TDdeServerConv и несколько компонентов TDdeServerItem. Эти компоненты используются совместно. Через свойство ServerConv компонент TDdeServerItem связывается с TDdeServerConv.

...
DdeServerItem1.ServerConv:=DdeServerConv1;
...

Так как TDdeServerItem содержит сами передаваемые данные, то эти данные должны где-то содержаться. Все данные заносятся в два основных свойства: Lines - для передачи сразу нескольких строк и Text - для передачи одной строки. Как только одно из этих свойств изменяться, они сразу же передаются приложению Клиента.

Для того чтобы организовать соединение Клиента с Сервером, Клиенту нужно знать все параметры Сервера. Для этого нужно использовать метод CopyToClipboard;

...
DdeServerItem1.CopyToClipboard;
...

При получении данных от клиента нужно обрабатывать событие onPokeData. В нашем случае нужно просто отобразить переданные данные на одном из компонентов TMemo.

procedure TForm1.DdeServerItem1PokeData(Sender: TObject);
begin
ServerMemoIn.Lines:=DdeServerItem1.Lines;
end;

А теперь рассмотрим наглядный пример приложения Сервера. Начнем с процедуры создания формы:

procedure TForm1.FormCreate(Sender: TObject);
begin
ServerMemoOut.Clear; // Компонент для передаваемых данных
ServerMemoIn.Clear; // Компонент для получаемых данных

DdeServerItem1.CopyToClipboard; // Сохраняем параметры Сервера
DdeServerItem1.ServerConv:=DdeServerConv1;
end;

При получении данных от Клиента отображаемых их в одном из компонентов TMemo:

procedure TForm1.DdeServerItem1PokeData(Sender: TObject);
begin
ServerMemoIn.Lines:=DdeServerItem1.Lines;
end;

Кнопка для отправки сообщения Клиенту. При нажатии на кнопку происходи присвоение текста, введенного в другой компонент TMemo и его немедленная отправка Клиенту:

procedure TForm1.btnSendClick(Sender: TObject);
begin
DdeServerItem1.Lines:=ServerMemoOut.Lines;
end;

Так как Сервер и Клиент используются совместно, то при закрытии одного из них второй так и останется запущенным. Для этого при закрытии приложения Сервера закрываем и приложение Клиента:

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
Var H: HWND;
begin
H:=FindWindow(Nil, 'ChatClient');
If H <> 0 Then SendMessage(H, WM_CLOSE, 0, 0);
end;

Trouble № 1: Мною была замечена одна очень не приятная вещь. Приложение Сервера без проблем принимает многострочные данные от Клиента, а в свою очередь Клиент не "хочет" принимать многострочные данных от Сервера. Именно поэтому я решил запретить нажатие клавиши Enter, чтобы хоть как-то скрыть этот огромный недостаток.

procedure TForm1.ServerMemoOutKeyPress(Sender: TObject; var Key: Char);
begin
If Key = #13 Then Key:=#0;
end;

Приложение Клиента:

Теперь попробуем создать приложение Клиента. Клиент предназначен для получения данных от приложения Сервера. Теоретически Клиентов может быть несколько. Создадим новый проект. Затем положить на форму стандартные и специальные компоненты присущие Клиенту:

1. TDdeClientConv;
2. TDdeClientItem;
3. Два компонента TMemo для отправляемых и принимаемых сообщений;
4. Кнопку TButton.

Компонент TDdeClientConv также представляет собой сеанс передачи данных, а компонент TDdeClientItem - сами передаваемые данные, которые также хранятся в свойствах Lines - для отправки нескольких строк и Text - для отправки одной строки. Обычно приложение клиента также содержит один компонент TDdeClientConv и несколько компонентов TDdeClientItem. Эти компоненты используются совместно. Через свойство DdeConv компонент TDdeClientItem связывается с компонентом TDdeClientConv. А через свойство DdeItem задается источник данных.

...
DdeClientItem1.DdeConv:=DdeClientConv1;
DdeClientItem1.DdeItem:='DdeServerItem1';
...

Для организации параметров соединения используются следующие свойства:

DdeService - Имя Сервера, если Сервер располагается в текущей директории;
DdeTopic - Тема обмена, обычно это компонент TDdeServerConv
ServiceApplication - Имя Сервера, если Сервер располагается не в текущей директории.

Имя Сервера принято указывать без расширения, хотя даже если и указать расширение, то это не вызовет ни какой ошибки.

Trouble № 2: Установить перечисленные свойства динамически, то есть во время выполнения программы, скорее всего не получиться. Все эти команды будут просто игнорированы. Это нужно делать на этапе конструирования формы через Инспектор объектов.

...
DdeClientConv1.DdeService:='ChatServer';
DdeClientConv1.DdeTopic:='DdeServerConv1';
...
// ИЛИ
...
DdeClientConv1.ServiceApplication:='С:\ChatServer';
DdeClientConv1.DdeTopic:='DdeServerConv1';
...

При установки свойств через Инспектор объектов нужно воспользоваться одним из свойств компонента TDdeClientConv: DdeService или DdeTopic. При этом заполнение полей одного свойства приведет к заполнению полей другого свойства. Также можно нажать кнопку "Paste Link", что приведет к автоматическому заполнению полей. Но, эта кнопка будет активна только в том случае, если приложение Сервера было хоть раз запущено ранее, то есть "сработал" метод CopyToClipboard.

При помощи свойства ConnectMode можно управлять способ подключения к Серверу. Если это свойство установлено в ddeAutomatic, то подключение осуществляется автоматически, а если свойство установлено в ddeManual, то подключение осуществляется вручную и для нормальной работы приложения программисту придется самому описывать все операторы. Для этого нужно воспользоваться группой операторов SetLink, OpenLink, CloseLink и RequestData.

Для того чтобы отправить текстовое сообщение на Сервер существуют две основные функции PokeData - для отправки на Сервер однострочных данных и функция PokeDataLines для отправки многострочных данных.

А теперь рассмотрим наглядный пример приложения Клиента. Начнем с процедуры создания формы:

procedure TForm1.FormCreate(Sender: TObject);
begin
ClientMemoOut.Clear;
ClientMemoIn.Clear;

DdeClientItem1.DdeConv:=DdeClientConv1;
DdeClientItem1.DdeItem:='DdeServerItem1';

DdeClientConv1.DdeService:='ChatServer';
DdeClientConv1.DdeTopic:='DdeServerConv1';
end;

Кнопка для отправки данных на Сервер. Данные отправляются двумя различными способами. При отправке данных первым способ используется функция Trim для удаления не нужных пробелов, потому что при получении данных эти пробелы могут быть интерпретированы как кавычки или любые другие символы:

procedure TForm1.btnSendClick(Sender: TObject);
begin
DdeClientConv1.PokeData(DdeClientItem1.DdeItem, PChar(Trim(ClientMemoOut.Text)));
DdeClientConv2.PokeDataLines(DdeClientItem2.DdeItem, ClientMemoOut.Lines);
end;

Процедура для отображения полученных данных от Сервера:

procedure TForm1.DdeClientItem1Change(Sender: TObject);
begin
ClientMemoIn.Lines:=DdeClientItem1.Lines;
end;

При закрытии приложения Клиента также закрываем и приложение Сервера:

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
Var H: HWND;
begin
H:=FindWindow(Nil, 'ChatServer');
If H <> 0 Then SendMessage(H, WM_CLOSE, 0, 0);
end;

Здесь также запрещаем использовании клавиши Enter:

procedure TForm1.ClientMemoOutKeyPress(Sender: TObject; var Key: Char);
begin
If Key = #13 Then Key:=#0;
end;

В процессе написания и отладки программы иногда необходимо узнать некоторые данные о соединении. Так, например, можно узнать имя Сервера:

...
ShowMessage('Имя сервера 1 способом ' + DdeClientItem1.DdeConv.DdeService);
ShowMessage('Имя сервера 2 способом ' + DdeClientConv1.DdeService);
...

А так можно узнать тему обмена данными и DdeServerItem:

...
ShowMessage('Тема ' + DdeClientConv1.DdeTopic);
ShowMessage('DdeServerItem ' + DdeClientItem1.DdeItem);
...
воть нашел еще
0
17 / 17 / 0
Регистрация: 04.06.2012
Сообщений: 88
18.07.2012, 16:57  [ТС] 3
Пробовал уже, не работает... Ладно, буду экспериментировать, может что и получится.
0
17 / 17 / 0
Регистрация: 04.06.2012
Сообщений: 88
19.07.2012, 17:59  [ТС] 4
В общем разобрался. Кому интересно, вот:
Опишу действия по шагам. Код приведён на C++ Builder'е. Думаю перевести в Delphi труда не составит.
Создание Сервера с помощью компонентов TDdeServerConv и TDdeServerItem.
Шаг 1.
Создайте новый проект. На форму поместите TEdit, TDdeServerConv и TDdeServerItem. Для удобства переименуем DdeServerConv1 в Topic1, а DdeServerItem1 в Items1.
Шаг 2.
На форме жмём на Items1 и в свойствах щелкаем дважды по свойству Lines и пишем там что-нибудь. В свойстве ServerConv пишем Topic1 (имя темы, или имя компонента TDdeServerConv).
Шаг 3.
Дважды щёлкаем по форме (FormCreate) и пишем следующее:
C++
1
Edit1->Text = Items1->Text;
Шаг 4.
Дважды щёлкаем по Edit1 (Edit1Change) и пишем:
C++
1
Items1->Text = Edit1->Text;
Шаг 5.
При закрытии окна сервера окно клиента должно тоже закрываться, поэтому создаем действие формы CloseQuery и там пишем:
C++
1
2
3
4
5
HWND H;
H = FindWindow(NULL,TEXT("ChatClient"));
if (H != 0) {
      SendMessage(H,WM_CLOSE,0,0);
}
Шаг 6.
Название проекта по умолчанию Project1. Измените его на server. В свойстве Caption формы также напишите Server (вроде как не обязательно).

На этом создание сервера закончено.

Создание Клиента.
Шаг 1.
Создайте новый проект. Дайте форме имя (name) ChatClient. Проект сохраните как Client.
Разместите на форме TEdit, TDdeClientConv и TDdeClientItem. Для удобства переименуем DdeClientConv1 в DdeClient, а DdeClientItem1 в DdeClientItem.
Шаг 2.
В свойствах DdeClient свойство ConnectMode поставьте ddeManual. В графе ServiceApplication напишите имя приложения сервера, то есть Server.
Шаг 3.
В свойствах DdeClientItem в DdeConv напишите DdeClient, а в DdeItem - Items1 (Название компонента TDdeServerItem в приложении сервера).
Шаг 4.
Щёлкните дважды по DdeClientItem и напишите:
C++
1
Edit1->Text = DdeClientItem->Text;
Шаг 5.
Щёлкните дважды по форме и напишите:
C++
1
2
3
4
DdeClientItem->DdeItem = "Items1";
if (!DdeClient->SetLink("Server","Topic1") || !DdeClient->OpenLink()) {
     ShowMessage("Нет контакта с сервером Server по теме Topic1");
}
Шаг 6.
Выберите в инспекторе объектов формы событие CloseQuery, щёлкните по нёму дважды и напишите:
C++
1
2
DdeClient->CloseLink();
Edit1->Text = "";
Всё! Теперь можете запустить оба приложения. Теперь, записывая что либо в Edit1 Сервера вы увидите тоже самое в Edit'е Клиента.

Если нужно что-либо поподробнее описать, просите, опишу.

Прикрепляю файлы проекта и исполняемых файлов: DDE.rar
0
19.07.2012, 17:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.07.2012, 17:59
Помогаю со студенческими работами здесь

Аппаратная ошибка видео (Ошибка при работе с видеоустройствами привела к некорректной работе Windows).
Аппаратная ошибка видео. Последнее время во время игры Call of Duty: Modern Warfare 2 в...

Нарушение прав доступа при чтении при работе с большим массивом
Здравствуйте. Пытаюсь заполнить большой массив, вроде правильно объявил его, но на разных итерациях...

ASUS K53S выключается при работе от батареи при низком разряде
У меня &quot;ASUS K53S&quot; под управлением ОС &quot;Windows 7 Ultimate x64&quot; (все драйвера установлены с...

Ошибка при использовании ADODB.CONNECTION при работе с dbf-файлом
Добрый день! Написала макрос с использованием adodb.connection. макрос удаляет строки из файла dbf....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru