Вверх ↑
Этот топик читают: Гость
Ответов: 817
Рейтинг: 52
#1: 2011-09-28 13:53:56 ЛС | профиль | цитата
Добрый день!

Посмотрите, если я не прав, поправьте меня, но ничего более дельного я не придумал
Запустите программу с ключами /m любая строка и /?
code_25274.txt
Из всего этого встает один вопрос. Как запускать программу с несколькими ключами?
карма: 1

0
файлы: 1code_25274.txt [1.3KB] [155]
Разработчик
Ответов: 26163
Рейтинг: 2127
#2: 2011-09-28 14:06:11 ЛС | профиль | цитата
-= DriveR =- писал(а):
Как запускать программу с несколькими ключами?

Тю!

code_25276.txt
карма: 22

0
файлы: 1code_25276.txt [970B] [175]
Ответов: 817
Рейтинг: 52
#3: 2011-09-28 14:33:00 ЛС | профиль | цитата
Ага, понял
а как быть если за ключом следуют входные данные
например /k 192.168.0.1 /m привет Вася
карма: 1

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#4: 2011-09-28 14:56:06 ЛС | профиль | цитата
-= DriveR =- писал(а):
например /k 192.168.0.1 /m привет Вася

Во-первых: надо так, разделители-то пробелы -- /k 192.168.0.1 /m "привет Вася", а лучше так, тогда не надо парится вообще -- /k=192.168.0.1 /m="привет Вася". Дальше парсируй строку на ходу и проверяй ключи на соотвествие
------------ Дoбавленo в 14.55:
Вот тебе пример на вот такой набор команд -- /k=192.168.0.1 /m="привет Вася","привет Петя"



