Вверх ↑
Этот топик читают: Гость
Ответов: 2125
Рейтинг: 159
#1: 2008-05-08 23:42:14 ЛС | профиль | цитата
Возможно это не самый лучший вариант, но он работает.
Схема с двумя текстбоксами (аналог тестового сервера в архиве DDEClient) получилась офигительно большой.
Основная проблема - распределение событий в зависимости от имён топиков и элементов.
карма: 1

0
файлы: 1ddeserver_1_0.rar [5KB] [541]
Разработчик
Ответов: 26151
Рейтинг: 2127
#2: 2008-05-09 01:09:08 ЛС | профиль | цитата
Прекрасно.
Работает нормально, я не увидел косяков.

Вот полная версия 1.00
Трохи клиента подправил в одном месте под FPC, иконки добавил, ну и косметика мелкая.

Можно в пакет добавлять
карма: 22

1
файлы: 1project_dde_1_00.zip [9.8KB] [472]
Голосовали:tsdima
Ответов: 2125
Рейтинг: 159
#3: 2008-05-09 10:53:18 ЛС | профиль | цитата
За иконки - спасибо. Рисовать я совсем не умею
------------ Дoбавленo:

А вот в пакет - пока рановато. Сервер доделать надо. Пока нельзя использовать несколько DDEServer или DDEServer и DDEClient совместно.
Кроме того есть идея сделать свойство TopicList, чтобы избавить пользователя от необходимости проверять имя топика, плюс ещё и индекс топика снизу выдавать. Для совместимости можно сделать так, что если свойство пустое, то принимать все топики без ограничений. Тогда можно будет поставить два DDEServer с разными топиками (можно даже разнести по мультикам, для большей читабельности) и не заботиться об имени топика вообще.
А ещё, я считаю, что можно было бы добавить в StrList точки doGetIndex,onGetIndex. Я уже несколько раз сожалел, что поиск индекса строки приходится делать несколькими компонентами, хотя там делов-то - вызвать FList.IndexOf

карма: 1

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#4: 2008-05-09 13:27:57 ЛС | профиль | цитата
tsdima писал(а):
Я уже несколько раз сожалел, что поиск индекса строки приходится делать несколькими компонентами

Ну так надо добавить, если экономятся компоненты малой кровью
карма: 22

0
Ответов: 2125
Рейтинг: 159
#5: 2008-05-09 15:34:18 ЛС | профиль | цитата
Вобщем вот. Добавил свойство TopicList, причесал код. Это, наверное, пойдёт уже на SVN.
карма: 1

0
файлы: 1project_dde_1_01.zip [10.6KB] [469]
Гость
Ответов: 17029
Рейтинг: 0
#6: 2008-05-09 16:58:14 правка | ЛС | профиль | цитата


Редактировалось 5 раз(а), последний 2021-06-22 14:27:02
карма: 0

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#7: 2008-05-09 18:39:28 ЛС | профиль | цитата
tsdima, а что со StrList'ом делать будем
Добавить в него doGetIndex и onGetIndex

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

Короче, я добавил doGetIndex в StrList
карма: 22

0
Ответов: 2125
Рейтинг: 159
#8: 2008-05-09 18:44:45 ЛС | профиль | цитата
Во всяком случае, скрытые они не помешают. Однако, например в схеме DDE_Server.sha удобнее брать значение для поиска с нижней точки сервера, а не из потока, и индекс используется не сразу, а потом. То есть пару точек снизу и сверху тоже пригодились бы (типа StrToFind и Index). Хотя для индекса, который используется потом, можно конечно и переменную воткнуть. Значение для поиска можно и с точки Str считывать, но т.к. смысл строк разный, вполне возможно, что обе точки пригодились бы.

Была ещё идея сделать не только doGetIndex (я хотел назвать doFind), но и поиск с использованием регулярных выражений (doMatch) с выдачей не только индекса, но и значений подвыражений (то, что обычно в выражении в скобках указано). Обработка строк для DDE-сервера, это тоже немаловажная фича, например обработка DDE-команды. Если бы была точка doMatch, то начало обработчика команд выглядело бы очень просто: DDE_Server --- StrList --- IndexToChannel, а уже после идёт обработка определённой команды с использованием параметров из МТ-потока.

карма: 1

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#9: 2008-05-10 01:15:52 ЛС | профиль | цитата
С доп точками проблем никаких, добавить можно. А с doMatch я не совсем понял, что надо -- какой формат строки для поиска подается на вход -- ряд строк для поиска, заключенных в скобки(выражение), и что на выходе должно получиться -- индекс+найденное выражение (MT-поток), и так в цикле, пока все выражения не переберем, так что ли

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


Добавил StrToFind и Index

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


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

А у тебя, случаем, нет простенького парсера регулярных выражений, а то я нашел на 150 кило -- RegExpr называется

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


Добавил в StrList еще и GetString

Вот какой получился сервер с новым StrList'ом



