Калькулятор

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 2831
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Калькулятор

Сообщение Игорь Столяров » 16 Март 2008, 8:29

Привет всем !

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

Есть самописный вариант такого калькулятора - но работает и выглядит, если честно, - убого.

Соответвенно вопрос: нет ли у кого примера вызова через API стандартного калькулятора
Windows для таких целей или примера кода нормально работающего калькулятора ?

Заранее спасибо за любые наводки в этом направлении ... :D
Работа в команде очень важна. Она позволяет свалить вину на другого.

Аватара пользователя
Tolusha
Активист
Сообщения: 123
Зарегистрирован: 11 Январь 2006, 16:50
Откуда: Украина, г. Черкассы
Контактная информация:

Re: Калькулятор

Сообщение Tolusha » 17 Март 2008, 9:47

Вот глянь здесь
http://thetingroup.com/dtools.html
Там есть вполне сносный калькулятор, я немного его поправил и вставляю в свои программы.
Анатолий.

Alexey5634888
Новичок
Сообщения: 7
Зарегистрирован: 06 Март 2008, 16:53

Re: Калькулятор

Сообщение Alexey5634888 » 31 Март 2008, 13:09

MEMBER('calculiator.clw') ! This is a MEMBER module
Calculiator PROCEDURE ! Declare Procedure
Number string(@s16) !!!Needs to be a string for proper '0' display
Operand REAL !The first operand for +,-,*,/,^ operations
memory1 REAL !The value contained in memory1
Operation REAL !The field number of the operation key
NewNumber BYTE !True following = or %
Decimal BYTE !True after pressing decimal point key
Digit BYTE !Numeric digit represented by number key

DecimalFlg BYTE !!!decimal flag

