Jump to content

Recommended Posts

Posted

I'd like to make a calculator for use in my business.

We are a copy service that charges rates per page.

I'd like to make a small little program where I can input the page count and it will give me the amount to charge my customers.

Our rates are as follows:

$1 for every page up to 25 pages than $0.50 for every page thereafter.

I know it shouldn't be much harder than making a simple algorithm but I'm not exactly the best at this kind of thing. Anyone out there that can help me?

Posted (edited)

I should let you try by yourself, but this should do what you want:

Global $iCharge, $iPages
$iPages = InputBox("Amount of Pages?")
If $iPages <=25 Then
    $iCharge = $iPages
Else
   $iCharge = ($iPages - 25) * 0.5 + 25 
EndIf
MsgBox(0,"Charge:",$iCharge & "$")
Edited by hannes08
Regards,Hannes[spoiler]If you can't convince them, confuse them![/spoiler]
Posted (edited)

Quick and dirty example without polishing/error checking ...

#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("Calculator", 312, 108, 192, 114)
$Label1 = GUICtrlCreateLabel("Pages:", 72, 24, 37, 17)
$Input1 = GUICtrlCreateInput("", 112, 24, 121, 21)
$Label2 = GUICtrlCreateLabel("Charge:", 72, 56, 38, 17)
$Input2 = GUICtrlCreateInput("", 112, 56, 121, 21)
;GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetBkColor(-1, 0x00ff00)
GUISetState(@SW_SHOW)

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func GetCharge($iPages)
    Local $iCharge
    If $iPages <=25 Then
        $iCharge = $iPages
    Else
       $iCharge = ($iPages - 25) * 0.5 + 25
    EndIf
    Return $iCharge & " $"
EndFunc

Func WM_COMMAND($hWnd, $msg, $wParam, $lParam)
    Local $nNotifyCode = BitShift($wParam, 16)
    Local $nID = BitAND($wParam, 0xFFFF)

    If $nID = $Input1 And $nNotifyCode = $EN_CHANGE Then
        $pages = GUICtrlRead($Input1)
        $charge = GetCharge($pages)
        GUICtrlSetData($Input2, $charge)
    EndIf

    Return $GUI_RUNDEFMSG
EndFunc

EDIT: removed disable status and changed color of output

Edited by Zedna
Posted (edited)

kazah!

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
;Opt("GUIOnEventMode", 1)
#region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 251, 161, 192, 124)
GUISetState(@SW_SHOW)
Local $buttons[10][2] = [[GUICtrlCreateButton("1", 16, 32, 25, 25),1], _
  [GUICtrlCreateButton("2", 49, 25, 25, 25),2], _
  [GUICtrlCreateButton("3", 79, 42, 25, 25),3], _
  [GUICtrlCreateButton("4", 17, 66, 25, 25),4], _
  [GUICtrlCreateButton("5", 45, 62, 25, 25),5], _
  [GUICtrlCreateButton("6", 95, 63, 25, 25),6], _
  [GUICtrlCreateButton("7", 38, 98, 25, 25),7], _
  [GUICtrlCreateButton("8", 76, 91, 25, 25),8], _
  [GUICtrlCreateButton("9", 5, 95, 25, 25),9], _
  [GUICtrlCreateButton("0", 69, 72, 25, 25),0]]
$Exec = GUICtrlCreateButton("equails", 72, 128, 51, 25)
$Cls = GUICtrlCreateButton("c", 184, 40, 49, 41)
Local $operators[3][2] = [[GUICtrlCreateButton("x", 144, 48, 25, 25),'*'], _
   [GUICtrlCreateButton("-", 147, 74, 25, 25),'-'], _
   [GUICtrlCreateButton("+", 136, 94, 25, 25),'+']]
