1 (изменено: MudaQ, 2019-03-15 22:48:12)

Тема: AHK:Найти калькулятор

Помогите найти калькулятор именно в ахк версии,как-то давно нашёл и скачал на пк,но потом чистил от мусора и винду переустанавливал,так и затерялся сей драгоценный ахкшник(
В интернете вообще не смог найти,попался в какой-то теме,я перешёл и скачал протестить,а теперь вот не могу найти
Вот пример калькулятора который я ищу.Там он был стандартный как на виндовс,и назывался вроде calc.ahk или calculator.ahk .

#SingleInstance, Force
 
; Text Output
Gui, Font, s10
Gui, Add, Text, x10 y10 w240 h30 +Right , 0
 
; Memory Buttons
Gui, Add, Button, x10 y50 w40 h30, MC
Gui, Add, Button, x60 y50 w40 h30, MR
Gui, Add, Button, x110 y50 w40 h30, MS
Gui, Add, Button, x160 y50 w40 h30, M+
Gui, Add, Button, x210 y50 w40 h30, M-
 
 
Gui, Add, Button, x10 y90 w40 h30, % chr(0x2190)
Gui, Add, Button, x60 y90 w40 h30, CE
Gui, Add, Button, x110 y90 w40 h30, C
Gui, Add, Button, x160 y90 w40 h30, % chr(0x00B1)
Gui, Add, Button, x210 y90 w40 h30, % chr(0x221A)
 
; Numpad
Gui, Add, Button, x110 y130 w40 h30, 9
Gui, Add, Button, x60 y130 w40 h30, 8
Gui, Add, Button, x10 y130 w40 h30, 7
Gui, Add, Button, x110 y170 w40 h30, 6
Gui, Add, Button, x60 y170 w40 h30, 5
Gui, Add, Button, x10 y170 w40 h30, 4
Gui, Add, Button, x110 y210 w40 h30, 3
Gui, Add, Button, x60 y210 w40 h30, 2
Gui, Add, Button, x10 y210 w40 h30, 1
Gui, Add, Button, x10 y250 w90 h30, 0
Gui, Add, Button, x110 y250 w40 h30, .
 
; Operators
Gui, Add, Button, x160 y250 w40 h30, +
Gui, Add, Button, x160 y210 w40 h30, -
Gui, Add, Button, x160 y130 w40 h30, /
Gui, Add, Button, x160 y170 w40 h30, *
Gui, Add, Button, x210 y210 w40 h70, =
Gui, Add, Button, x210 y130 w40 h30, `%
Gui, Add, Button, x210 y170 w40 h30, 1/x
 
Gui, Show, w261 h290, Calculator

2 (изменено: teadrinker, 2019-03-03 19:49:33)

Re: AHK:Найти калькулятор

Вот вам простенький калькулятор:

doc := ComObjCreate("htmlfile")
doc.write("<meta http-equiv=""X-UA-Compatible"" content=""IE=9"">")

Gui, +Resize +LastFound
Gui, Font, s18 q5, Calibri
Gui, Margin, 0, 0
Gui, Add, Edit, w300 h200
Gui, Font, s12
Gui, Add, Button, x210 y+10 w80 h24, =
Gui, Show, w300 h244, Калькулятор
Return

GuiSize:
   GuiControl, Move, Edit1, % "w" A_GuiWidth " h" A_GuiHeight - 44
   GuiControl, MoveDraw, Button1, % "x" A_GuiWidth - 90 " y" A_GuiHeight - 34
   Return

Button=:
   ControlGet, lineNum, CurrentLine,, Edit1
   ControlGet, text, Line, % lineNum, Edit1
   try res := doc.parentWindow.eval(text)
   catch {
      MsgBox, The expression is not supported
      Return
   }
   GuiControl, Focus, Edit1
   res := RegExReplace(res, "\.(0+|(0*[^0]+)*\K0+)$")
   SendInput, {End}{Text} = %res%
   Return

GuiClose:
   ExitApp

Пишите с начала любой строки выражение, которое хотите посчитать, например 2+2, нажимайте кнопку =. Считаться будет та строка, в которой каретка. Поддерживается js-синтаксис, чтобы посчитать 2 в степени 3, нужно писать Math.pow(2, 3).

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: serzh82saratov, 2019-03-03 12:27:00)

Re: AHK:Найти калькулятор

Я чутка фич добавил.
Префикс Math. не нужен. Прежний результат стирать не нужно.


#SingleInstance Force
#NoEnv
#Persistent

doc := ComObjCreate("htmlfile")
doc.write("<meta http-equiv=""X-UA-Compatible"" content=""IE=9"">")

Global EM_SETSEL := 0x00B1, EM_GETSEL := 0xB0, EM_LINEINDEX := 0xBB, EM_LINELENGTH := 0xC1, ES_NOHIDESEL := 256, hEdit, doc

Load =
(
2 + 2
pow(2, 8)
clz32(1)
)

Gui, +Resize +LastFound
Gui, Font, s18 q5, Calibri
Gui, Margin, 0, 0
Gui, Add, Edit, hwndhEdit w300 h200 +HScroll +%ES_NOHIDESEL%, % Load
Gui, Font, s12
  ;	https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Math
Gui, Add, DDL, x10 y+10 w76 gMath vMath, abs||acos|acosh|asin|asinh|atan|atan2|atanh|cbrt|ceil|clz32|cos|cosh|exp|expm1|floor|fround|hypot|imul|log|log10|log1p|log2|max|min|pow|random|round|sign|sin|sinh|sqrt|tan|tanh|trunc
Gui, Add, Button, x+10 yp hp, Copy
Gui, Add, Button, x210 yp w80 hp gEval, =
Gui, Show, w260 h200, Калькулятор
Gui, +MinSize
If Load is not space
	ControlSend, , {End}{Enter}, ahk_id %hEdit%
Return

GuiClose:
   ExitApp

GuiSize:
   GuiControl, Move, %hEdit%, % "w" A_GuiWidth " h" A_GuiHeight - 44 
   GuiControl, Move, Math, % "x" 10 " y" A_GuiHeight - 34
   GuiControl, MoveDraw, Button1, % "x" 96 " y" A_GuiHeight - 34
   GuiControl, MoveDraw, Button2, % "x" A_GuiWidth - 90 " y" A_GuiHeight - 34
   Return
	
Eval() {
   ControlGet, lineNum, CurrentLine, , , ahk_id %hEdit% 
   ControlGet, text, Line, % lineNum, , ahk_id %hEdit% 
   Equal := SubEqual(text, lineNum)
   AddMath(text)
   try res := doc.parentWindow.eval(text)
   catch { 
	  ToolTip("The expression does not supported"), Focus()
      Return
   }
   If res is space 
   { 
	  ToolTip("Result empty"), Focus()
      Return
   }
   res := RegExReplace(res, "\.(0+|(0*[^0]+)*\K0+)$") 
   If !Equal
		SetCarretEnd()
   Control, EditPaste, %  " = " res, , ahk_id %hEdit%
   ToolTip("Ok", 300)
   SelResult(res)
   Focus()
}

ButtonCopy() {
	ControlGet, OutputVar, Selected, , , ahk_id %hEdit%
	If OutputVar is not space
		Clipboard := OutputVar, ToolTip("Ok")
	Else
		ToolTip("No Selected")
}

Focus() {
	GuiControl, Focus, %hEdit%
}

Math:
	ControlGet, OutputVar, Selected, , , ahk_id %hEdit%
	GuiControlGet, Math 
	GuiControl, Focus, %hEdit% 
	Control, EditPaste, %Math%(%OutputVar%), , ahk_id %hEdit%
	If OutputVar is space
		ControlSend, , {Left}, ahk_id %hEdit%
	Return
	
AddMath(ByRef text, Pos := 1) { 
	While Pos := RegExMatch(text, "\w+\(.*?\)", Match, Pos)
	{
		Match := Format("{:L}", Match)
		text := RegExReplace(text, "i)\Q" Match "\E", "Math." Match, "", 1, Pos)
		Pos += StrLen(Match) + 5
	}
}

SubEqual(ByRef text, lineNum) {
	If Pos := RegExMatch(text, "\s*=.*", Match)
	{ 
		SendMessage, EM_LINEINDEX, lineNum - 1, , , ahk_id %hEdit%
		LINEINDEX := Errorlevel - 1
		text := RegExReplace(text, "i)\Q" Match "\E", "", , Pos)
		SendMessage, EM_SETSEL, LINEINDEX + Pos, LINEINDEX + Pos + StrLen(Match), , ahk_id %hEdit% 
	}
	Return Pos
}

SetCarretEnd() {
	ControlSend, , {End}, ahk_id %hEdit% 
}

SelResult(res) {
	Static _ := VarSetCapacity(end, 4)
	Sleep 100
	SendMessage, EM_GETSEL, , &end, , ahk_id %hEdit%
	SendMessage, EM_SETSEL, NumGet(end) - StrLen(res), NumGet(end), , ahk_id %hEdit% 
}

ToolTip(text, time = 500) {
	CoordMode, Mouse
	CoordMode, ToolTip
	MouseGetPos, X, Y
	ToolTip, %text%, X-10, Y-35, 20
	SetTimer, HideToolTip, -%time%
	Return 1

	HideToolTip:
		ToolTip, , , , 20
		Return
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4

Re: AHK:Найти калькулятор

serzh82saratov пишет:

Прежний результат стирать не нужно.

Так и не нужно было, просто с новой строки писать.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK:Найти калькулятор

serzh82saratov пишет:

Я чутка фич добавил.

Немного криво получилось.

https://i.imgur.com/XPA0eYB.png

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK:Найти калькулятор

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7

Re: AHK:Найти калькулятор

В такое узкое окно ничего не пропишешь, запретить надо такое делать.
SendInput ещё убрал.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8

Re: AHK:Найти калькулятор

А, только теперь понял, что ты имел в виду. Ну тут фич можно ещё на 1000 строк подобавлять.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK:Найти калькулятор

Я подумал что удобно будет заранее прописать несколько своих формул, и сделал под это минимум.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK:Найти калькулятор

Начать можно с того, что htmlfile я только для краткости записи использовал.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK:Найти калькулятор

А альтернатива - ActiveScript? Функционально будет тоже самое.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

12

Re: AHK:Найти калькулятор

ActiveScript или JS объект. Htmlfile дольше загружается и связан с настройками IE.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

Re: AHK:Найти калькулятор

Почему то не работает например clz32(1).

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

14

Re: AHK:Найти калькулятор

Кстати для того что ищет ТС, JS вообще не нужен.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15

Re: AHK:Найти калькулятор

teadrinker пишет:

Поддерживается js-синтаксис, чтобы посчитать 2 в степени 3, нужно писать Math.pow(2, 3).

Можно Math не писать, например так:

doc.write("<script>with (Math) var math_eval = function (str) {return eval(str);};</script>")
   try res := doc.parentWindow.math_eval(text)
serzh82saratov пишет:

Префикс Math. не нужен.

Не совсем:

cos(Math.PI)

16 (изменено: serzh82saratov, 2019-03-03 19:31:38)

Re: AHK:Найти калькулятор

Да, так по интереснее. А на счёт неработающей clz32 есть идеи?


#SingleInstance Force
#NoEnv
#Persistent

doc := ComObjCreate("htmlfile")

doc.write("<meta http-equiv='X-UA-Compatible' content='IE=9'>")
Maths := doc.parentWindow.eval("Object.getOwnPropertyNames(Math).join('|')")

doc.write("<script>with (Math) var math_eval = function (str) {return eval(str);};</script>")

Global EM_SETSEL := 0x00B1, EM_GETSEL := 0xB0, EM_LINEINDEX := 0xBB, ES_NOHIDESEL := 256, hEdit, doc

Load =
(
2 + 2
pow(2, 8)
asin(1)
PI
)

Gui, +Resize +LastFound
Gui, Font, s18 q5, Calibri
Gui, Margin, 0, 0
Gui, Add, Edit, hwndhEdit w300 r6 +HScroll +%ES_NOHIDESEL%, % Load
Gui, Font, s12
  ;	https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Math
Gui, Add, DDL, x10 y+10 w76 gMath vMath, ()||%Maths%
Gui, Add, Button, x+10 yp hp, Copy
Gui, Add, Button, x210 yp w80 hp gEval, =
Gui, Show, , Калькулятор
Gui, +MinSize
Sleep 10
If Load is not space
	ControlSend, , {End}{Enter}, ahk_id %hEdit%
Return

GuiClose:
   ExitApp

GuiSize:
   GuiControl, Move, %hEdit%, % "w" A_GuiWidth " h" A_GuiHeight - 44 
   GuiControl, Move, Math, % "x" 10 " y" A_GuiHeight - 34
   GuiControl, MoveDraw, Button1, % "x" 96 " y" A_GuiHeight - 34
   GuiControl, MoveDraw, Button2, % "x" A_GuiWidth - 90 " y" A_GuiHeight - 34
   Return
	
Eval() {
	Focus()
   ControlGet, lineNum, CurrentLine, , , ahk_id %hEdit% 
   ControlGet, text, Line, % lineNum, , ahk_id %hEdit% 
   Equal := SubEqual(text, lineNum) 
   try res := doc.parentWindow.math_eval(text)
   catch { 
	  ToolTip("The expression does not supported") 
      Return
   }
   If res is space 
   { 
	  ToolTip("Result empty") 
      Return
   }
   res := RegExReplace(res, "\.(0+|(0*[^0]+)*\K0+)$") 
   If !Equal
		SetCarretEnd()
   Control, EditPaste, %  " = " res, , ahk_id %hEdit%
   ToolTip("Ok", 300)
   SelResult(res)
}

ButtonCopy() {
	Focus()
	ControlGet, OutputVar, Selected, , , ahk_id %hEdit%
	If OutputVar is not space
		Clipboard := OutputVar, ToolTip("Ok")
	Else
		ToolTip("No Selected")
}

Focus() {
	GuiControl, Focus, %hEdit%
}

Math:
	ControlGet, OutputVar, Selected, , , ahk_id %hEdit%
	GuiControlGet, Math 
	Focus()
	If Math = ()
	{
		Control, EditPaste, (%OutputVar%), , ahk_id %hEdit%
		Return
	}
	If Math ~= "(*UCP)[[:upper:]]"
	{
		Control, EditPaste, %Math%, , ahk_id %hEdit%
		Return
	}
	Control, EditPaste, %Math%(%OutputVar%), , ahk_id %hEdit%
	
	Sleep 10
	If OutputVar is space
		ControlSend, , {Left}, ahk_id %hEdit%
	Return 

SubEqual(ByRef text, lineNum) {
	If Pos := RegExMatch(text, "\s*=.*", Match)
	{ 
		SendMessage, EM_LINEINDEX, lineNum - 1, , , ahk_id %hEdit%
		LINEINDEX := Errorlevel - 1
		text := RegExReplace(text, "i)\Q" Match "\E", "", , Pos)
		SendMessage, EM_SETSEL, LINEINDEX + Pos, LINEINDEX + Pos + StrLen(Match), , ahk_id %hEdit% 
	}
	Return Pos
}

SetCarretEnd() {
	ControlSend, , {End}, ahk_id %hEdit% 
}

SelResult(res) {
	Static _ := VarSetCapacity(end, 4)
	Sleep 100
	SendMessage, EM_GETSEL, , &end, , ahk_id %hEdit%
	SendMessage, EM_SETSEL, NumGet(end) - StrLen(res), NumGet(end), , ahk_id %hEdit%
}

ToolTip(text, time = 500) {
	CoordMode, Mouse
	CoordMode, ToolTip
	MouseGetPos, X, Y
	ToolTip, %text%, X-10, Y-35, 20
	SetTimer, HideToolTip, -%time%
	Return 1

	HideToolTip:
		ToolTip, , , , 20
		Return
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17

Re: AHK:Найти калькулятор

serzh82saratov пишет:

Почему то не работает например clz32(1).

В таких случаях смотри совместимость с браузерами, у нас IE используется.
wisgest
Элегантное решение. С моникером script так вышло:

JS := GetJScripObject()
MsgBox, % JS.("pow(2, 10)")

GetJScripObject()  {
   VarSetCapacity(tmpFile, ((MAX_PATH := 260) - 14) << !!A_IsUnicode, 0)
   DllCall("GetTempFileName", Str, A_Temp, Str, "AHK", UInt, 0, Str, tmpFile)
   
   FileAppend,
   (
   <component>
   <public><method name='math_eval'/></public>
   <script language='JScript'></script>
   <script>with (Math) var math_eval = function (str) {return eval(str);};</script>
   </component>
   ), % tmpFile
   
   JS := ObjBindMethod( ComObjGet("script:" . tmpFile), "math_eval" )
   FileDelete, % tmpFile
   Return JS
}

А нельзя как-то ещё регистронезависимость включить?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

18

Re: AHK:Найти калькулятор

Для clz32 можно полифилл прописать:

script =
(
if (!Math.clz32) Math.clz32 = (function(log, LN2){
  return function(x) {  
    if (x == null || x === 0) {
      return 32;
    }
    return 31 - (log(x >>> 0) / LN2 | 0);
  };
})(Math.log, Math.LN2);
)
doc.write("<script>" . script . "</script>")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

19 (изменено: MudaQ, 2019-03-15 22:48:37)

Re: AHK:Найти калькулятор

Спасибо за ваш энтузиазм,но мне просто нужен обычный калькулятор чтобы я добавил его в свою гуи,если кто-то сможет найти этот калькулятор в темах или мб валяется у вас на пк - очень жду ссылку в теме,мне даже будет не жаль рейтинг подарить,очень нужно просто. <3

20

Re: AHK:Найти калькулятор

MudaQ
Если немного напрячься, можно использовать приёмы, которые здесь приведены для вашего кода из первого сообщения.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

21

Re: AHK:Найти калькулятор

teadrinker пишет:

А нельзя как-то ещё регистронезависимость включить?

Использовать VBScript. Но там не получится определять переменнные и использовать сложные выражения наподобие

fi=PI/3, x=sin(fi), y=cos(fi), pow(x,2)+pow(y,2)

по крайней мере, естественным образом…

22

Re: AHK:Найти калькулятор

wisgest пишет:
doc.write("<script>with (Math) var math_eval = function (str) {return eval(str);};</script>")

А для общего развития, можно как-то то же самое без with сделать? Через прототипы?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

23

Re: AHK:Найти калькулятор

можно как-то то же самое без with сделать?

Можно, но насколько я могу судить, надо будет явно выписать все свойства и методы Math.

Через прототипы?

Это как? Нет, я знаю что такое прототипы, но что в данном случае имеется в виду, например. Т.е. можно, например, всем строкам добавить соотв. метод и использовать "выражение".вычислить() вместо вычислить("выражение"), но и в этом случае либо with, либо явное перечисление.

24 (изменено: teadrinker, 2019-03-03 15:57:47)

Re: AHK:Найти калькулятор

Глобальному объекту Function прописать проверку на выполнение, если не выполняется, пробовать через Math? Не часто пользуюсь js, поэтому не очень понимаю, как это правильно записать.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

25

Re: AHK:Найти калькулятор

Врядли. Допустим мы ко всем функциям мы добавим такой метод, назовём его calc, определяющий имя функции (которое может отличаться от имени переменной указывающей на ф-цию) и проверяющий, есть ли в Math метод с таким именем. 1) Чем sin.calc() лучше Math.sin()? 2) Переменная sin может быть чем угодно. Тут надо работать не с функциями, а с входной строкой — искать в ней имена методов Math

(with или полное перечисление были бы не нужны, если бы с Math работал цикл for in, но это не так.)

26 (изменено: teadrinker, 2019-03-03 18:14:29)

Re: AHK:Найти калькулятор

wisgest пишет:

если бы с Math работал цикл for in, но это не так

Но можно Object.getOwnPropertyNames(Math).

doc := ComObjCreate("htmlfile")
doc.write("<meta http-equiv='X-UA-Compatible' content='IE=9'>")
MsgBox, % doc.parentWindow.eval("Object.getOwnPropertyNames(Math).join('\n')")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

27

Re: AHK:Найти калькулятор

Object.getOwnPropertyNames() — не классический метод, в JScript 5.8 его нет.

28 (изменено: teadrinker, 2019-03-03 22:19:01)

Re: AHK:Найти калькулятор

Почему это Вас останавливает, мы же htmlfile используем?

doc := ComObjCreate("htmlfile")
doc.write("<meta http-equiv='X-UA-Compatible' content='IE=9'>")
mathMethods := doc.parentWindow.eval("Object.getOwnPropertyNames(Math).join('|')")

expr := "POW(2, 2) - Sqrt(16) + pi"

try res := doc.parentWindow.eval(expr)
catch {
   while RegExMatch(expr, "iO)(?<!Math\.)(" . mathMethods . ")", match, match ? match.Pos + match.Len + 5 : 1)
      expr := RegExReplace( expr, match[1], "Math." . RegExReplace(mathMethods, "i).*(" . match[1] . ").*", "$1"),,, match.Pos )
   
   try res := doc.parentWindow.eval(expr)
   catch
      res := "Expression is not supported"
}
MsgBox, % res

Заодно и проблема регистрозависимости решается.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder