Вверх ↑
Этот топик читают: Гость
Этот топик был перемещен из раздела "Делаем компоненты"
Ответов: 4
Рейтинг: 0
#1: 2020-01-26 02:43:54 ЛС | профиль | цитата
Приветствую!
Запилил такую программку, в строке Edit вводим "=10+20+30"(ну или другие цифры) жмем Enter и получаем результат в том же Edit(как в ячейке Excel), при двойном нажатии ЛКМ возвращается введенная формула и как ни странно все работает, но только со знаком плюс(+) других символов не понимает, да впрочем как и я не понимаю))
Если есть у кого-то мысли как прикрутить остальные вычитание, умножение, деление и думаю на этом достаточно, хотя скобки тоже наверно нужны, прошу помочь.
P.S. В этом деле недавно, но надеюсь надолго!

Make(delphi)
ver(4.05 build 186)
Add(MainForm,2153324,161,84)
{
Width=278
Height=101
Caption="Сумма в строке"
}
Add(MultiElement,15466702,287,98)
{
link(onEvent1,8717068:doText,[(332,104)(332,75)(213,75)(213,90)])
link(onEvent2,8717068:doText2,[(331,111)(331,135)(213,135)(213,97)])
link(Data1,8717068:Text,[(293,86)(268,86)(268,126)(230,126)])
}
BEGIN_SDK
Add(EditMulti,15444727,21,21)
{
EventCount=2
WorkCount=2
DataCount=1
VarCount=1
Width=419
Height=305
VOffset=49
HOffset=91
link(doWork1,16440207:doCase,[])
link(doWork2,5997249:doEnum,[(56,83)(56,139)])
link(Var1,2524235:Result,[(118,308)(202,308)])
}
Add(MultiStrPart,11554405,196,210)
{
Char="+"
Count=30
link(onSplit,2524235:doCalc,[(417,216)(417,300)(184,300)(184,265)])
link(Str,12462022:Right,[(202,198)(178,198)(178,295)(125,295)])
}
Add(MathParse,2524235,196,259)
{
DataCount=30
MathStr="%1 + %2 + %3 + %4 + %5 + %6 + %7 + %8 + %9 + %10 + %11 + %12 + %13 + %14 + %15 + %16 + %17 + %18 + %19 + %20 + %21 + %22 + %23 + %24 + %25 + %26 + %27 + %28 + %29 + %30"
link(onResult,15444727:onEvent1,[(429,265)(429,76)])
link(X1,11554405:Part1,[])
link(X2,11554405:Part2,[])
link(X3,11554405:Part3,[])
link(X4,11554405:Part4,[])
link(X5,11554405:Part5,[])
link(X6,11554405:Part6,[])
link(X7,11554405:Part7,[])
link(X8,11554405:Part8,[])
link(X9,11554405:Part9,[])
link(X10,11554405:Part10,[])
link(X11,11554405:Part11,[])
link(X12,11554405:Part12,[])
link(X13,11554405:Part13,[])
link(X14,11554405:Part14,[])
link(X15,11554405:Part15,[])
link(X16,11554405:Part16,[])
link(X17,11554405:Part17,[])
link(X18,11554405:Part18,[])
link(X19,11554405:Part19,[])
link(X20,11554405:Part20,[])
link(X21,11554405:Part21,[])
link(X22,11554405:Part22,[])
link(X23,11554405:Part23,[])
link(X24,11554405:Part24,[])
link(X25,11554405:Part25,[])
link(X26,11554405:Part26,[])
link(X27,11554405:Part27,[])
link(X28,11554405:Part28,[])
link(X29,11554405:Part29,[])
link(X30,11554405:Part30,[])
}
Add(Case,16440207,70,70)
{
Value=Integer(13)
link(onTrue,14946485:doEvent1,[])
}
Add(Hub,14946485,119,77)
{
link(onEvent1,5303958:doData,[])
link(onEvent2,1461385:doSearch,[(144,90)(144,106)(45,106)(45,209)])
}
Add(DoData,5303958,168,77)
{
link(onEventData,4816344:doAdd,[])
link(Data,5987180:getVar,[])
}
Add(ArrayEnum,5997249,70,133)
{
link(onItem,7142047:doData,[])
link(onEndEnum,4816344:doClear,[(217,146)(217,90)])
link(Array,4816344:Array,[(76,128)(251,128)])
}
Add(DoData,7142047,287,133)
{
link(onEventData,15444727:onEvent2,[(421,139)(421,83)])
link(Data,5997249:Item,[(293,121)(273,121)(273,172)(76,172)])
}
Add(StrList,4816344,231,77)
{
}
Add(If_else,15956330,70,252)
{
Op2=Integer(1)
link(onTrue,12462022:doSplit,[])
link(Op1,1461385:Position,[])
}
Add(Position,1461385,70,203)
{
Target="="
link(onSearch,15956330:doCompare,[(114,209)(114,241)(58,241)(58,258)])
link(Str,5768510:getVar,[])
}
Add(StrPart,12462022,119,252)
{
Char="="
Point(Right)
link(onSplit,11554405:doSplit,[(185,258)(185,216)])
link(Str,533564:getVar,[])
}
Add(LineBreakEx,1039140,112,35)
{
Caption="Строка"
Type=3
link(_Data,15444727:Data1,[])
}
Add(LineBreakEx,5987180,168,49)
{
Caption="Строка"
Type=2
}
Add(LineBreakEx,533564,119,224)
{
Caption="Строка"
Type=2
}
Add(LineBreakEx,5768510,70,175)
{
Caption="Строка"
Type=2
}
END_SDK
Add(Edit,8717068,224,84)
{
Left=5
Top=15
Width=245
Text=""
ClearAfterEnter=1
Point(onKeyUp)
Point(onDblClick)
link(onKeyUp,15466702:doWork1,[])
link(onDblClick,15466702:doWork2,[])
}
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#2: 2020-01-26 06:44:02 ЛС | профиль | цитата
Add(MainForm,2153324,98,126)
{
Width=278
Height=101
Caption="Итог в строке"
Position=1
}
Add(Edit,8717068,161,126)
{
Left=5
Top=15
Width=245
Text="(1+4*2)/2"
ClearAfterEnter=1
Point(onDblClick)
link(onEnter,611287:doValue,[])
link(onDblClick,457319:doData,[(201,146)(201,181)])
}
Add(MathParse,8534986,287,126)
{
DataCount=0
MathStr=""
Point(doMathStr)
link(onResult,753807:doWork2,[(333,132)(333,211)])
}
Add(Hub,6872337,259,133)
{
link(onEvent1,8534986:doMathStr,[])
link(onEvent2,8534986:doCalc,[(280,146)(280,132)])
}
Add(Memory,611287,210,133)
{
link(onData,6872337:doEvent1,[])
}
Add(DoData,457319,210,175)
{
link(onEventData,753807:doWork1,[(270,181)])
link(Data,611287:Value,[])
}
Add(HubEx,753807,266,205)
{
Angle=2
link(onEvent,8717068:doText2,[(149,211)(149,139)])
}



