help writing a simple calculator

Get help with using AutoHotkey (v1.1 and older) and its commands and hotkeys
User avatar
yawikflame
Posts: 21
Joined: 02 Jan 2017, 06:19
Contact:

help writing a simple calculator

07 May 2017, 05:20

Hi there AHK community!
I could use some help writing a code for a simple calculator(similar to Microsoft Windows).
my code so far:

Code: Select all

#SingleInstance, Force
gui, +alwaysontop

answer := "0"
history := ""

gui, show, x3100 y700 h500 w285, Calculator
gui, font, s20 , arial
gui, add, text, x0 y10 h30 w285 right border 0x200 vHistory cAqua, %history%
gui, font, s20, arial
gui, add, text, x0 y40 h30 w285 right border 0x200 vAnswer, %answer%


gui, add, button, x0 y80 h70 w70 gCalculate, `%
gui, add, button, x+1 y80 h70 w70 gCalculate, √
;~ gui, add, button, x+1 y80 h70 w70 gCalculate, x²
;~ gui, add, button, x+1 y80 h70 w70 gCalculate, 1/x
gui, add, button, x0 y150 h70 w70 gCalculate, E
gui, add, button, x+1 y150 h70 w70 gCalculate, C
gui, add, button, x+1 y150 h70 w70 gCalculate, <X
gui, add, button, x+1 y150 h70 w70 gCalculate, ÷
gui, add, button, x0 y220 h70 w70 gCalculate, 7
gui, add, button, x+1 y220 h70 w70 gCalculate, 8
gui, add, button, x+1 y220 h70 w70 gCalculate, 9
gui, add, button, x+1 y220 h70 w70 gCalculate, x
gui, add, button, x0 y290 h70 w70 gCalculate, 4
gui, add, button, x+1 y290 h70 w70 gCalculate, 5
gui, add, button, x+1 y290 h70 w70 gCalculate, 6
gui, add, button, x+1 y290 h70 w70 gCalculate, ─
gui, add, button, x0 y360 h70 w70 gCalculate, 1
gui, add, button, x+1 y360 h70 w70 gCalculate, 2
gui, add, button, x+1 y360 h70 w70 gCalculate, 3
gui, add, button, x+1 y360 h70 w70 gCalculate, +
gui, add, button, x0 y430 h70 w70 gCalculate, ±
gui, add, button, x+1 y430 h70 w70 gCalculate, 0
gui, add, button, x+1 y430 h70 w70 gCalculate, .
gui, add, button, x+1 y430 h70 w70 gCalculate, =

return

Calculate:
	GuiControlGet, var,, % A_GuiControl
	if(var == "C")
		Reload
	else if(var == "=")
		GoSub, Result
	GuiControl,, Answer, % var
	tempHistory .= var

	return

Result:
	GuiControl,, History, % tempHistory
	IfInString, tempHistory, +
	{
		Loop, parse, tempHistory, +
		{
			var += %A_LoopField%
		}
		answer = % var
	}
	else IfInString, tempHistory, ─
	{
		Loop, parse, tempHistory, ─
		{
			var = %A_LoopField%
		}
		answer = % var1 - var2
	}
	else if(var == "x")
	{
		answer = % var * var
	}
	else if(var == "÷")
	{
		answer = % (var1 / var3)
	}
	GuiControl,, Answer, % var
	return

return

GuiClose:
	ExitApp
I have studied C and now studying Pyhton and Java. AHK is a side-hobby which i like especially for its fairly simple GUI.
any help is greatly appreciated!
cheers ;)
yawikflame
garry
Posts: 3795
Joined: 22 Dec 2013, 12:50

Re: help writing a simple calculator

07 May 2017, 05:30

found these examples

Example-1

Code: Select all

;-------- saved at Montag, 11. Juli 2016 21:12:00 --------------
;-------- https://autohotkey.com/boards/viewtopic.php?f=5&t=20164 ---

Gui, Add, Edit, x32 y20 w400 h30 hwndedit1
Gui, Add, Button, x22 y70 w60 h50 , 1
Gui, Add, Button, x102 y70 w60 h50  , 2
Gui, Add, Button, x22 y140 w60 h50 , 4
Gui, Add, Button, x102 y140 w60 h50 , 5
Gui, Add, Button, x182 y70 w60 h50 , 3
Gui, Add, Button, x262 y70 w60 h50 , *
Gui, Add, Button, x182 y140 w60 h50 , 6
Gui, Add, Button, x262 y140 w60 h50 , -
Gui, Add, Button, x22 y210 w60 h50 , 7
Gui, Add, Button, x102 y210 w60 h50 , 8
Gui, Add, Button, x22 y280 w60 h50 , 0
Gui, Add, Button, x182 y210 w60 h50 , 9
Gui, Add, Button, x342 y70 w60 h50 , +
Gui, Add, Button, x342 y140 w60 h50 , /
Gui, Add, Button, x262 y210 w60 h50 , =
Gui, Add, Button, x102 y280 w60 h50 , .
Gui, Add, Button, x182 y280 w100 h50 gclear , clear
Gui, Show, w479 h379, Calculator by me

OnMessage(0x201, "WM_LBUTTONDOWN")
return

clear:
controlsettext,,,ahk_id %edit1%
return

WM_LBUTTONDOWN(wParam,lParam,msg,hwnd)
{
global edit1
if !regexmatch(A_GuiControl,"[0-9*=+-./]") or (hwnd=edit1) or instr(A_GuiControl,"clear")
return

controlgettext,var,,ahk_id %edit1%
if (A_GuiControl="=")
out:=eval(var)
else
out:=var A_GuiControl
controlsettext,,% out,ahk_id %edit1%
}



;https://autohotkey.com/board/topic/4779-simple-script-for-evaluating-arithmetic-expressions/

Eval(x)
{
   StringGetPos i, x, +, R
   StringGetPos j, x, -, R
   If (i > j)
      Return Left(x,i)+Right(x,i)
   If (j > i)
      Return Left(x,j)-Right(x,j)
   StringGetPos i, x, *, R
   StringGetPos j, x, /, R
   If (i > j)
      Return Left(x,i)*Right(x,i)
   If (j > i)
      Return Left(x,j)/Right(x,j)
   Return x
}

Left(x,i)
{
   StringLeft x, x, i
   Return Eval(x)
}
Right(x,i)
{
   StringTrimLeft x, x, i+1
   Return Eval(x)
}


GuiClose:
ExitApp
example-2 (eval)

Code: Select all

start_eval:="((4+5)*2)/2"

Gui, font, s10, Courier New
Gui, margin, 0, 0
Gui, add, edit, x10 y5 w750 h30 vEval, % start_eval
Gui, font
Gui, add, button, x770 y5 w50 h25 gEval +default, Eval
Gui, font, s10, Courier New
Gui, add, listbox, x10 y40 w780 h130 vlogbox
Gui, +Delimiter`n
Gui, show,x100 y10 h200 w820, EVAL
return