Add(MainForm,15202770,196,210)
{
Width=315
link(onCreate,12036341:doEnum,[])
}
Add(Application,7342048,252,168)
{
}
Add(ArrayEnum,12036341,259,224)
{
link(onItem,6945514:doSplit,[])
link(Array,7342048:Params,[])
}
Add(Memo,12404861,672,231)
{
Left=135
Top=10
Width=140
Height=210
}
Add(MultiStrData,6945514,315,224)
{
Char="="
Count=1
link(onPart1,16626034:doCompare,[])
}
Add(StrMask,16626034,378,224)
{
Mask="/k"
link(onFalse,8298699:doCompare,[])
link(onTrue,2160139:doText,[])
}
Add(Edit,2160139,455,231)
{
Left=10
Top=10
Width=110
Text=""
link(Str,434793:Var2,[])
}
Add(StrMask,8298699,511,224)
{
Mask="/m"
link(onTrue,436575:doEnum,[])
}
Add(Str_Enum,436575,567,231)
{
Delimiter=","
link(onEnum,2627151:doReplace,[])
link(String,434793:Var3,[(573,206)])
}
Add(GetDataEx,434793,455,201)
{
Angle=3
link(Data,6945514:RemaindStr,[(422,206)(422,268)(321,268)])
}
Add(Replace,2627151,616,231)
{
SubStr="""
link(onReplace,12404861:doAdd,[])
}

------------ Дoбавленo в 14.56:
Надеюсь, теперь все понятно
карма: 22

1
Голосовали:-= DriveR =-
Ответов: 3889
Рейтинг: 362
#5: 2011-09-28 15:00:11 ЛС | профиль | цитата
code_25278.txt
карма: 1

0
файлы: 1code_25278.txt [1.3KB] [123]
Разработчик
Ответов: 26163
Рейтинг: 2127
#6: 2011-09-28 15:18:07 ЛС | профиль | цитата
Мою схему тоже можно улучшить

code_25279.txt
------------ Дoбавленo в 15.15:
1nd1g0, а вот это



Add(ArrayEnum,12036341,273,287)
{
link(onItem,11578905:doEvent,[])
}
Add(IndexToChanel,11578905,455,287)
{
Point(Data)
Point(Index)
link(Data,12036341:Item,[(461,275)(441,275)(441,332)(279,332)])
}

лишнее. Данные прходят насквозь через IndexToChanel, это принцип используется в коммутаторах, и на выходе ArryEnum как раз присутствуют нужные данные
------------ Дoбавленo в 15.18:
А вот это



Add(Memory,8036604,462,224)
{
Default=Integer(0)
}
Add(ChanelToIndex,6771346,413,224)
{
link(onIndex,8036604:doValue,[])
}

можно заменить обычным Switch-ем
карма: 22

0
файлы: 1code_25279.txt [1022B] [156]
Ответов: 3889
Рейтинг: 362
#7: 2011-09-28 16:06:45 ЛС | профиль | цитата
nesco писал(а):
заменить обычным Switch-ем

Мало ли сколько ключей, принимающих неопределённое количество параметров. Кроме того, при переключении Switch выдаёт не всегда желаемое паразитное срабатывание событий. Я ориентировался на лёгкую расширяемость и универсальность.
карма: 1

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#8: 2011-09-28 16:13:14 ЛС | профиль | цитата
1nd1g0 писал(а):
Кроме того, при переключении Switch выдаёт не всегда желаемое паразитное срабатывание событий

Не очень понятное выражение. Вообще-то, я конкретно по схеме писал, а не про то, что может быть.
1nd1g0 писал(а):
Нельзя, мало ли сколько ключей, принимающих неопределённое количество параметров

Никакой разницы, сколько там ключей, переключатель ловит команду и переключается на прием данных -- двухпозиционный коммутатор, и все
карма: 22

0
Ответов: 3889
Рейтинг: 362
#9: 2011-09-28 16:24:29 ЛС | профиль | цитата
nesco писал(а):
переключается на прием данных

Так там, по сути, не просто приём данных, а непосредственная работа с ними, и на каждом ключе работа может быть своя. В схеме пока не хватает защиты от дурака и обработки ситуаций с пустыми параметрами, кое-что нужно переделать, но мне сейчас некогда, главное - принцип, на вопрос топикстартера мы с тобой уже ответили исчерпывающе.
карма: 1

0
Ответов: 817
Рейтинг: 52
#10: 2011-09-28 16:47:28 ЛС | профиль | цитата
1nd1g0, nesco,
Ну вы мужики даете
Я пол дня голову ломал как все это сделать
Все понял, пошел доделывать под себя
Спасибо
------------ Дoбавленo в 16.47:
Хотел плюсануть всем, а мне сообщается что я исчерпал свой лимит за день
как то это очень жестко
карма: 1

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#11: 2011-09-28 17:12:31 ЛС | профиль | цитата
-= DriveR =- писал(а):
Я пол дня голову ломал как все это сделать

На вот тебе еще одну, для коллекции. Работает как у 1nd1g0 (везде пробелы разделитель), не упрощал, и на иммитаторе, для наглядности. Альтернтивный вариант, тсзать

code_25280.txt
------------ Дoбавленo в 17.12:
А вот и упрощенный вариант


Add(MainForm,15202770,112,140)
{
Width=315
link(onCreate,12036341:doEnum,[])
}
Add(Application,7342048,112,91)
{
}
Add(ArrayEnum,12036341,175,154)
{
link(onItem,16061690:doEvent1,[])
link(Array,13621643:Array,[])
}
Add(Memo,12404861,637,217)
{
Left=135
Top=10
Width=140
Height=210
}
Add(Edit,2160139,581,168)
{
Left=10
Top=10
Width=110
Text=""
}
Add(Replace,2627151,581,217)
{
SubStr="""
link(onReplace,12404861:doAdd,[])
}
Add(StrList,1262865,287,126)
{
Strings=#2:/k|2:/m|
Point(onGetIndex)
Point(doGetIndex)
link(onGetIndex,11807493:doCase,[])
}
Add(IndexToChanel,6459397,441,203)
{
@Hint=#30:Переключатель команда/параметр|
Point(Data)
Point(Index)
link(onEvent2,4851722:doEvent,[])
link(Index,9939769:State,[])
AddHint(107,-107,196,13,@Hint)
}
Add(Case,11807493,336,133)
{
Value=Integer(-1)
link(onNextCase,82049:doValue,[])
}
Add(Switch,9939769,448,119)
{
DataOn=Integer(1)
DataOff=Integer(0)
Point(State)
Point(doOn)
}
Add(IndexToChanel,4851722,504,210)
{
@Hint=#18:Коммутатор команд |
Point(Index)
link(onEvent1,2160139:doText,[(558,216)(558,174)])
link(onEvent2,2627151:doReplace,[])
link(Index,82049:Value,[(510,188)(398,188)])
AddHint(44,-90,121,13,@Hint)
}
Add(Memory,82049,392,133)
{
link(onData,9939769:doOn,[])
}
Add(Copy,4748007,287,77)
{
Position=1
Count=1
link(onCopy,5939330:doCase,[])
}
Add(Case,5939330,336,77)
{
Value=String(/)
link(onTrue,9939769:doReset,[(435,90)(435,132)])
}
Add(Hub,16061690,231,154)
{
OutCount=3
link(onEvent1,4748007:doCopy,[(265,160)(265,83)])
link(onEvent2,6459397:doEvent,[(265,167)(265,209)])
link(onEvent3,1262865:doGetIndex,[])
}
Add(StrList,13621643,161,77)
{
Strings=#2:/k|11:192.168.0.1|2:/m|13:"привет Вася"|13:"привет Петя"|
}