$Input1 = GUICtrlCreateInput("", 96, 8, 137, 21)
#endregion ### END Koda GUI section ###
Local $Temp, $Ex
Local $x, $y, $s
While 1
$M = GUIGetMsg()
If -3 = $M Then Exit
For $I = 0 To UBound($buttons) - 1
  If $Buttons[$I][0] = $M Then
   GUICtrlSetData($Input1,GUICtrlRead($Input1) & $buttons[$I][1])
  EndIf
Next
For $I = 0 To UBound($operators) - 1
  If $operators[$I][0] = $M Then
   $Ex = $operators[$I][1]
   $Temp = GUICtrlRead($Input1)
   GUICtrlSetData($Input1,'')
  EndIf
Next
If $Exec = $M Then
  GUICtrlSetData($Input1,Execute(GUICtrlRead($Input1) & " " & $Ex & " " & $Temp))
EndIf
If $cls = $M Then
  $Temp = ''
  $Ex = ''
  GUICtrlSetData($Input1,'')
EndIf
$x = Random(0, 251, 1)
$Y = Random(0, 161, 1)
$S = Random(10, 55, 1)
$p = WinGetPos($Form1)
$1 = DllCall("gdi32.dll", "long", "CreateRectRgn", "long", 0, "long", 0, "long", $p[2], "long", $p[3])
$2 = DllCall("gdi32.dll", "long", "CreateEllipticRgn", "long", $x, "long", $y, "long", $x + $s, "long", $y + $s)
$3 = DllCall("gdi32.dll", "long", "CreateRectRgn", "long", 0, "long", 0, "long", 0, "long", 0)
DllCall("gdi32.dll", "long", "CombineRgn", "long", $3[0], "long", $1[0], "long", $2[0], "int", 4)
DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $Form1, "long", $3[0], "int", 1)
WEnd
Edited by ApudAngelorum
Posted (edited)

Just hint for you:

You can store some constants that can change in the future in INI file.

So in future when number of pages/charge per page changes then you will just edit your (text) INI file without need of recompiling of program.

In this case INI file could be something like this (calculator.ini):

[Settings]
PagesCost1=25
Cost1=1
Cost2=0.5

Look into helpfile at function IniRead how to use INI files.

EDIT: Here is solution using INI file without any hardcoded numbers in script

#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Global $ini_PagesCost1, $ini_Cost1, $ini_Cost2

$ini = 'calculator.ini'
$ini_PagesCost1 = IniRead($ini, 'Settings', 'PagesCost1', '25')
$ini_Cost1 = IniRead($ini, 'Settings', 'Cost1', '1')
$ini_Cost2 = IniRead($ini, 'Settings', 'Cost2', '0.5')

$Form1 = GUICreate("Calculator", 312, 108, 192, 114)
$Label1 = GUICtrlCreateLabel("Pages:", 72, 24, 37, 17)
$Input1 = GUICtrlCreateInput("", 112, 24, 121, 21)
$Label2 = GUICtrlCreateLabel("Charge:", 72, 56, 38, 17)
$Input2 = GUICtrlCreateInput("", 112, 56, 121, 21)
;GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetBkColor(-1, 0x00ff00)
GUISetState(@SW_SHOW)

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func GetCharge($iPages)
    Local $iCharge
    If $iPages <= $ini_PagesCost1 Then
        $iCharge = $iPages * $ini_Cost1
    Else
       $iCharge = $ini_PagesCost1 * $ini_Cost1 + ($iPages - $ini_PagesCost1) * $ini_Cost2
    EndIf
    Return $iCharge & " $"
EndFunc

Func WM_COMMAND($hWnd, $msg, $wParam, $lParam)
    Local $nNotifyCode = BitShift($wParam, 16)
    Local $nID = BitAND($wParam, 0xFFFF)

    If $nID = $Input1 And $nNotifyCode = $EN_CHANGE Then
        $pages = GUICtrlRead($Input1)
        $charge = GetCharge($pages)
        GUICtrlSetData($Input2, $charge)
    EndIf

    Return $GUI_RUNDEFMSG
EndFunc
Edited by Zedna

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...