Add(MainForm,10952570,42,77)
{
Left=20
Top=105
Width=323
Height=210
Caption="DDE_Server"
link(onCreate,14007143:doStart,[])
}
Add(DDEServer,14007143,133,91)
{
ServiceName="DDE_Server"
TopicList=#5:Form1|
Point(doSetError)
Point(onConnect)
Point(onExecute)
link(onGetItem,8634435:doEvent1,[])
link(onPutItem,1330340:doEvent1,[(187,104)(187,146)])
link(onExecute,2584967:doMessage,[(177,118)(177,154)(72,154)(72,174)])
}
Add(Message,2584967,84,168)
{
Type=1
Point(onCANCEL)
link(Caption,14007143:TopicName,[(97,145)(139,145)])
link(onCANCEL,14007143:doSetError,[(124,181)(124,125)])
}
Add(GetIndexData,2907638,434,280)
{
link(Data1,5519043:Text,[])
link(Data2,12515059:Text,[])
}
Add(IndexToChanel,9620357,385,182)
{
Point(Index)
link(onEvent1,5519043:doText,[])
link(onEvent2,12515059:doText,[(426,195)(426,230)])
link(Index,10155259:Index,[])
}
Add(Hub,1330340,203,140)
{
link(onEvent1,14132275:doWork2,[])
link(onEvent2,9620357:doEvent,[(279,153)(279,188)])
}
Add(Edit,5519043,434,182)
{
Left=95
Top=50
Width=135
Height=25
Text="Text1"
link(onChange,14969987:doWork1,[])
}
Add(Edit,12515059,441,224)
{
Left=95
Top=95
Width=135
Height=25
Text="Text2"
link(onChange,14969987:doWork2,[(485,230)(485,195)])
}
Add(StrList,10155259,364,91)
{
@Hint=#10:Item Names|
Strings=#5:Text1|5:Text2|
Point(onGetIndex)
Point(onGetString)
Point(StrToFind)
Point(doGetString)
Point(doGetIndex)
Point(Index)
link(onGetIndex,2907638:doIndex,[(406,104)(406,286)])
link(onGetString,14007143:doSendChanges,[(419,111)(419,63)(103,63)(103,118)])
link(StrToFind,14007143:ItemName,[(384,79)(326,79)(326,170)(153,170)])
}
Add(ChanelToIndex,14969987,497,182)
{
link(onIndex,10155259:doGetString,[(542,188)(542,71)(352,71)(352,139)])
}
Add(DoData,1922078,280,98)
{
link(onEventData,14007143:doReturnItem,[(320,104)(320,79)(110,79)(110,111)])
link(Data,2907638:Var,[(286,88)(270,88)(270,322)(440,322)])
}
Add(Hub,8634435,203,91)
{
link(onEvent1,14132275:doWork1,[(256,97)])
link(onEvent2,1922078:doData,[])
}
Add(HubEx,14132275,252,133)
{
link(onEvent,10155259:doGetIndex,[])
}

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

В сервер надо бы добавить верхнюю точку -- ReturnItem, а то лишний компонент приходится ставить
------------ Дoбавленo:

Короче, я все, вместе с примерами, добавил на SVN. Так проще будет корректировать.
карма: 22

0
Ответов: 2125
Рейтинг: 159
#10: 2008-05-10 17:12:27 ЛС | профиль | цитата
nesco писал(а):
А с doMatch я не совсем понял, что надо -- какой формат строки для поиска подается на вход

На вход подаётся произвольная строка. А в StrList мы поместим список строк-регулярных-выражений. К какому выражению подойдёт строка, индекс того и выдавать.
Например, на вход мы подаём имя ячейки (как в Excel) R10C5, а регулярное выражение, к которому она подходит: R([0-9]+)C([0-9]+). На выходе имеем индекс регулярного выражения в StrList-е и подстроки "10" и "5".

nesco писал(а):
а то я нашел на 150 кило

Ну уж нет, такого монстра нам не надо

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

А насчёт RegExp, я думаю, может не стоит мешать всё в одну кучу - сделать отдельный компонент.
карма: 1

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#11: 2008-05-12 10:00:46 ЛС | профиль | цитата
tsdima писал(а):
может не стоит мешать всё в одну кучу - сделать отдельный компонент

О то, поди, самое лучшее решение. В текущем варианте взаимодействие сервер-клиент отрабатывает свой минимум нормально, все остальное -- это дополнительные приблуды.
------------ Дoбавленo:

tsdima, слушай, а этот зоопарк по сети можно запустить, предположим, сервер находится на другой машине и надо осуществить передачу данных по сети
карма: 22

0
Ответов: 3514
Рейтинг: 184
#12: 2008-05-12 21:50:31 ЛС | профиль | цитата
насколько я знаю, dde это для взаимодействия приложений..
карма: 0
0
Разработчик
Ответов: 26151
Рейтинг: 2127
#13: 2008-05-12 22:00:03 ЛС | профиль | цитата
Астрамак, а это ты к чему
карма: 22

0
Ответов: 2125
Рейтинг: 159
#14: 2008-05-13 13:50:26 ЛС | профиль | цитата
Это он к тому, что DDE - это обмен между приложениями на одном компьютере. Фактически, DDE реализован через посылку окну сообщения. А ddeml - это лишь надстройка, упрощающая работу с DDE, без неё на каждый чих сообщения слать и принимать надо.

nesco писал(а):
сервер находится на другой машине и надо осуществить передачу данных по сети

Это скорее DCOM будет, с его помощью и зарегистрированное приложение запустить можно (при разумных настройках безопасности), и объекты создать, и методы вызвать.

карма: 1

1
Голосовали:andrestudio
Разработчик
Ответов: 26151
Рейтинг: 2127
#15: 2008-05-13 16:52:11 ЛС | профиль | цитата
tsdima, у меня есть задумка -- сделать ReceiveMessages для обмена сообщениями между своими приложениями, но я столкнулся с проблемой. Попробовал на CreateWindow, но нифига не получилось создать окно заданного класса, может тут лучше создать пустой Control и приаттачить к нему обработчик с выводом данных наружу. Что можешь подсказать, может у тебя простенький код завалялся по созданию пустых окно
карма: 22

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