Редактировалось 4 раз(а), последний 2020-01-26 07:05:11
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 4
Рейтинг: 0
#3: 2020-01-26 11:24:50 ЛС | профиль | цитата
Мда..
Все проще чем казалось...
И кстати я подавал формулу с поля ввода, но у меня не считалось, вот я и придумал этот велосипед.
Спасибо, Tad!

--- Добавлено в 2020-01-26 11:27:24

но есть, но...)
Нужно при наличии знака равно считать, а при отсутствии просто оставить формулу в строке.
Буду прикручивать свои хотелки)))

Редактировалось 1 раз(а), последний 2020-01-26 11:27:24
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#4: 2020-01-26 12:11:48 ЛС | профиль | цитата
zsk-norilsk писал(а):
Нужно при наличии знака равно считать, а при отсутствии просто оставить формулу в строке.

Не нажимай Enter - осталась "формула в строке"
Нажал Enter - посчитало.
У каждого свои тараканы.
Успехов
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 4
Рейтинг: 0
#5: 2020-01-26 12:27:36 ЛС | профиль | цитата
Докрутил знак равно, с возможностью возвращения формулы при двойном нажатии по Edit


Make(delphi)
ver(4.05 build 186)
Add(MainForm,2153324,161,84)
{
Width=278
Height=101
Caption="Сумма в строке"
}
Add(MultiElement,15466702,287,98)
{
link(onEvent1,8717068:doText,[(332,104)(332,75)(213,75)(213,90)])
link(onEvent2,8717068:doText2,[(331,111)(331,135)(213,135)(213,97)])
link(Data1,8717068:Text,[(293,86)(268,86)(268,126)(230,126)])
}
BEGIN_SDK
Add(EditMulti,15444727,21,21)
{
EventCount=2
WorkCount=2
DataCount=1
VarCount=1
Width=307
Height=235
VOffset=49
HOffset=91
link(doWork1,16440207:doCase,[])
link(doWork2,5997249:doEnum,[(35,83)(35,139)])
link(Var1,10014471:Result,[(118,243)(272,243)])
}
Add(Case,16440207,42,70)
{
Value=Integer(13)
link(onTrue,14946485:doEvent1,[])
}
Add(Hub,14946485,91,77)
{
link(onEvent1,5303958:doData,[])
link(onEvent2,1461385:doSearch,[(116,90)(116,106)(26,106)(26,209)])
}
Add(DoData,5303958,140,77)
{
link(onEventData,4816344:doAdd,[])
link(Data,5987180:getVar,[])
}
Add(ArrayEnum,5997249,42,133)
{
link(onItem,7142047:doData,[])
link(onEndEnum,4816344:doClear,[(189,146)(189,90)])
link(Array,4816344:Array,[(48,128)(223,128)])
}
Add(DoData,7142047,259,133)
{
link(onEventData,15444727:onEvent2,[(317,139)(317,83)])
link(Data,5997249:Item,[(265,121)(245,121)(245,172)(48,172)])
}
Add(StrList,4816344,203,77)
{
}
Add(If_else,15956330,105,203)
{
Op2=Integer(1)
link(onTrue,12462022:doSplit,[])
link(Op1,1461385:Position,[(111,191)(79,191)(79,247)(48,247)])
}
Add(Position,1461385,42,203)
{
Target="="
link(onSearch,15956330:doCompare,[])
link(Str,5768510:getVar,[])
}
Add(StrPart,12462022,154,203)
{
Char="="
Point(Right)
link(onSplit,8895663:doEvent1,[(207,209)(207,202)])
link(Str,533564:getVar,[])
}
Add(LineBreakEx,1039140,112,35)
{
Caption="Строка"
Type=3
link(_Data,15444727:Data1,[])
}
Add(LineBreakEx,5987180,140,49)
{
Caption="Строка"
Type=2
}
Add(LineBreakEx,533564,154,175)
{
Caption="Строка"
Type=2
}
Add(LineBreakEx,5768510,42,175)
{
Caption="Строка"
Type=2
}
Add(MathParse,10014471,266,189)
{
MathStr=""
Point(doMathStr)
link(onResult,15444727:onEvent1,[(310,195)(310,76)])
}
Add(Hub,8895663,224,196)
{
link(onEvent1,10014471:doMathStr,[])
link(onEvent2,10014471:doCalc,[(249,209)(249,195)])
}
END_SDK
Add(Edit,8717068,224,84)
{
Left=5
Top=15
Width=245
Text=""
ClearAfterEnter=1
Point(onKeyUp)
Point(onDblClick)
link(onKeyUp,15466702:doWork1,[])
link(onDblClick,15466702:doWork2,[])
}

