Вверх ↑
Этот топик читают: Гость
Ответов: 2125
Рейтинг: 159
#1: 2008-05-07 23:12:38 ЛС | профиль | цитата
Работа с DDE, клиентские компоненты, позволяют работать с DDE сервером.
------------ Дoбавленo:

Для тестирования прилагается небольшая программка, сделанная на VB.

Аттач перезалит 08 May 2008 18:18
карма: 1

0
файлы: 1ddeclient_1_0.rar [8KB] [620]
vip
#1.1контекстная реклама от партнеров
Разработчик
Ответов: 26067
Рейтинг: 2121
#2: 2008-05-07 23:57:35 ЛС | профиль | цитата
tsdima, ну вот, клиент уже есть, а сервер будет


------------ Дoбавленo:


И что ты так сильно ужал ddeml

------------ Дoбавленo:


Еще один косяк -- из-за длительного коннекта с сервером ненормально отрисовывает форму, надо бы предусмотреть отработку очереди внешних сообщений.

------------ Дoбавленo:


Пришлось сделать так


procedure THIDDEClientItem._work_doAutoUpdate;
var hszItem,hData:THandle; dwRes:DWORD;
begin
_prop_AutoUpdate := ToInteger(_Data);
hszItem := DdeCreateStringHandle(g_DdeInstance,PChar(ItemName),CP_WINANSI);
if _prop_AutoUpdate=0 then begin
if hConv<>0 then DdeClientTransaction(nil,0,hConv,hszItem,CF_TEXT,XTYP_ADVSTOP,_prop_Timeout,dwRes);
hConv := 0;
end else if hConv=0 then begin
if Assigned(Applet) and (not AppletTerminated) then Applet.ProcessMessages;
hConv := THandle(ReadInteger(_Data,_data_Link,0));
...
end;

Как раз тормоза наступают при попытке получить внешний линк, которого еще нет. Вот и пришлось включить отработку всех накопившихся сообщений.
карма: 22

0
Ответов: 82
Рейтинг: 2
#3: 2008-05-08 07:32:48 ЛС | профиль | цитата
tsdima, почему программа сервер запускается автоматически, может лучше сделать запуск по выбору пользователя.
Вот эта схема: code_8992.txt - при закрытии сервиса он запускается снова.
P.S Может еще точку Handle сделать для управления окном сервера
карма: 0

0
файлы: 1code_8992.txt [425B] [384]
Разработчик
Ответов: 26067
Рейтинг: 2121
#4: 2008-05-08 10:20:40 ЛС | профиль | цитата
Алексей писал(а):
Может еще точку Handle сделать для управления окном сервера

Сервер должен быть отдельными компонентами, это -- просто пример сервера для теста
------------ Дoбавленo:

Алексей писал(а):
может лучше сделать запуск по выбору пользователя

Да, согласен -- автозапуск желательно сделать по выбору, отдельным свойством.

карма: 22

0
Ответов: 2125
Рейтинг: 159
#5: 2008-05-08 10:56:14 ЛС | профиль | цитата
Алексей писал(а):
почему программа сервер запускается автоматически

Потому-что заполнено свойство ServerApp. Его можно оставить пустым, тогда при попытке соединения получишь ошибку, которую можно обработать по своему желанию. Попытка чтения элемента останется, к сожалению, незамеченной. Но можно проверить, что передаётся через связь Link, и если оно равно нулю, то как-то среагировать на это. Надо, наверное, добавить onError в DDEClientItem, реагирующий на Link=0.

nesco писал(а):
автозапуск желательно сделать по выбору, отдельным свойством

Это свойство и есть ServerApp. Ты-ж смотрел код, наверное.

nesco писал(а):
Как раз тормоза наступают при попытке получить внешний линк

Вот тут пока необъяснимый феномен. Тормоза - при DDEConnect. Самое прикольное, у меня на домашней машине, тормоза то есть, то нет. Запускаешь из среды - тормоза есть, из эксплорера - нет. Ставишь связь onCreate---doOpenLink - получается наоборот! А вот если свойство AutoUpdate устанавливать по таймеру 1мс через doAutoUpdate, то тормозов нет, несмотря на то, что запрашивается линк, которого нет!

Я подозреваю, что наше приложение в момент DDEConnect не реагирует на сообщение от ddeml, и оно, в свою очередь тоже ждёт таймаута. Если же DDEConnect вызывается из оконной процедуры, винды как-то это разруливают.

карма: 1

0
Разработчик
Ответов: 26067
Рейтинг: 2121
#6: 2008-05-08 11:53:19 ЛС | профиль | цитата
tsdima писал(а):
Надо, наверное, добавить onError в DDEClientItem, реагирующий на Link=0

Наверное, самый лучший вариант.
Сейчас еще раз прогнал при пустом имени ServerApp. Если сервер загружен раньше, то коннект происходит нормально, но если запущен позднее, то повторный коннект по doOpenLink вызывает приконнекчивание (сообщение выдается), но данные от сервера не передаются клиенту.

карма: 22