Calculator WINDOW('Калькулятор'),AT(,,116,192),FONT('MS Sans Serif',8,,),CENTER,SYSTEM,GRAY, |
DOUBLE,AUTO
BUTTON('&0'),AT(67,125,16,14),FONT('MS Sans Serif',8,,),KEY(KeyPad0),USE(?Zero)
BUTTON('&1'),AT(31,109,16,14),FONT('MS Sans Serif',8,,),KEY(KeyPad1),USE(?One)
BUTTON('&2'),AT(49,109,16,14),FONT('MS Sans Serif',8,,),KEY(KeyPad2),USE(?Two)
BUTTON('&3'),AT(67,109,16,14),FONT('MS Sans Serif',8,,),KEY(KeyPad3),USE(?Three)
BUTTON('&4'),AT(31,93,16,14),FONT('MS Sans Serif',8,,),KEY(KeyPad4),USE(?Four)
BUTTON('&5'),AT(49,93,16,14),FONT('MS Sans Serif',8,,),KEY(KeyPad5),USE(?Five)
BUTTON('&6'),AT(67,93,16,14),FONT('MS Sans Serif',8,,),KEY(KeyPad6),USE(?Six)
BUTTON('&7'),AT(31,77,16,14),FONT('MS Sans Serif',8,,),KEY(KeyPad7),USE(?Seven)
BUTTON('&8'),AT(49,77,16,14),FONT('MS Sans Serif',8,,),KEY(KeyPad8),USE(?Eight)
BUTTON('&9'),AT(67,77,16,14),FONT('MS Sans Serif',8,,),KEY(KeyPad9),USE(?Nine)
BUTTON('.'),AT(49,125,16,14),FONT('MS Sans Serif',8,,),KEY(DecimalKey),USE(?Decimal)
BUTTON('CE'),AT(9,125,16,14),FONT('MS Sans Serif',8,,),TIP('Очистить'),USE(?Clear)
BUTTON('p'),AT(49,56,16,14),FONT('Symbol',10,,),TIP('Pi'),USE(?Pi)
BUTTON('+/-'),AT(31,125,16,14),FONT('MS Sans Serif',8,,),TIP('Изменить знак'),USE(?Sign)
BUTTON(' x<178>'),AT(67,41,16,14),FONT('MS Sans Serif',8,,),TIP('Возведение в квадрат'),USE(?Square)
BUTTON('Ц'),AT(67,56,16,14),FONT('Symbol',8,,),TIP('Квадратный корень'),USE(?Root)
BUTTON('1/x'),AT(13,56,16,14),FONT('MS Sans Serif',8,,),TIP('Обратная величина'),USE(?Reciprical)
BUTTON('10X'),AT(31,56,16,14),FONT('MS Sans Serif',8,,),TIP('Умножить на 10'),USE(?TenTimes)
BUTTON('%'),AT(90,41,18,16),FONT('MS Sans Serif',8,,),TIP('Процент'),USE(?Percent)
BUTTON(' lg'),AT(31,41,16,14),FONT('MS Sans Serif',8,,),TIP('Десятичный логарифм'),USE(?Log)
BUTTON(' ln'),AT(13,41,16,14),FONT('MS Sans Serif',8,,),TIP('Натуральный логарифм'),USE(?Ln)
BUTTON('MR'),AT(9,77,16,14),FONT('MS Sans Serif',8,,),TIP('Вызвать из памяти'),USE(?Recall)
BUTTON('M'),AT(9,93,16,14),FONT('MS Sans Serif',8,,),TIP('Сохранить память'),USE(?Store)
BUTTON(' M+'),AT(9,109,16,14),FONT('MS Sans Serif',8,,),TIP('Прибавить в память'),USE(?Accumulate)
BUTTON('+'),AT(90,116,18,46),FONT('MS Sans Serif',8,,),TIP('Сложение'),KEY(PlusKey),USE(?Add)
BUTTON('-'),AT(90,97,18,16),FONT('MS Sans Serif',8,,),TIP('Вычитание'),KEY(MinusKey),USE(?Subtract)
BUTTON('x'),AT(90,78,18,16),FONT('MS Sans Serif',8,,),TIP('Умножение'),KEY(AstKey),USE(?Multiply)
BUTTON('/'),AT(90,60,18,16),FONT(,8,,),TIP('Деление'),KEY(SlashKey),USE(?Divide)
BUTTON(' exp'),AT(49,41,16,14),FONT('MS Sans Serif',8,,),TIP('Экспонента'),USE(?Power)
BUTTON('='),AT(10,143,77,19),FONT('MS Sans Serif',8,,),KEY(EnterKey),USE(?Equal)
BUTTON,AT(37,169,71,20),TIP('Выход'),KEY(AltF4),USE(?Exit)
BUTTON,AT(11,169,22,20),TIP('Копирование в КлипБоард'),KEY(AltC),USE(?COPY),ICON(ICON:Copy)
BOX,AT(5,35,107,130),USE(?Box1),ROUND,COLOR(0FFFFH),FILL(0808080H)
PANEL,AT(28,74,58,67),USE(?Panel1),FILL(0FFFFFFH),BEVEL(1,-1)
STRING('Память:'),AT(4,22,30,10),LEFT
STRING(@S20),AT(34,22,79,10),FONT(,8,,),USE(memory1),LEFT
ENTRY(@s20),AT(6,4,104,15),FONT('MS Sans Serif',11,,FONT:bold),USE(Number),RIGHT(1),INS
END
CODE ! Begin processed code
OPEN(Calculator) !Open the calculator window
NewNumber = True !Start with a new number
Decimal = False !No decimal point has been entered
Operation = ?Equal !No outstanding operation
DecimalFlg = TRUE !!!Set flag

ACCEPT !Enable windows and wait for an event
DISPLAY

IF ACCEPTED() ! user has caused accepted event
CASE ACCEPTED() ! Jump to the accepted field

OF ?EXIT !!!Exit Button
BREAK !!!
OF ?COPY !!!Copy to clipboard
NewNumber = False !!!
SETCLIPBOARD(NUMBER) !!!

OF ?Recall ! For the Recall memory1 key
Number = memory1 ! Set number to memory1
cycle

OF ?Zero TO ?Nine ! For a numeric key
Digit = ACCEPTED() - ?Zero ! The digit is the field number
IF NewNumber ! For the first digit
Number = Digit ! Set the number to the digit
NewNumber = False ! Turn NewNumber flag off
Decimal = False ! Turn decimal point flag off
ELSE ! For any other digit
IF Decimal ! For a fractional digit


IF DecimalFlg !!!
Number=clip(number) &'.'& Digit !!!
DecimalFlg = false !!!
ELSE !!!
Number=clip(number) & digit !!!
END !!!

ELSE ! For an integer digit
DecimalFlg = true
number=clip(number)& digit
END ! End the IF
END ! End the IF
CYCLE ! Continue number entry
OF ?Decimal ! For the decimal point key
Decimal = True ! Turn decimal point flag on

DecimalFlg=TRUE !!!Reset Flag
IF NEWNUMBER = TRUE !!!No need to press 0
NUMBER = '0' !!!if new number
NEWNUMBER = FALSE !!!Reset Flag
END !!!