--- Добавлено в 2020-01-26 12:29:00

А есть возможность сохранять эту формулу, чтобы при открытии программы, формула была в памяти?

Редактировалось 1 раз(а), последний 2020-01-26 12:29:00
карма: 0

0
Главный модератор
Ответов: 2999
Рейтинг: 396
#6: 2020-01-26 13:06:21 ЛС | профиль | цитата
К чему можно стремиться: калькулятор для профессионалов

Редактировалось 1 раз(а), последний 2020-01-26 13:07:38
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
файлы: 1GalkovCalc.sha.zip [5.5KB] [530]
Ответов: 207
Рейтинг: 14
#7: 2020-01-26 13:53:18 ЛС | профиль | цитата
zsk-norilsk писал(а):
но есть, но...)
Нужно при наличии знака равно считать, а при отсутствии просто оставить формулу в строке.
Буду прикручивать свои хотелки)))

Add(MainForm,2153324,308,287)
{
Width=278
Height=101
Caption="Итог в строке"
Position=1
}
Add(Edit,8717068,371,287)
{
Left=5
Top=15
Width=245
Text="(1+4*2)/2"
ClearAfterEnter=1
Point(onDblClick)
link(onEnter,611287:doValue,[])
link(onDblClick,457319:doData,[(439,307)(439,342)])
}
Add(MathParse,8534986,637,287)
{
DataCount=0
MathStr=""
Point(doMathStr)
link(onResult,753807:doWork2,[(683,293)(683,372)])
}
Add(Hub,6872337,609,294)
{
link(onEvent1,8534986:doMathStr,[])
link(onEvent2,8534986:doCalc,[(630,307)(630,293)])
}
Add(Memory,611287,455,294)
{
link(onData,1408782:doCompare,[])
}
Add(DoData,457319,455,336)
{
link(onEventData,753807:doWork1,[(620,342)])
link(Data,611287:Value,[])
}
Add(HubEx,753807,616,366)
{
Angle=2
link(onEvent,8717068:doText2,[(366,372)(366,300)])
}
Add(Replace,3725656,560,294)
{
SubStr="="
link(onReplace,6872337:doEvent1,[])
}
Add(StrMask,1408782,504,294)
{
Mask="*=*"
link(onTrue,3725656:doReplace,[(548,307)(548,300)])
}


