Вверх ↑
Ответов: 9906
Рейтинг: 351
#1: 2008-06-04 22:57:30 ЛС | профиль | цитата
tsdima, ты чего такое говоришь

Во-первых, есть такой режим - MultiElementEx.Mode=OnlyOnce

Во-вторых, даже если бы его не было, при "не выбранном" экземпляре контейнера все именно в таком режиме и срабатывает

В-третьих, мы именно с тобой это уже подробно обсуждали на примере рекурсивного поиска в реестре (извини, но с памятью у меня лучше, чем с поиском по форуму): ты ставил HUB плюющийся на ##add, на рабочую точку, на ##delete через арифметику на ##count-1. А я тебе показывал что все это работает и без этих премудростей.
Там же рассказывал, что для запуска рекурсии "методом кольцевания" Dilma исхитрился на создание элемента Stack - Да, именно такова историческая правда про этот элемент.

Вспомнил

Примерно так:
Add(MainForm,8492045,133,126)
#sha
{
Left=10
Top=10
Width=259
Height=71
Caption="recursion"
Position=1
}
Add(Edit,6625971,182,182)
{
Width=251
Height=25
Align=2
Font=[MS Sans Serif,12,1,0,1]
Text="1"
Alignment=1
DataType=1
Point(doSelectAll)
link(onEnter,7225695:doAdd,[])
}
Add(Hub,6727881,133,189)
{
link(onEvent1,6625971:doText2,[])
link(onEvent2,6625971:doSelectAll,[])
}
Add(MultiElementEx,4545906,231,126)
{
Mode=1
link(X2,16398614:Var1,[(237,114)(220,114)(220,170)])
}
BEGIN_SDK
Add(EditMultiEx,11285725,21,21)
{
VarCount=#7:GetData|
DataCount=#2:X2|
Width=342
Height=116
link(GetData,11505429:GetData,[(62,137)])
}
Add(MT_Add,7225695,252,70)
{
InputMT=3
link(onAdd,7295000:doOperation,[])
link(Data,11285725:X2,[(258,21)])
}
Add(EventFromData,11505429,56,70)
{
link(onEvent,8122106:doCompare,[])
link(Data,7295000:Result,[(62,58)(95,58)(95,120)(307,120)])
}
Add(If_else,8122106,105,70)
{
Type=2
Op2=Integer(1)
link(onTrue,11850537:doValue,[])
link(onFalse,1177538:doWork3,[(144,83)])
}
Add(HubEx,1177538,140,35)
{
Angle=2
link(onEvent,11505429:doData,[(44,48)(44,76)])
}
Add(Math,7295000,301,70)
{
OpType=2
Default=1
link(onResult,1177538:doWork2,[(345,76)(345,48)])
link(Op1,11850537:Value,[(307,60)(290,60)(290,114)(160,114)])
}
Add(Math,5301980,203,70)
{
OpType=1
Op2=1
link(onResult,7225695:doAdd,[])
}
Add(Memory,11850537,154,70)
{
link(onData,5301980:doOperation,[])
}
END_SDK
Add(GetDataEx,16398614,224,161)
{
link(Data,4545906:GetData,[])
}
Add(MT_Add,7225695,231,189)
{
InputMT=3
link(onAdd,6727881:doEvent1,[(275,195)(275,230)(121,230)(121,195)])
link(Data,16398614:Var2,[])
}
Это "вертикальное" исполнение, и оно РАБОТАЕТ.
"Горизонтальное" смотрелось бы логичнее и привычнее (не пужайтесь, мультик внутри, это в оригинале -- линк на родителя ):

#sha
Add(MainForm,8492045,133,126)
{
Left=10
Top=10
Width=259
Height=71
Caption="Recursion"
Position=1
}
Add(Edit,6625971,182,182)
{
Width=251
Height=25
Align=2
Font=[MS Sans Serif,12,1,0,1]
Text="1"
Alignment=1
DataType=1
Point(doSelectAll)
link(onEnter,6713199:doFactorial,[])
}
Add(Hub,6727881,133,189)
{
link(onEvent1,6625971:doText2,[])
link(onEvent2,6625971:doSelectAll,[])
}
Add(MultiElementEx,6713199,245,189)
{
Mode=1
@IsLib=True
link(onResult,6727881:doEvent1,[(286,195)(286,168)(121,168)(121,195)])
}
BEGIN_SDK
Add(EditMultiEx,9194131,21,21)
{
WorkCount=#11:doFactorial|
EventCount=#8:onResult|
Width=328
Height=123
link(doFactorial,8122106:doCompare,[(45,27)(45,69)])
}
Add(Memory,11850537,119,70)
{
link(onData,5301980:doOperation,[])
}
Add(If_else,8122106,70,63)
{
Type=1
Op2=Integer(2)
link(onTrue,2880545:doData,[(113,69)(113,27)])
link(onFalse,11850537:doValue,[])
}
Add(Math,7295000,266,70)
{
OpType=2
Default=1
link(onResult,9842387:doWork3,[(319,76)])
link(Op1,11850537:Value,[(272,60)(260,60)(260,115)(125,115)])
}
Add(Math,5301980,168,70)
{
OpType=1
Op2=1
link(onResult,4140020:doFactorial,[])
}
Add(HubEx,9842387,315,14)
{
link(onEvent,9194131:onResult,[])
}
Add(DoData,2880545,168,21)
{
Data=Integer(1)
link(onEventData,9842387:doWork2,[])
}
Add(MultiElementEx,4140020,217,70)
{
elink(6713199)
link(onResult,7295000:doOperation,[])
}
END_SDK
И мое утверждение состояло в следующем: ровно в тот момент, когда СРЕДА не будет коверкать этот код - это будет правильно работать. Хотя проверить это крайне затруднительно.
Это можно заставить работать вышеупомянутыми "имеющимися средствами"
Попробуйте, и зацените понятность таких решений

А ведь нарисованная схема, это практически прямое воплощение таких кодов из ElementsFTCGCodeGen.dpr

#pas
function TParser.ReadPoint(lp:id_point):PScData;
.....
Parser := TParser.Create;
.....
Parser.Parse(cgt, el, fname, codeb, args, @ret);
.....
Parser.Destroy;
end;
Прямее и не придумаешь
И чего же получается
Оказывается, существует стиль программирования рекурсии для "белых людей" - код выше сделан ведь Dilma
И существует - для пользователей HiAsm, пример из последнего поста Dilma

Мне представляется, что, оставаясь пользователем HiAsm, я имею право на стиль программирования "для белых людей"
Мне было бы совершенно понятно, что приведенное решение выступает как временное, что великолепный факт исполнения веток HUB-а: верхняя в DesignTime, а нижняя в RunTime - тоже временное

Но это же преподносится как новая концепция
Мне совершенно не нравится подход, связанный с НЕОБОСНОВАННЫМ изменением концепции.



И что характерно, все это уже имеет бороду дольше, чем 2 года (точнее вспомнить и не удается)
У меня уже и цензурные слова кончаются
карма: 9

0