CYCLE ! Continue number entry
OF ?Pi ! For the Pi key
Number = 3.141592654 ! Set number to Pi
NewNumber = TRUE ! Start new number
CYCLE ! Continue
OF ?Clear ! For the ClearEntry/Clear key
IF NewNumber THEN ! completed number entry
Operation = ?Equal ! so Clear current calculation
END ! End IF
Number = 0 ! Clear number
NewNumber = 0 ! Start new number
END ! End CASE

IF Operation <> ?Equal ! Complete outstanding operations
IF ACCEPTED() = ?Percent ! For the percent key
Number = Number * Operand / 100 ! Calculate % value
IF (Operation <> ?Add ) | ! Check not adding
AND (Operation <> ?Subtract ) | ! or subtractiong percentage
AND (Operation <> ?Multiply) | !!! Added Multiply and Divide
AND (Operation <> ?Divide) !!! To the percentage
Operation = ?Equal ! Finished operation
END ! End IF
END ! End IF
CASE Operation ! Jump to saved operation key
OF ?Add ! For Add key
Number += Operand ! Add number to operand
OF ?Subtract ! For Subtract key
Number = Operand - Number ! Subtract number from operand
OF ?Multiply ! For Multiply key
Number *= Operand ! Multiply operand by number
OF ?Divide ! For Divide key
IF Number <> 0 THEN ! Check for divide by zero
Number = Operand / Number ! Divide operand by number
END ! End IF
OF ?Power ! For Raise to a Power key
Number = Operand ^ Number ! Raise operand to number power
END ! End CASE
Operation = ?Equal ! Operation done
END ! End IF

CASE ACCEPTED() ! Jump to the accepted field
OF ?Sign ! For the Change Sign key
Number *= -1 ! Multiply by -1
OF ?Square ! For the Square key
Number *= Number ! Multilpy by itself
OF ?Root ! For the Square Root key
Number = SQRT(Number) ! Find the square root
OF ?TenTimes ! For the 10X key
Number *= 10 ! Multiply by 10
OF ?Reciprical ! For the Reciprical key
IF Number <> 0 THEN ! Check for divide by zero
Number = 1/Number ! Find the reciprical
END ! End IF
OF ?Log ! For the logarithm key
Number = LOG10(Number) ! Find the base 10 logarithm
OF ?Ln ! For the natural logarithm key
Number = LOGE(Number) ! Find the natural logarithm
OF ?Store ! For the Store memory1 key
memory1 = Number ! Set memory1 to number
OF ?Accumulate ! For the Add to memory1 key
memory1 += Number ! Add number to memory1
OF ?Add TO ?Power ! For two operand operation keys
Operation = ACCEPTED() ! Save the operator
Operand = Number ! Save the first operand
END ! End CASE
SELECT(?Zero) ! Set focus to the Zero key
NewNumber = TRUE ! ready for next number

DecimalFlg = TRUE !!!Reset flag

END !End CASE
END !End ACCEPT
CLOSE(Calculator) !Close the calculator window

!!RNUMBER=NUMBER !!!
!!RETURN(RNUMBER) !!!Return value
RETURN

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 2831
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Re: Калькулятор

Сообщение Игорь Столяров » 04 Сентябрь 2008, 8:50

Еще один удачный вариант калькулятора с памятью и оригинальным вводом операций.
На авторство не претендую - взято из CHT. Исходники прикреплены к сообщению.
Вложения
calc.zip
Исодный код калькулятора
(26.12 КБ) 146 скачиваний
Работа в команде очень важна. Она позволяет свалить вину на другого.

lsgsoftware
Ветеран
Сообщения: 311
Зарегистрирован: 08 Июль 2005, 21:04

Re: Калькулятор

Сообщение lsgsoftware » 09 Сентябрь 2008, 17:07

Игорь,крутанул твой вариант калькулятора.Действительно,забавная и интересная штучка.Правда,чтобы подцепить его к приложению убил целый вечер - наверное форму подрастерял.

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 2831
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Калькулятор

Сообщение Игорь Столяров » 08 Октябрь 2017, 20:06

Хочу реанимировать тему ...
Точнее, юзер хочет "калькулятор как в Windows". :(

Соответственно вопрос: не обретены ли знания как всё-таки можно вызвать через API калькулятор Windows ?
Имеется в виду не тупо запустить, а передать в калькулятор число, получить из калькулятора число ...

Гугл молчит на эту тему. К тому же судя по всему "калькулятор" это любимая курсовая на факультетах IT,
поэтому завал мусора с обсуждением как сделать калькулятор ... :(

Самопал "значительно лучше чем в Windows" просьба не предлагать, я это и сам умею. :)

Заранее спасибо. :)
Работа в команде очень важна. Она позволяет свалить вину на другого.