0
Ответов: 2125
Рейтинг: 159
#7: 2008-05-08 15:06:32 ЛС | профиль | цитата
nesco писал(а):
повторный коннект по doOpenLink вызывает приконнекчивание (сообщение выдается), но данные от сервера не передаются клиенту

Надо заново включать AutoUpdate. А на данный момент (отключение для DDEClientItem происходит пока незамеченным) ещё и отключать перед этим То есть на doAutoUpdate надо послать сначала ноль, потом еденичку.
карма: 1

0
Разработчик
Ответов: 26067
Рейтинг: 2121
#8: 2008-05-08 15:20:00 ЛС | профиль | цитата
tsdima писал(а):
То есть на doAutoUpdate надо послать сначала ноль, потом еденичку

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

карма: 22

0
Ответов: 2125
Рейтинг: 159
#9: 2008-05-08 15:38:52 ЛС | профиль | цитата
nesco писал(а):
чтобы не делать лишних телодвижений, например, сделать точку doReConnect

У кого, у DDEClientItem? Я вообще (после того, как начал обдумывать сервер) начинаю думать, что зря я DDE-элементы отдельно сделал.
Может лучше сделать только два компонента: клиент и сервер, а все эти распределения в зависимости от имён топиков и элементов переложить на плечи разработчика схемы?
Мало ли какая задача будет, вдруг количество элементов исчисляется сотнями (например S1,S2...S255) - что теперь сто компонентов на схему лепить?
карма: 1

0
Разработчик
Ответов: 26067
Рейтинг: 2121
#10: 2008-05-08 15:45:06 ЛС | профиль | цитата
tsdima писал(а):
начинаю думать, что зря я DDE-элементы отдельно сделал

А как же один клиент и много линков, с двумя в одном получится -- сколько линков, столько и клиентов

Давай попробуем потестить "все в одном", но для задания параметров, тогда, желательно предусмотреть верхние точки.

------------ Дoбавленo:


tsdima писал(а):
что теперь сто компонентов на схему лепить?

Ну это можно и в динамический мультик затолкать
карма: 22

0
Ответов: 2125
Рейтинг: 159
#11: 2008-05-08 15:55:35 ЛС | профиль | цитата
nesco писал(а):
с двумя в одном получится -- сколько линков, столько и клиентов

Можно у клиента выдавать в нижней точке имя релевантного элемента. Но тогда был бы удобен некий IndexToChannel, у которого в качестве индекса - строка.
А в самой первой версии (до того как я поделил на два компонента) было свойство - список элементов, и выдавался индекс элемента в списке. И схема была проще - DDEClient -> IndexToChannel -> Edit,Edit,...
Но в таком случае имя элементов нужно всегда задавать заранее, а вот например в Excel-е имя элемента типа R1C1, то есть из имени получаются два параметра.
------------ Дoбавленo:

Можно выдавать снизу и то и другое: и имя, и индекс в списке, если такое имя найдено.
карма: 1

0
Разработчик
Ответов: 26067
Рейтинг: 2121
#12: 2008-05-08 16:17:10 ЛС | профиль | цитата
tsdima писал(а):
список элементов, и выдавался индекс элемента в списке

А чем не вариант, на первый взгляд лучше чем куча компонентов, или динамических мультов в памяти. Хотя единственное "но" -- IndexToChannel всегда привязан к определенному статическому количеству каналов, а если их количество заранее неизвестно, тогда что
Может все же лучше, два в одном и динамические мульты ?
------------ Дoбавленo:

tsdima писал(а):
Можно выдавать снизу и то и другое: и имя, и индекс в списке, если такое имя найдено

А может так и сделать, кому чего надо, тот то и возьмет.
карма: 22

1
Голосовали:Алексей
Ответов: 2125
Рейтинг: 159
#13: 2008-05-08 18:18:10 ЛС | профиль | цитата
nesco писал(а):
если их количество заранее неизвестно, тогда что

Тогда использовать ##select обычного динамического мультика ;)

nesco писал(а):
А может так и сделать

Так и сделал.

Я перезалил файл в первом посте. Теперь два в одном. Те, кто успел установить до этого поста, должны удалить поставленные компоненты, а также DDEML.pas в каталоге code.

карма: 1

1
Голосовали:Алексей
Ответов: 82
Рейтинг: 2
#14: 2008-05-08 19:16:18 ЛС | профиль | цитата
Теперь отлично работает, вроде без ошибок, надо еще потестить.

Всё равно точки Handle не хватает.
Допустим, я хочу запустить Project1.exe произвести действия над ним (Свернуть, развернуть и т.д) и закрыть, затем запустить Project2.exe.
Вообщем, не обязательно, но хотелось бы иметь
карма: 0

0
Разработчик
Ответов: 26067
Рейтинг: 2121
#15: 2008-05-08 19:24:03 ЛС | профиль | цитата
tsdima, ну что, я проверил, работает. Все комманды исполнились, вроде предыдущих косяков не наблюдалось.
------------ Дoбавленo:

Алексей писал(а):
Допустим, я хочу запустить Project1.exe произвести действия над ним

Да что ты до него докопался. Сервера-то пока нет.
Будет сервер, можно будет управлять приложениями, где встроен этот сервер.
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)