AlexKir, для выкладывания примеров программ есть раздел Upload, либо комнаты.
И еще совет: обратите внимание на использование компонент StrCat и MathParse из вашего примера в схеме ниже:
[code:1]Add(Button,971111,112,140)
{
Left=110
Top=140
Font=[MS Sans Serif,8,0,0,1]
link(onClick,9425103:doCalc,[])
}
Add(MathParse,9425103,161,140)
{
MathStr="8 + 10"
link(onResult,7404940:doStrCat,[])
}
Add(StrCat,7404940,217,140)
{
Str1="Результат: "
link(onStrCat,14457796:doMessage,[])
}
Add(Message,14457796,280,140)
{
}
[/code:1]
так в калькуляторе DoData и Memory не нужны совершенно.
Этот топик читают: Гость
Администрация
Ответов: 15295
Рейтинг: 1519
|
|||
карма: 27 |
|
Ответов: 9906
Рейтинг: 351
|
|||
"AlexKir" писал(а): К сожалению мне не удалось справится с обработкой исключений в МатПарсере "штатно" ( те не влезая в код компонента) AlexKir, не понятно, нужны разъяснения Да, и еще.... Разница только стилистическая, но я бы делал так: [code:1]Add(MainForm,8767041,98,21) { Left=20 Top=105 Width=225 Height=288 Color=32768 Font=[MS Sans Serif,8,0,0,1] Caption="Calk" BorderStyle=6 DragForm=0 } Add(Button,13441086,161,238) { Left=25 Top=105 Width=40 Height=35 Font=[MS Sans Serif,8,0,0,1] Caption="1" Data=String(1) link(onClick,14176315:doWork1,[(207,244)]) } Add(Button,6883369,161,182) { Left=70 Top=105 Width=40 Height=35 Font=[MS Sans Serif,8,0,0,1] Caption="2" Data=String(2) link(onClick,8299961:doWork3,[(207,188)]) } Add(Button,14766010,98,273) { Left=115 Top=105 Width=40 Height=35 Font=[MS Sans Serif,8,0,0,1] Caption="3" Data=String(3) link(onClick,11222772:doWork2,[(163,279)(142,279)]) } Add(Button,1382853,98,238) { Left=160 Top=145 Width=40 Height=35 Font=[MS Sans Serif,8,0,0,1] Caption="+" Data=String(+) link(onClick,11222772:doWork1,[(151,244)]) } Add(Button,7724731,98,308) { Left=25 Top=145 Width=40 Height=35 Font=[MS Sans Serif,8,0,0,1] Caption="4" Data=String(4) link(onClick,11222772:doWork3,[(151,314)]) } Add(Button,3133314,98,203) { Left=70 Top=145 Width=40 Height=35 Font=[MS Sans Serif,8,0,0,1] Caption="5" Data=String(5) link(onClick,11222362:doWork3,[(151,209)]) } Add(Button,16175944,98,133) { Left=115 Top=145 Width=40 Height=35 Font=[MS Sans Serif,8,0,0,1] Caption="6" Data=String(6) link(onClick,11222362:doWork1,[(151,139)]) } Add(Button,15074715,98,168) { Left=160 Top=185 Width=40 Height=35 Font=[MS Sans Serif,8,0,0,1] Caption="-" Data=String(-) link(onClick,11222362:doWork2,[]) } Add(Button,272987,35,147) { Left=25 Top=225 Width=40 Height=35 Font=[MS Sans Serif,8,0,0,1] Caption="0" Data=String(0) link(onClick,1491768:doWork3,[(88,153)]) } Add(Button,4246599,35,357) { Left=115 Top=185 Width=40 Height=35 Font=[MS Sans Serif,8,0,0,1] Caption="9" Data=String(9) link(onClick,13670035:doWork3,[(88,363)]) } Add(Button,5894250,35,287) { Left=70 Top=185 Width=40 Height=35 Font=[MS Sans Serif,8,0,0,1] Caption="8" Data=String(8) link(onClick,13670035:doWork1,[(88,293)]) } Add(Button,11901354,35,322) { Left=25 Top=185 Width=40 Height=35 Font=[MS Sans Serif,8,0,0,1] Caption="7" Data=String(7) link(onClick,13670035:doWork2,[]) } Add(Button,9567953,35,252) { Left=70 Top=225 Width=40 Height=35 Font=[MS Sans Serif,8,0,0,1] Caption="." Data=String(.) link(onClick,14591964:doWork3,[(88,258)]) } Add(Button,2620168,308,63) { Left=115 Top=225 Width=40 Height=35 Font=[MS Sans Serif,8,0,0,1] Caption="=" link(onClick,2874976:doCalc,[]) } Add(Button,11604068,161,77) { Left=160 Top=225 Width=40 Height=35 Font=[MS Sans Serif,8,0,0,1] Caption="C" Data=String() link(onClick,2557462:doText2,[]) } Add(Button,14987044,35,42) { Left=25 Top=65 Width=35 Height=30 Font=[MS Sans Serif,8,1,0,1] Caption="Exit" link(onClick,8767041:doClose,[]) } Add(Edit,2557462,259,70) { Left=20 Top=25 Width=185 Height=30 Color=0 Font=[Terminal,14,5,65280,1] Text="" link(onChange,2874976:doMathStr,[]) } Add(Label,14858966,161,28) { Left=15 Width=47 Height=19 Color=32768 Font=[MS Sans Serif,12,1,65535,1] Caption="Niiy" } Add(HubEx,14176315,203,266) { link(onEvent,14132847:doWork3,[(228,279)]) } Add(HubEx,11222772,147,266) { link(onEvent,14176315:doWork2,[]) } Add(StrCat,14298895,259,217) { link(onStrCat,8279080:doWork3,[(301,223)(301,149)(235,149)]) link(Str1,2557462:Text,[(265,174)(265,174)]) } Add(MathParse,2874976,364,63) { DataCount=1 MathStr="%1" Point(doMathStr) link(onResult,8279080:doWork1,[(406,69)(406,53)(235,53)]) } Add(HubEx,11222362,147,161) { link(onEvent,8299961:doWork2,[]) } Add(Button,2865572,35,182) { Left=160 Top=105 Width=40 Height=35 Font=[MS Sans Serif,8,0,0,1] Caption=")" Data=String()) link(onClick,14591964:doWork1,[(88,188)]) } Add(Button,1002532,35,217) { Left=70 Top=65 Width=40 Height=35 Font=[Fixedsys,17,0,0,1] Caption="*" Data=String(*) link(onClick,14591964:doWork2,[]) } Add(Button,14155146,35,112) { Left=115 Top=65 Width=40 Height=35 Font=[MS Sans Serif,18,0,0,1] Caption="/" Data=String(/) link(onClick,1491768:doWork2,[]) } Add(Button,1499230,35,77) { Left=160 Top=65 Width=40 Height=35 Font=[MS Sans Serif,8,0,0,1] Caption="(" Data=String(() link(onClick,1491768:doWork1,[(88,83)]) } Add(HubEx,8299961,203,161) { link(onEvent,14132847:doWork1,[(228,174)]) } Add(HubEx,8279080,231,63) { link(onEvent,2557462:doText,[(256,76)(256,76)]) } Add(HubEx,14132847,224,210) { link(onEvent,14298895:doStrCat,[]) } Add(HubEx,1491768,84,105) { link(onEvent,8299961:doWork1,[(207,118)]) } Add(HubEx,14591964,84,210) { link(onEvent,14132847:doWork2,[]) } Add(HubEx,13670035,84,315) { link(onEvent,14176315:doWork3,[(207,328)]) }[/code:1] |
|||
карма: 9 |
|
Гость
Ответов: 17029
Рейтинг: 0
|
|||
Редактировалось 3 раз(а), последний 2021-05-21 08:37:34 |
|||
карма: 0 |
|
Ответов: 9906
Рейтинг: 351
|
|||
AlexKir,
1) Есть маленькая тонкость: "узлы" это лишь понятие среды, и не добавляют ни одного байта кода, в отличии от Hub и GetData. Появились они, исторически, позже, и оба варианта разветвителей живут вместе, прежде всего, в силу соображений совместимости. 2) Использование данных, передающихся через поток, экономит (как Вы могли заметить) коды, хотя, возможно, менее очевидно. Ну а приоритеты HiAsm по выбору направления приема данных описаны в справке HiAsm.chm/Основы/Вступление 3) Ваш самый первый вариант, безусловно, работоспособен. Никаких претензий. Просто делимся соображениями 4) Зато в Дельфях исключения перехватываются. И выброшены только проверки, перехватываемые FPU. Там полная корректность, за исключением одной тонкости, о которой скажу ниже. Про характеристику "гнуснейший" рунтайма - согласен. Не солидно Под FPC, на данный момент, мы не имеем портированного с KOL модуля ERR. Именно он обеспечивает фичу exception. Стандартные средства Дельфи просят для этого около 100К кода дополнительно, а KOL - 6. Есть разница, однако. Если средства перехвата в FPC (недавно появившиеся, как Вы сказали) такого же калибра, что и в Дельфях, то это проблема.... А дальше альтернатива: а) Если мы отказываемся от технологии exception, то надо добавлять, удаленную ранее систему проверок, и вариант Дельфи переводить на эту же технологию. б) Трудимся над внедрением технологии под FPC, и здесь обнаруживаем новые подводные камни. Приемлем ли первый вариант Это реально, и цена не очень большая - 2-3К кода. Но проверками всех исключений мы никогда не закроем (исключение можно получить даже на сложении двух чисел). И получится, что HiAsm все-равно останется способен выдавать тот самый "гнуснейший" рунтайм, хоть и по-реже. Вот в блоках "элементарной" математики все проверки на месте, а получить "гнуснейший" рунтайм - запросто. И, вроде, только математические блоки так гадят репутации HiAsm. Коды остальных элементов вроде можно написать так, чтобы его не было.... А что со вторым вариантом Да все отлично, кроме двух незадач... Первая - еще не знаю, как это сделать под FPC. Но, думается, что это физически преодолимо, все-таки. Вторая - исключения в ObjectPascal (т.е. и в Дельфях тоже) полностью игнорируют факт расхода динамической памяти "незаконченными" продпрограммами. В отличии от C++, где существуют списки необходимых для выполнения деструкторов. Видимо, связано с идеологической разницей в языках: в C++ вызов конструкторов/деструкторов производится автоматически, а в паскалях - ручками. Этим сейчас страдает FMP - существует безвозвратный (не такой уж большой, если один раз) расход памяти при ошибках в компиляции строки. В MP такого нет, но не надо кричать ура Там возможен вызов вычислительного процесса через верхнюю точку, а там в свою очередь возможны исключения (вспомните вышестоящую сентенцию об "элементарных" мат-элементах), которые честно перехватываются (:! вызывающим парсером - и чего будет с памятью, не ясно Вобщем-то, проблему расхода памяти при исключениях в FMP персонально преодолеть можно - организовать ручками список необходимых деструкторов, который реализуется в обработчике исключений. Но остается вышеупомянутый вопрос вызова схемных блоков HiAsm через верхние точки элемента =================================== Вобщем, застряло это как-то на фазе подобных философских размышлений, что не совсем хорошо, естественно.............. |
|||
карма: 9 |
|
Ответов: 964
Рейтинг: 12
|
|||
Кстати, есть еще комиляторы"условно совместимые с Дельфи"
Virtual Pascal и кажется ТNТ Рascal. (Но последний комерческий хотя и дешевле Дельфи разумеется.) |
|||
карма: 0 |
|
Администрация
Ответов: 15295
Рейтинг: 1519
|
|||
Virtual Pascal - совместим, но еще более далек от Delphi чем FPC в виду меньшей распространенности. ТNТ Рascal - тут все и так ясно.
|
|||
карма: 27 |
|
21