kreator
Ветеран
Сообщения: 2436
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Калькулятор

Сообщение kreator » 08 Октябрь 2017, 20:38

Игорь Столяров писал(а):
08 Октябрь 2017, 20:06
Точнее, юзер хочет "калькулятор как в Windows".
У меня юзер хочет "календарь как в Windows". Такая же Ж. Похоже MS не собирается делать такие API. Хотя вроде логичный шаг.
С уважением, Kreator.

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 2831
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Калькулятор

Сообщение Игорь Столяров » 08 Октябрь 2017, 20:44

kreator писал(а):
08 Октябрь 2017, 20:38
Похоже MS не собирается делать такие API.
Ну це не есть факт ... Может традиционного вызова через WinAPI и нет, а вот OLE или COM интерфейс обязательно должен быть ...
Работа в команде очень важна. Она позволяет свалить вину на другого.

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 2831
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Калькулятор

Сообщение Игорь Столяров » 08 Октябрь 2017, 20:54

Поясню предыдущую догадку ...
В библиотеке EasyCOM2INC как раз есть пример вызова калькулятора Windows, через COM интерфейс.
Но он сделан ещё под C55 и к сожалению не работает ... :(
Работа в команде очень важна. Она позволяет свалить вину на другого.

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 1827
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

Калькулятор

Сообщение Дед Пахом » 08 Октябрь 2017, 21:43

Да и календаря того уже нет, "Microsoft Calendar Control 9.0", файл mscal.ocx давно уже не входит в стандартную поставку Windows.
С уважением, ДП

vic7tar
Новичок
Сообщения: 23
Зарегистрирован: 09 Февраль 2017, 20:12

Калькулятор

Сообщение vic7tar » 09 Октябрь 2017, 6:35

А если поле ввода еще использовать и как "интерактивный калькулятор командной строки"?
C10, Win10x64

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 2831
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Калькулятор

Сообщение Игорь Столяров » 09 Октябрь 2017, 6:46

Дед Пахом писал(а):
08 Октябрь 2017, 21:43
Да и календаря того уже нет
Вот так всегда. На самом интересном месте ... :)
И как я понимаю, к "новому" калькулятору / календарю Windows через интерфейс DCOM уже нельзя достучаться ?
Работа в команде очень важна. Она позволяет свалить вину на другого.

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 1827
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

Калькулятор

Сообщение Дед Пахом » 09 Октябрь 2017, 12:00

Игорь Столяров писал(а):
09 Октябрь 2017, 6:46
И как я понимаю, к "новому" калькулятору / календарю Windows через интерфейс DCOM уже нельзя достучаться ?
Ну калькулятор и раньше по COM был недоступен, обычный exe.
С уважением, ДП

Constantine
Новичок
Сообщения: 23
Зарегистрирован: 07 Февраль 2017, 16:58

Калькулятор

Сообщение Constantine » 10 Октябрь 2017, 9:49

Наткнулся у буржуев https://stackoverflow.com/questions/141 ... 2-api-in-c на пример работы с калькулятором Windows. Идея, насколько я понял, состоит в получении HANDLE окна калькулятора и, затем, отправки ему сообщений через SendMessage и т.п.
Может, поможет? :-)

kreator
Ветеран
Сообщения: 2436
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Калькулятор

Сообщение kreator » 11 Октябрь 2017, 12:11

Constantine писал(а):
10 Октябрь 2017, 9:49
Наткнулся у буржуев https://stackoverflow.com/questions/141 ... 2-api-in-c на пример работы с калькулятором Windows. Идея, насколько я понял, состоит в получении HANDLE окна калькулятора и, затем, отправки ему сообщений через SendMessage и т.п.
Может, поможет? :-)
Сильно сомневаюсь в действенности такого подхода для данного случае. Мы подобным образом работает с экранной клавиатурой. И это оправдано. А в случае с калькулятором первым делом нужно его заставить "висеть" поверх вызывающего окна в приложении. Да ещё не давать переключать на другое окно. А в другом приложении его не должно быть видно. Проблем наверняка ещё куча. Вообще поведение должно быть типа как вызываем проводник через filedialog.
С уважением, Kreator.

Ответить