карма: 22

0
файлы: 1code_25280.txt [2KB] [205]
Ответов: 3889
Рейтинг: 362
#12: 2011-09-28 17:44:05 ЛС | профиль | цитата
Продолжаем

code_25281.txt
карма: 1

0
файлы: 1code_25281.txt [1.1KB] [165]
Разработчик
Ответов: 26163
Рейтинг: 2127
#13: 2011-09-28 17:46:53 ЛС | профиль | цитата
Вот это уже интереснее. Но есть один недостаток -- если не найдет команду, то будет сыпать все на последнюю
карма: 22

0
Ответов: 3889
Рейтинг: 362
#14: 2011-09-28 18:09:39 ЛС | профиль | цитата
nesco писал(а):
Но есть один недостаток

Так это не недостаток, а особенность работы программы Пускай обработчик данных команды защиту от лишних реализует, как вариант:

Add(Application,7342048,175,147)
{
}
Add(ArrayEnum,12036341,238,210)
{
link(onItem,2677586:doCompare,[])
link(Array,13621643:Array,[])
}
Add(StrList,13621643,224,133)
{
Strings=#2:/k|11:192.168.0.1|2:/m|13:"привет Вася"|13:"привет Петя"|14:"Hello world!"|2:/?|7:"Do it"|
}
Add(StrMask,2677586,294,210)
{
@Hint=#22:Детектор ключпараметр|
Mask="/*"
link(onFalse,10532779:doEvent,[(347,216)(347,272)])
link(onTrue,1262865:doGetIndex,[])
AddHint(-41,-101,146,13,@Hint)
}
Add(IndexToChanel,9455467,546,182)
{
@Hint=#42:Коммутатор действий при нахождении команды|
Count=4
link(onEvent4,8549105:doMessage,[])
AddHint(-7,-72,148,26,@Hint)
}
Add(StrList,1262865,490,175)
{
Strings=#0:|2:/k|2:/m|2:/?|
Point(onGetIndex)
Point(doGetIndex)
Point(Index)
Point(doGetString)
link(onGetIndex,9455467:doEvent,[])
}
Add(IndexToChanel,10532779,511,266)
{
@Hint=#74:Коммутатор обработки параметров в зависимости от предшествовавшей команды |
Count=3
Point(Index)
link(onEvent2,2160139:doText,[(569,279)(569,244)])
link(Index,1262865:Index,[])
link(onEvent3,7061935:doEvent1,[])
AddHint(-139,52,200,39,@Hint)
}
Add(MainForm,8166335,168,196)
{
Width=315
link(onCreate,12036341:doEnum,[])
}
Add(Memo,12404861,784,280)
{
Left=135
Top=10
Width=140
Height=210
}
Add(Edit,2160139,595,238)
{
Left=10
Top=10
Width=110
Text=""
}
Add(Replace,2627151,707,280)
{
SubStr="""
link(onReplace,12404861:doAdd,[])
}
Add(CounterEx,5103177,595,287)
{
Max=1
Point(onThroughMax)
link(onThroughMax,11600638:doWork,[])
}
Add(Hub,7061935,567,280)
{
link(onEvent1,2627151:doReplace,[])
link(onEvent2,5103177:doNext,[])
}
Add(Message,8549105,609,203)
{
Message="/?
/k <параметр>
/m <параметр> <параметр>"
link(onMessage,7350937:doWork,[])
}
Add(LineBreakEx,11600638,637,294)
{
Caption="reset"
}
Add(LineBreakEx,4795109,364,224)
{
Caption="reset"
Type=1
link(OnEvent,11866657:doData,[])
}
Add(LineBreakEx,7350937,658,203)
{
Caption="reset"
}
Add(DoData,11866657,441,224)
{
Data=Integer(0)
link(onEventData,1262865:doGetString,[])
}


------------ Дoбавленo в 18.09:
Кстати, вроде кавычки убирать не нужно будет в реальной схеме, парсер параметров командной строки их уберёт, если правильно помню.
карма: 1

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#15: 2011-09-28 20:44:58 ЛС | профиль | цитата
1nd1g0 писал(а):
парсер параметров командной строки их уберёт, если правильно помню

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

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