Работа с DDE, клиентские компоненты, позволяют работать с DDE сервером.
------------ Дoбавленo:
Для тестирования прилагается небольшая программка, сделанная на VB.
Аттач перезалит 08 May 2008 18:18
Этот топик читают: Гость
Ответов: 2125
Рейтинг: 159
|
|||
карма: 1 |
| ||
файлы: 1 | ddeclient_1_0.rar [8KB] [714] |
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
tsdima, ну вот, клиент уже есть, а сервер будет
------------ Дoбавленo: И что ты так сильно ужал ddeml ------------ Дoбавленo: Еще один косяк -- из-за длительного коннекта с сервером ненормально отрисовывает форму, надо бы предусмотреть отработку очереди внешних сообщений. ------------ Дoбавленo: Пришлось сделать так
Как раз тормоза наступают при попытке получить внешний линк, которого еще нет. Вот и пришлось включить отработку всех накопившихся сообщений. |
|||
карма: 22 |
|
Ответов: 82
Рейтинг: 2
|
|||
tsdima, почему программа сервер запускается автоматически, может лучше сделать запуск по выбору пользователя.
Вот эта схема: code_8992.txt - при закрытии сервиса он запускается снова. P.S Может еще точку Handle сделать для управления окном сервера |
|||
карма: 0 |
| ||
файлы: 1 | code_8992.txt [425B] [459] |
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
Алексей писал(а): Может еще точку Handle сделать для управления окном сервераСервер должен быть отдельными компонентами, это -- просто пример сервера для теста ------------ Дoбавленo: Алексей писал(а): может лучше сделать запуск по выбору пользователяДа, согласен -- автозапуск желательно сделать по выбору, отдельным свойством. |
|||
карма: 22 |
|
Ответов: 2125
Рейтинг: 159
|
|||
Алексей писал(а): почему программа сервер запускается автоматическиПотому-что заполнено свойство ServerApp. Его можно оставить пустым, тогда при попытке соединения получишь ошибку, которую можно обработать по своему желанию. Попытка чтения элемента останется, к сожалению, незамеченной. Но можно проверить, что передаётся через связь Link, и если оно равно нулю, то как-то среагировать на это. Надо, наверное, добавить onError в DDEClientItem, реагирующий на Link=0. nesco писал(а): автозапуск желательно сделать по выбору, отдельным свойствомЭто свойство и есть ServerApp. Ты-ж смотрел код, наверное. nesco писал(а): Как раз тормоза наступают при попытке получить внешний линкВот тут пока необъяснимый феномен. Тормоза - при DDEConnect. Самое прикольное, у меня на домашней машине, тормоза то есть, то нет. Запускаешь из среды - тормоза есть, из эксплорера - нет. Ставишь связь onCreate---doOpenLink - получается наоборот! А вот если свойство AutoUpdate устанавливать по таймеру 1мс через doAutoUpdate, то тормозов нет, несмотря на то, что запрашивается линк, которого нет! Я подозреваю, что наше приложение в момент DDEConnect не реагирует на сообщение от ddeml, и оно, в свою очередь тоже ждёт таймаута. Если же DDEConnect вызывается из оконной процедуры, винды как-то это разруливают. |
|||
карма: 1 |
|
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
tsdima писал(а): Надо, наверное, добавить onError в DDEClientItem, реагирующий на Link=0Наверное, самый лучший вариант. Сейчас еще раз прогнал при пустом имени ServerApp. Если сервер загружен раньше, то коннект происходит нормально, но если запущен позднее, то повторный коннект по doOpenLink вызывает приконнекчивание (сообщение выдается), но данные от сервера не передаются клиенту. |
|||
карма: 22 |
|
Ответов: 2125
Рейтинг: 159
|
|||
nesco писал(а): повторный коннект по doOpenLink вызывает приконнекчивание (сообщение выдается), но данные от сервера не передаются клиентуНадо заново включать AutoUpdate. А на данный момент (отключение для DDEClientItem происходит пока незамеченным) ещё и отключать перед этим То есть на doAutoUpdate надо послать сначала ноль, потом еденичку. |
|||
карма: 1 |
|
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
tsdima писал(а): То есть на doAutoUpdate надо послать сначала ноль, потом еденичкуА это никак автоматизировать нельзя, чтобы не делать лишних телодвижений, например, сделать точку doReConnect |
|||
карма: 22 |
|
Ответов: 2125
Рейтинг: 159
|
|||
nesco писал(а): чтобы не делать лишних телодвижений, например, сделать точку doReConnect У кого, у DDEClientItem? Я вообще (после того, как начал обдумывать сервер) начинаю думать, что зря я DDE-элементы отдельно сделал. Может лучше сделать только два компонента: клиент и сервер, а все эти распределения в зависимости от имён топиков и элементов переложить на плечи разработчика схемы? Мало ли какая задача будет, вдруг количество элементов исчисляется сотнями (например S1,S2...S255) - что теперь сто компонентов на схему лепить? |
|||
карма: 1 |
|
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
tsdima писал(а): начинаю думать, что зря я DDE-элементы отдельно сделалА как же один клиент и много линков, с двумя в одном получится -- сколько линков, столько и клиентов Давай попробуем потестить "все в одном", но для задания параметров, тогда, желательно предусмотреть верхние точки. ------------ Дoбавленo: tsdima писал(а): что теперь сто компонентов на схему лепить?Ну это можно и в динамический мультик затолкать |
|||
карма: 22 |
|
Ответов: 2125
Рейтинг: 159
|
|||
nesco писал(а): с двумя в одном получится -- сколько линков, столько и клиентов Можно у клиента выдавать в нижней точке имя релевантного элемента. Но тогда был бы удобен некий IndexToChannel, у которого в качестве индекса - строка. А в самой первой версии (до того как я поделил на два компонента) было свойство - список элементов, и выдавался индекс элемента в списке. И схема была проще - DDEClient -> IndexToChannel -> Edit,Edit,... Но в таком случае имя элементов нужно всегда задавать заранее, а вот например в Excel-е имя элемента типа R1C1, то есть из имени получаются два параметра. ------------ Дoбавленo: Можно выдавать снизу и то и другое: и имя, и индекс в списке, если такое имя найдено. |
|||
карма: 1 |
|
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
tsdima писал(а): список элементов, и выдавался индекс элемента в спискеА чем не вариант, на первый взгляд лучше чем куча компонентов, или динамических мультов в памяти. Хотя единственное "но" -- IndexToChannel всегда привязан к определенному статическому количеству каналов, а если их количество заранее неизвестно, тогда что Может все же лучше, два в одном и динамические мульты ? ------------ Дoбавленo: tsdima писал(а): Можно выдавать снизу и то и другое: и имя, и индекс в списке, если такое имя найденоА может так и сделать, кому чего надо, тот то и возьмет. |
|||
карма: 22 |
| ||
Голосовали: | Алексей |
Ответов: 2125
Рейтинг: 159
|
|||
nesco писал(а): если их количество заранее неизвестно, тогда что Тогда использовать ##select обычного динамического мультика ;) nesco писал(а): А может так и сделатьТак и сделал. Я перезалил файл в первом посте. Теперь два в одном. Те, кто успел установить до этого поста, должны удалить поставленные компоненты, а также DDEML.pas в каталоге code. |
|||
карма: 1 |
| ||
Голосовали: | Алексей |
Ответов: 82
Рейтинг: 2
|
|||
Теперь отлично работает, вроде без ошибок, надо еще потестить.
Всё равно точки Handle не хватает. Допустим, я хочу запустить Project1.exe произвести действия над ним (Свернуть, развернуть и т.д) и закрыть, затем запустить Project2.exe. Вообщем, не обязательно, но хотелось бы иметь |
|||
карма: 0 |
|
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
tsdima, ну что, я проверил, работает. Все комманды исполнились, вроде предыдущих косяков не наблюдалось.
------------ Дoбавленo: Алексей писал(а): Допустим, я хочу запустить Project1.exe произвести действия над ним Да что ты до него докопался. Сервера-то пока нет. Будет сервер, можно будет управлять приложениями, где встроен этот сервер. |
|||
карма: 22 |
|