guiclose:
exitapp


Eval:
GuiControl,, logbox, % "|"
GuiControlGet, eval
log := eval(eval, 1)
log_txt := ""
for key, line in log
  log_txt .= "`n" line
GuiControl,, logbox, % log_txt
return



eval(eval, returnlog=0)
{
  static number := "[0-9]*\.?[0-9]+", hexnumber := "0x[0-9a-fA-F]+"
  log := [eval]
  if (regexmatch(eval, "^\s*(.*?)\s*$", m))
    eval := regexreplace(m1, "\s", " ")
  for key, value in {"pi":3.14159265, "life, the universe and everything":42} ;Define default variables here!
  {
    while (regexmatch(eval, "i)(^|[^a-zA-Z0-9_])" key "([^a-zA-Z0-9_]|$)"))
      eval := regexreplace(eval, "i)(^|[^a-zA-Z0-9_])" key "([^a-zA-Z0-9_]|$)", "$1" value "$2")
  }
  if (log[log.maxIndex()] != eval)
    log.insert(eval)
  while (regexmatch(eval, "(.*)\(([^)]*)\)(.*)", m))
  {
    func := ""
    if (regexmatch(m1, "([a-zA-Z0-9_]+)$", func_name) && isfunc(func_name1))
    {
      m1 := substr(m1, 1, -strlen(func_name1))
      func := func(func_name1)
    }
    eval_part := eval(m2, 1)
    last_eval := eval_part[eval_part.maxIndex()]
    params := []
    Loop, parse, last_eval, `,, % " "
      params.insert(A_LoopField)
    eval := m1 ((isobject(func)) ? (func.(params*)) : last_eval) m3
    for key, line in eval_part
    {
      if (log[log.maxIndex()] != m1 func_name1 "(" line ")" m3)
        log.insert(m1 ((key = eval_part.maxIndex() && !func) ? line : func_name1 "(" line ")") m3)
    }
    if (log[log.maxIndex()] != eval)
      log.insert(eval)
  }
  while (regexmatch(eval, "(.*?)(" number "|" hexnumber ")\s*\*\*\s*(-?" number "|-?" hexnumber ")(.*)", m)) ; **
    log.insert(eval := m1 (m2 ** m3) m4)
  while (regexmatch(eval, "(.*?)(" number "|" hexnumber ")\s*~\s*(-?" number "|-?" hexnumber ")(.*)", m)) ; ~
    log.insert(eval := m1 (m2 ~ m3) m4)
  while (regexmatch(eval, "(.*?)(" number "|" hexnumber ")\s*(\*|/|//)\s*(-?" number "|-?" hexnumber ")(.*)", m)) ; * / //
    log.insert(eval := m1 ((m3="*") ? m2 * m4 : ((m3="/") ? m2 / m4 : m2 // m4)) m5)
  while (regexmatch(eval, "(.*?)(" number "|" hexnumber ")\s*(\+|-)\s*(-?" number "|-?" hexnumber ")(.*)", m)) ; + -
    log.insert(eval := m1 ((m3="+") ? m2 + m4 : m2 - m4) m5)
  while (regexmatch(eval, "(.*?)(" number "|" hexnumber ")\s*(<<|>>)\s*(-?" number "|-?" hexnumber ")(.*)", m)) ; << >>
    log.insert(eval := m1 ((m3="<<") ? m2 << m4 : m2 >> m4) m5)
  while (regexmatch(eval, "(.*?)(" number "|" hexnumber ")\s*(&|\^|\|)\s*(-?" number "|-?" hexnumber ")(.*)", m)) ; & ^ |
    log.insert(eval := m1 ((m3="&") ? m2 & m4 : ((m3="^") ? m2 ^ m4 : m2 | m4)) m5)
  while (regexmatch(eval, "(.*?)(" number "|" hexnumber ")\s*(>|<|>=|<=)\s*(-?" number "|-?" hexnumber ")(.*)", m)) ; > < >= <=
    log.insert(eval := m1 ((m3=">" || m3=">=") ? ((m3=">") ? (m2>m4) : (m2>=m4)) : ((m3="<") ? (m2<m4) : (m2<=m4))) m5)
  while (regexmatch(eval, "(.*?)(" number "|" hexnumber ")\s*(=|==|<>|!=)\s*(-?" number "|-?" hexnumber ")(.*)", m)) ; = == <> !=
    log.insert(eval := m1 ((m3="=" || m3="==") ? ((m3="=") ? (m2=m4) : (m2==m4)) : ((m3="<>") ? (m2<>m4) : (m2!=m4))) m5)
  while (regexmatch(eval, "i)(.*?)(!|not)\s*(-?" number "|-?" hexnumber ")(.*)", m)) ; ! not
    log.insert(eval := m1 (!(m3)) m4)
  while (regexmatch(eval, "i)(.*?)(" number "|" hexnumber ")\s*(&&|and)\s*(-?" number "|-?" hexnumber ")(.*)", m)) ; && and
    log.insert(eval := m1 (m2 && m4) m5)
  while (regexmatch(eval, "i)(.*?)(" number "|" hexnumber ")\s*(\|\||or)\s*(-?" number "|-?" hexnumber ")(.*)", m)) ; || or
    log.insert(eval := m1 (m2 || m4) m5)
  while (regexmatch(eval, "\s*(.+?)\s*\?\s*(.+?)\s*:\s*(.+?)\s*", m)) ; ?:
    log.insert(eval := m1 ? m2 : m3)
  if (log[log.maxIndex()] != eval)
    log.insert(eval)
  return (returnlog) ? log : eval
}
User avatar
yawikflame
Posts: 21
Joined: 02 Jan 2017, 06:19
Contact:

Re: help writing a simple calculator

07 May 2017, 05:49

garry wrote:found these examples

Example-1

Code: Select all

;-------- saved at Montag, 11. Juli 2016 21:12:00 --------------
;-------- https://autohotkey.com/boards/viewtopic.php?f=5&t=20164 ---

Gui, Add, Edit, x32 y20 w400 h30 hwndedit1
Gui, Add, Button, x22 y70 w60 h50 , 1
Gui, Add, Button, x102 y70 w60 h50  , 2
Gui, Add, Button, x22 y140 w60 h50 , 4
Gui, Add, Button, x102 y140 w60 h50 , 5
Gui, Add, Button, x182 y70 w60 h50 , 3
Gui, Add, Button, x262 y70 w60 h50 , *
Gui, Add, Button, x182 y140 w60 h50 , 6
Gui, Add, Button, x262 y140 w60 h50 , -
Gui, Add, Button, x22 y210 w60 h50 , 7
Gui, Add, Button, x102 y210 w60 h50 , 8
Gui, Add, Button, x22 y280 w60 h50 , 0
Gui, Add, Button, x182 y210 w60 h50 , 9
Gui, Add, Button, x342 y70 w60 h50 , +
Gui, Add, Button, x342 y140 w60 h50 , /
Gui, Add, Button, x262 y210 w60 h50 , =
Gui, Add, Button, x102 y280 w60 h50 , .
Gui, Add, Button, x182 y280 w100 h50 gclear , clear
Gui, Show, w479 h379, Calculator by me

OnMessage(0x201, "WM_LBUTTONDOWN")
return

clear:
controlsettext,,,ahk_id %edit1%
return

WM_LBUTTONDOWN(wParam,lParam,msg,hwnd)
{
global edit1
if !regexmatch(A_GuiControl,"[0-9*=+-./]") or (hwnd=edit1) or instr(A_GuiControl,"clear")
return

controlgettext,var,,ahk_id %edit1%
if (A_GuiControl="=")
out:=eval(var)
else
out:=var A_GuiControl
controlsettext,,% out,ahk_id %edit1%
}



;https://autohotkey.com/board/topic/4779-simple-script-for-evaluating-arithmetic-expressions/

Eval(x)
{
   StringGetPos i, x, +, R
   StringGetPos j, x, -, R
   If (i > j)
      Return Left(x,i)+Right(x,i)
   If (j > i)
      Return Left(x,j)-Right(x,j)
   StringGetPos i, x, *, R
   StringGetPos j, x, /, R
   If (i > j)
      Return Left(x,i)*Right(x,i)
   If (j > i)
      Return Left(x,j)/Right(x,j)
   Return x
}

Left(x,i)
{
   StringLeft x, x, i
   Return Eval(x)
}
Right(x,i)
{
   StringTrimLeft x, x, i+1
   Return Eval(x)
}


GuiClose:
ExitApp
example-2 (eval)

Code: Select all

start_eval:="((4+5)*2)/2"

Gui, font, s10, Courier New
Gui, margin, 0, 0
Gui, add, edit, x10 y5 w750 h30 vEval, % start_eval
Gui, font
Gui, add, button, x770 y5 w50 h25 gEval +default, Eval
Gui, font, s10, Courier New
Gui, add, listbox, x10 y40 w780 h130 vlogbox
Gui, +Delimiter`n
Gui, show,x100 y10 h200 w820, EVAL
return

guiclose:
exitapp


Eval:
GuiControl,, logbox, % "|"
GuiControlGet, eval
log := eval(eval, 1)
log_txt := ""
for key, line in log
  log_txt .= "`n" line
GuiControl,, logbox, % log_txt
return



eval(eval, returnlog=0)
{
  static number := "[0-9]*\.?[0-9]+", hexnumber := "0x[0-9a-fA-F]+"
  log := [eval]
  if (regexmatch(eval, "^\s*(.*?)\s*$", m))
    eval := regexreplace(m1, "\s", " ")
  for key, value in {"pi":3.14159265, "life, the universe and everything":42} ;Define default variables here!
  {
    while (regexmatch(eval, "i)(^|[^a-zA-Z0-9_])" key "([^a-zA-Z0-9_]|$)"))
      eval := regexreplace(eval, "i)(^|[^a-zA-Z0-9_])" key "([^a-zA-Z0-9_]|$)", "$1" value "$2")
  }
  if (log[log.maxIndex()] != eval)
    log.insert(eval)
  while (regexmatch(eval, "(.*)\(([^)]*)\)(.*)", m))
  {
    func := ""
    if (regexmatch(m1, "([a-zA-Z0-9_]+)$", func_name) && isfunc(func_name1))
    {
      m1 := substr(m1, 1, -strlen(func_name1))
      func := func(func_name1)
    }
    eval_part := eval(m2, 1)
    last_eval := eval_part[eval_part.maxIndex()]
    params := []
    Loop, parse, last_eval, `,, % " "
      params.insert(A_LoopField)
    eval := m1 ((isobject(func)) ? (func.(params*)) : last_eval) m3
    for key, line in eval_part
    {
      if (log[log.maxIndex()] != m1 func_name1 "(" line ")" m3)
        log.insert(m1 ((key = eval_part.maxIndex() && !func) ? line : func_name1 "(" line ")") m3)
    }
    if (log[log.maxIndex()] != eval)
      log.insert(eval)
  }
  while (regexmatch(eval, "(.*?)(" number "|" hexnumber ")\s*\*\*\s*(-?" number "|-?" hexnumber ")(.*)", m)) ; **
    log.insert(eval := m1 (m2 ** m3) m4)
  while (regexmatch(eval, "(.*?)(" number "|" hexnumber ")\s*~\s*(-?" number "|-?" hexnumber ")(.*)", m)) ; ~
    log.insert(eval := m1 (m2 ~ m3) m4)
  while (regexmatch(eval, "(.*?)(" number "|" hexnumber ")\s*(\*|/|//)\s*(-?" number "|-?" hexnumber ")(.*)", m)) ; * / //
    log.insert(eval := m1 ((m3="*") ? m2 * m4 : ((m3="/") ? m2 / m4 : m2 // m4)) m5)
  while (regexmatch(eval, "(.*?)(" number "|" hexnumber ")\s*(\+|-)\s*(-?" number "|-?" hexnumber ")(.*)", m)) ; + -
    log.insert(eval := m1 ((m3="+") ? m2 + m4 : m2 - m4) m5)
  while (regexmatch(eval, "(.*?)(" number "|" hexnumber ")\s*(<<|>>)\s*(-?" number "|-?" hexnumber ")(.*)", m)) ; << >>
    log.insert(eval := m1 ((m3="<<") ? m2 << m4 : m2 >> m4) m5)
  while (regexmatch(eval, "(.*?)(" number "|" hexnumber ")\s*(&|\^|\|)\s*(-?" number "|-?" hexnumber ")(.*)", m)) ; & ^ |
    log.insert(eval := m1 ((m3="&") ? m2 & m4 : ((m3="^") ? m2 ^ m4 : m2 | m4)) m5)
  while (regexmatch(eval, "(.*?)(" number "|" hexnumber ")\s*(>|<|>=|<=)\s*(-?" number "|-?" hexnumber ")(.*)", m)) ; > < >= <=
    log.insert(eval := m1 ((m3=">" || m3=">=") ? ((m3=">") ? (m2>m4) : (m2>=m4)) : ((m3="<") ? (m2<m4) : (m2<=m4))) m5)
  while (regexmatch(eval, "(.*?)(" number "|" hexnumber ")\s*(=|==|<>|!=)\s*(-?" number "|-?" hexnumber ")(.*)", m)) ; = == <> !=
    log.insert(eval := m1 ((m3="=" || m3="==") ? ((m3="=") ? (m2=m4) : (m2==m4)) : ((m3="<>") ? (m2<>m4) : (m2!=m4))) m5)
  while (regexmatch(eval, "i)(.*?)(!|not)\s*(-?" number "|-?" hexnumber ")(.*)", m)) ; ! not
    log.insert(eval := m1 (!(m3)) m4)
  while (regexmatch(eval, "i)(.*?)(" number "|" hexnumber ")\s*(&&|and)\s*(-?" number "|-?" hexnumber ")(.*)", m)) ; && and
    log.insert(eval := m1 (m2 && m4) m5)
  while (regexmatch(eval, "i)(.*?)(" number "|" hexnumber ")\s*(\|\||or)\s*(-?" number "|-?" hexnumber ")(.*)", m)) ; || or
    log.insert(eval := m1 (m2 || m4) m5)
  while (regexmatch(eval, "\s*(.+?)\s*\?\s*(.+?)\s*:\s*(.+?)\s*", m)) ; ?:
    log.insert(eval := m1 ? m2 : m3)
  if (log[log.maxIndex()] != eval)
    log.insert(eval)
  return (returnlog) ? log : eval
}
thanks for the quick reply !
i would like to get comments on the code i wrote.
cheers ;)
yawikflame

Return to “Ask for Help (v1)”

Who is online

Users browsing this forum: MrHue, Rohwedder, songdg and 323 guests