--- Добавлено в 2020-01-26 13:57:46

zsk-norilsk писал(а):
А есть возможность сохранять эту формулу, чтобы при открытии программы, формула была в памяти?

С помощью ini

--- Добавлено в 2020-01-26 14:15:06

Если = только в начале, тогда маска такая

=*

Редактировалось 7 раз(а), последний 2020-01-26 14:15:06
карма: 2

0
Ответов: 9906
Рейтинг: 351
#8: 2020-01-26 14:27:53 ЛС | профиль | цитата
Nic писал(а):
К чему можно стремиться:

Ну сейчас то это покруче выглядит (с перемещением формул, хелпом, в котором рассказано почему именно это нужно профессионалу, и т.п.): калькулятор для профессионалов
Как оказалось, элементов стало больше в 3 раза... А по виду, так и не скажешь.
карма: 9

1
Голосовали:Konst
Ответов: 9906
Рейтинг: 351
#9: 2020-01-26 16:09:13 ЛС | профиль | цитата
Кстати говоря, такая форма обмена данными между формулами - не совсем адекватная:

Дело в том, что GlobalVar умеет только добавлять имена в список глобальных.
Какую-нибудь фигню в формуле написал - он все это и запротоколировал. Безвозвратно.
Удалять от туда он их не умеет.
Накопление мусора может плохо закончиться, не считая возможных ошибок.
Например: когда-то чего-то посчитал, потом удалил, потом обратился по ошибке к прежнему имени - а оно все помнится. Хотя правильно было бы послать тебя в эротическое путешествие.

Между прочим, Ex - свободен от этого недостатка. Мусор успешно удаляет.
Ну там это само-собой получилось (пустой список оповещения - значит ты никому не нужен).
карма: 9

0
Ответов: 8926
Рейтинг: 823
#10: 2020-01-26 17:58:14 ЛС | профиль | цитата
Galkov, недавно приспичило формулу считать, а в ней разница в цифрах в двадцатом знаке, а у нас их всего пятнадцать, при вычитании одни нолики Замучился копипастить в Window-ский калькулятор и обратно. Вот бы у нас Math на четыре действия но с 32 значащими знаками без Parse кто бы сделал, а уж ещё и со степенью
карма: 19

0
Ответов: 9906
Рейтинг: 351
#11: 2020-01-26 18:57:02 ЛС | профиль | цитата
Леонид писал(а):
недавно приспичило формулу считать, а в ней разница в цифрах в двадцатом знаке

Глупости все это, как мне кажется.
В том смысле, что тот, кто вывел тебя на такие расчеты - в математике (ее вычислительных методах) мало чего понимает.
По жизни - и 7 знаков хватает (обыкновенный 32-битный float), если с цифрами грамотно обращаться.
((да и у чисел pi и e -- больше 15 знаков я и не знаю))

А чисто теоретических вопросов можно напридумывать выше крыши. Никакой точности не хватит.
Вот, скажем, сколько знаков в (100!), и хочется последнюю цифру увидеть.....
А мне бы, для первых 10 знаков -- и асимптотической формулы бы хвалило.

Леонид писал(а):
Замучился копипастить в Window-ский калькулятор и обратно

А вот я не убежден, что ты правильно посчитал. Постоянное округление при переводе Extended (native тип данных сопроцессора) в Real (а потом обратно) как бы аннулируют ошибки вычислений.
Знаешь же чего получится при 10/3*3 - в одном и другом случае.

Лучше считай производные "приспиченной" формулы по входным параметрам, и суммируй произведения этих производных на изменения параметров.
И не выделывайся: результат будет в 100 надежней Window-ского калькулятора.

Редактировалось 3 раз(а), последний 2020-01-26 19:02:09
карма: 9

0
Ответов: 8926
Рейтинг: 823
#12: 2020-01-26 23:37:12 ЛС | профиль | цитата
Galkov, конечно глупости, решил проверить высоту здания с помощью барометр..., ой, секундомера, а журналюг на грамотность (каждый шумит об Эйнштейне, гравитации и поправках к GPS и ГЛОНАСС)
Zg=1/(1-(2*G*M/(R*C^2))^0.5)-1 ------------ красное смещение от гравитации, G--гравитационная постоянная, M--масса, R--расстояние до центра масс, C--скорость света
Для земной поверхности ~7E-10
t/t'=(Zg^2 + 2*Zg + 2)/(2*ABS(Zg + 1)) --- замедление времени
Для земной поверхности от гравитации ~1.000 000 000 000 000 000245 -- строил график для Земли: Высота -- Время
А для спутников ГЛОНАСС от скорости ~1.000 000 000 31293
А достигнутая точность этолонов частоты и времени ~5E-15
карма: 19

0
Ответов: 16884
Рейтинг: 1239
#13: 2020-01-27 07:17:12 ЛС | профиль | цитата
Кстати говоря,эту часть схемы можно было нарисовать и так:

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 8926
Рейтинг: 823
#14: 2020-01-27 10:09:07 ЛС | профиль | цитата
Tad писал(а):
2020-01-27 07:17:12

Tad, рано проснулся или ещё не ложился?
карма: 19

0
Ответов: 16884
Рейтинг: 1239
#15: 2020-01-27 12:56:41 ЛС | профиль | цитата
Леонид
Вообще-то у меня это 06:17:12
Сегодня рабочий день:
1. Подъём в 06:00
2. Нажать на компе кнопку выхода из спящего режима, туалет, душ (уже)
3. Проверить эл.почту.
4. Завтрак.
5. В 7:00 встанут мои правнуки.
Т.к. их папа и мама уже в 6:30 уехали на работу, то за их кормежку отвечаю я.
6. В 7:30 грузимся в мой Lexus и отвожу их в школу, а сам еду на работу.
Про Lexus.
На нашей фирме (и не только) если до работы больше 10 км (мне до офиса 15), то работнику, при наличии прав,
выдают в пользование автомобиль.
В декабре мне заменили предыдущий на новый Lexus с ДВС+АКБ с ИИ.
Сам держит дистанцию до впереди идущего, сам тормозит.
В общем сплошной балдёж.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)