Вверх ↑
Этот топик читают: Гость
Администрация
Ответов: 15294
Рейтинг: 1518
#31: 2008-06-04 16:06:45 ЛС | профиль | цитата
Боюсь что придется ждать кого-то, кто поняв все выше написанное сможет задать вопрос по другому и возможно я смогу на него ответить. Вот г-н nesco, к примеру. Вроде он тут все читал. А пока же я совершенно не понимаю, чего ожидается...
карма: 26
0
Разработчик
Ответов: 26066
Рейтинг: 2120
#32: 2008-06-04 16:32:42 ЛС | профиль | цитата
Все, что написал Galkov, до конца понять может только Galkov.
По теме -- упор у нас в том, что мы не можем создать мультик контрол, дочерний, по отношенью к помещенному в нему контролу (результатом этого было бы то, что предлагает сделать Tad), естественно, с унаследованием всех свойств и методов. Имея такую возможность, можно было делать весьма интересные интерфейсные и схемные решения. Вроде об этом и говорил Galkov в начале
Трабла еще в том, что имея сейчас унаследования свойств и методов родителского класса, мы у контролов имеем "мертвые души", проще говоря -- неработающие унаследованные свойства и методы.
Это первое, что я пока понял.

карма: 22

0
Ответов: 9906
Рейтинг: 351
#33: 2008-06-04 16:50:32 ЛС | профиль | цитата
Именно это же и хотел написать:
Я совершенно не против, чтобы кто-то другой задал вопрос: как на HiAsm нарисовать схему для CodeGen (например для ElementsDelphiCodeGen, хотя для ElementsFTCGCodeGen было бы интереснее)
И решит с тобой все, попутно возникающие, интерфейсные вопросы.

А то, к примеру, коды ElementsDelphiCodeGen.dpr умеют (вроде бы) делать рекурсию, а среда даже проверить этого не позволяет.
С незапамятных времен не могу решить этот простой интерфейсный вопрос.
Научите дурака, как решать эти вопросы Честное слово, я умею учиться.
Мне совершенно достаточно результата - молча буду смотреть на его решение (хоть и не самый главный он наверное), и учиться

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

nesco писал(а):
Трабла еще в том, что имея сейчас унаследования свойств и методов родителского класса, мы у контролов имеем "мертвые души", проще говоря -- неработающие унаследованные свойства и методы.
Это первое, что я пока понял

А я пока - НЕТ. Разъясни пожалуйста, про чего это ты говоришь....

карма: 9

0
Администрация
Ответов: 15294
Рейтинг: 1518
#34: 2008-06-04 17:09:15 ЛС | профиль | цитата
nesco писал(а):
Трабла еще в том, что имея сейчас унаследования свойств и методов родителского класса, мы у контролов имеем "мертвые души", проще говоря -- неработающие унаследованные свойства и методы.

Вот это понятно и по существу. Согласен, это следует устранять дальнейшим расширениям наследований в конфигах.
------------ Дoбавленo:

Galkov писал(а):
а среда даже проверить этого не позволяет

проверить что?
------------ Дoбавленo:

Вот схема рекурсии:

Add(EntryPoint,13621921,21,105)
{
link(onStart,5244128:doEvent,[])
}
Add(Function,6708913,133,105)
{
Args=1
Name="func"
link(onPrint,1017760:doCompare,[])
}
Add(CallFunc,5743029,301,105)
{
Args=1
Name="func"
}
Add(Return,12986958,245,168)
{
}
Add(Hub,5244128,77,105)
{
link(onEvent1,6708913:doPrint,[])
link(onEvent2,6489776:doData,[(121,118)(121,174)])
}
Add(If_else,1017760,189,105)
{
Type=1
Op2=Integer(10)
link(onTrue,1956563:doOperation,[])
link(onFalse,12986958:doReturn,[(233,118)(233,174)])
link(Op1,3588956:Var2,[])
}
Add(Math,1956563,245,105)
{
Op2=1
link(onResult,5743029:doPrint,[])
link(Op1,3588956:Var3,[(251,93)])
}
Add(CallFunc,6891028,189,168)
{
Args=1
Name="func"
}
Add(DoData,6489776,133,168)
{
Data=Integer(0)
link(onEventData,6891028:doPrint,[])
}
Add(GetDataEx,3588956,182,84)
{
Angle=3
link(Data,6708913:Arg1,[(173,93)(173,149)(139,149)])
}

получаемый код:

#cpp
function func($arg1) {
if($arg1 < 10) {
func(($arg1+1));
}
else {
return("");
}
}
func(0);
чего тут среда должна была проверить?
карма: 26
0
Разработчик
Ответов: 26066
Рейтинг: 2120
#35: 2008-06-04 17:14:01 ЛС | профиль | цитата
Например -- onPaint, который работает только на MainForm'e и больше нигде, хотя эта точка унаследована всеми
------------ Дoбавленo:

немного опоздал
карма: 22

0
Администрация
Ответов: 15294
Рейтинг: 1518
#36: 2008-06-04 17:36:35 ЛС | профиль | цитата
это видимо конфигом как-нибудь так будет решаться:

[methods]
...
-onPaint
...
с выводом в ECreator всех наследуемых полей и методов и с возможностью их пометки как неиспользуемых.Не такая это простая задача...
карма: 26
0
Гость
Ответов: 17029
Рейтинг: 0
#37: 2008-06-04 19:34:43 правка | ЛС | профиль | цитата


Редактировалось 7 раз(а), последний 2021-06-21 04:28:50
карма: 0

0
Ответов: 2125
Рейтинг: 159
#38: 2008-06-04 21:28:59 ЛС | профиль | цитата
Galkov писал(а):
А то, к примеру, коды ElementsDelphiCodeGen.dpr умеют (вроде бы) делать рекурсию, а среда даже проверить этого не позволяет.
С незапамятных времен не могу решить этот простой интерфейсный вопрос.

Можно сделать новый режим динамического мультика, при котором он будет удаляться после отработки ##add, т.е. эта точка и будет входом в рекурсию.
карма: 1

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#39: 2008-06-04 22:31:47 ЛС | профиль | цитата
tsdima писал(а):
он будет удаляться после отработки ##add

Но один-то по-любому должен остаться -- самый первый. Может лучше отдельную такую точку предусмотреть, типа -- ##addautoremove
карма: 22

0
Ответов: 9906
Рейтинг: 351
#40: 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
Разработчик
Ответов: 26066
Рейтинг: 2120
#41: 2008-06-04 23:15:42 ЛС | профиль | цитата
Galkov писал(а):
что великолепный факт исполнения веток HUB-а: верхняя в DesignTime, а нижняя в RunTime

А где это обсуждалось, я чего-то упустил. Вроде по действиям, нижняя точка всегда выполняется после верхней, и никак не наоборт. На чем это можно конкретно проверить
карма: 22

0
Ответов: 2125
Рейтинг: 159
#42: 2008-06-04 23:16:31 ЛС | профиль | цитата
Galkov писал(а):
tsdima, ты чего такое говоришь

Шашки давно в руки не брал

карма: 1

0
Ответов: 9906
Рейтинг: 351
#43: 2008-06-04 23:17:13 ЛС | профиль | цитата
nesco, поверь на слово
карма: 9

0
Администрация
Ответов: 15294
Рейтинг: 1518
#44: 2008-06-05 11:48:39 ЛС | профиль | цитата
Гость Tad писал(а):
только используемых т.е. к возврату к старому ини ?

а ECreator должен сам догадаться, какие св-ва и методы родительского элемента используются в дочернем?

nesco писал(а):
Вроде по действиям, нижняя точка всегда выполняется после верхней

правило есть только на забор данных с верхних точек(аналогично парсингу аргументов в ЯВУ). На остальное в сущности никаких ограничений не налогается.
карма: 26
0
Ответов: 16884
Рейтинг: 1239
#45: 2008-06-06 01:21:44 ЛС | профиль | цитата
Dilma писал(а):
а ECreator должен сам догадаться, какие св-ва и методы родительского элемента используются в дочернем?
это дело разработчика компонента, выбирать из (выпадающего) списка свойств и методов родительского элемента то, что он считает нужным для создаваемого компонента. А создавать еще один ini - файл с минусами... Незнаю.
Элемент Edit : ну добавил я строчку if _prop_ClearOnEnter then Control.Text := '; в процедуру KeyDown ( и в свойства соответственно ) Не всегда нужно, чтобы после Enter окно очищалось (чаще наоборот). (не предлагаю сделать то же в штатном)
Элементы RadioButton и СheckBox : по большому счету, если хорошо подумать то правые точки onSelect и onCheck, которые можно было назвать одним именем onClick и нафик не нужны.
Пощелкай по RadioButton и убедись, что визуально он остается выбраным, а onSelect отрабатывает (дребезг контактов )
code_9213.txt





карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1code_9213.txt [161B] [451]
Сообщение
...
Прикрепленные файлы
(файлы не залиты)