HeyHo,
habe mal nur so aus Spaß nen Taschenrechner programmiert.
Über Tipps, Feedback und Verbesserungsvorschläge würde ich mich freuen
€: Habe den Code von 700+ ( ich weiß nicht mehr genau, wieviel es waren ) jetzt auf 255 Zeilen ( mit Leerzeilen ) gekürzt, bei gleichem Funktionsumfang .
€²: Soviele Besucher und Downloads, und so wenig Kommentare?? Kommt Leute, ich beiß nicht.
Größte Änderungen:
-mit Arrays gearbeitet ( DANKE an Bug-Fix für sein Tutorial )
-alle Memory-Funktionen in eine Func gepackt
-sqrt gibt jetzt direkt Ergebnis zurück ( zuvor wurde "sqrt(" ins Display geschrieben )
-keine MsgBoxen mehr am Ende
-Die Werte der Memory-Slots werden jetzt auch im Menü angezeigt
Spoiler anzeigen
#include <GUIConstantsEx.au3>
#include <String.au3>
#include <GUIConstants.au3>
#include <EditConstants.au3>
#include <Array.au3>
Global $hBlue = 0x003366 ; Hintergrundfarbe
Global $nErgebnis, $bErsetzen, $iMode
Global Const $nPi = 3.14159265
Global $anMem[6], $anValue[6], $aSave[6], $aInsert[6], $aCopy[6], $AccelKeys[1][1]
Global $arZiffern[10]
Global $ar2D[10][2] = [["31", "225"],["31", "75"],["84", "75"], _
["137", "75"],["31", "125"],["84", "125"],["137", "125"],["31", "175"], _
["84", "175"],["137", "175"]]
#Region GUI
$main = GUICreate("Calculator", 300, 335)
#Region Menu
$memmenu = GUICtrlCreateMenu("Memory Functions")
$memvaluemenu = GUICtrlCreateMenu("Value", $memmenu)
For $i=1 to 5
$anValue[$i]=GUICtrlCreateMenuItem("NOT in use", $memvaluemenu)
Next
$memselection = GUICtrlCreateMenu("Save into slot", $memmenu)
For $i=1 to 5
$aSave[$i]=GUICtrlCreateMenuItem($i, $memselection)
Next
$meminsert = GUICtrlCreateMenu("Insert", $memmenu)
For $i=1 to 5
$aInsert[$i] = GUICtrlCreateMenuItem($i, $meminsert)
Next
$memcopy = GUICtrlCreateMenu("Copy value to Clipboard", $memmenu)
For $i=1 to 5
$aCopy[$i] = GUICtrlCreateMenuItem($i, $memcopy)
Next
$memclear = GUICtrlCreateMenuItem("Clear all slots", $memmenu)
$moremenu = GUICtrlCreateMenu("More")
$sqrt = GUICtrlCreateMenuItem("Square root (sqrt)", $moremenu)
$inscopy = GUICtrlCreateMenuItem("Copy value to clipboard", $moremenu)
$insclip = GUICtrlCreateMenuItem("Insert content of clipboard ", $moremenu)
$inspi = GUICtrlCreateMenuItem("Insert ' pi ' ", $moremenu)
$aboutmenu = GUICtrlCreateMenu("About")
$about = GUICtrlCreateMenuItem("About this program", $aboutmenu)
#EndRegion Menu
#Region Zahlen
For $i = 0 To 9
$arZiffern[$i] = GUICtrlCreateButton($i, $ar2D[$i][0], $ar2D[$i][1], 35, 35)
Next
#EndRegion Zahlen
#Region Sonstiges
$del = GUICtrlCreateButton("DEL", 236, 30, 30, 30)
$komma = GUICtrlCreateButton(",", 84, 225, 35, 35)
$vorzeichen = GUICtrlCreateButton("±", 137, 225, 35, 35)
$geteilt = GUICtrlCreateButton("÷", 196, 76, 30, 30)
$mal = GUICtrlCreateButton("×", 196, 116, 30, 30)
$minus = GUICtrlCreateButton("-", 196, 156, 30, 30)
$plus = GUICtrlCreateButton("+", 196, 196, 30, 30)
$clear = GUICtrlCreateButton("CLR", 196, 236, 30, 30)
$hoch = GUICtrlCreateButton("^", 236, 76, 30, 30)
$klammerauf = GUICtrlCreateButton("(", 236, 116, 30, 30)
$klammerzu = GUICtrlCreateButton(")", 236, 156, 30, 30)
$hoch2 = GUICtrlCreateButton("x²", 236, 196, 30, 30)
$gleich = GUICtrlCreateButton("=", 236, 236, 30, 30)
$rahmencopy = GUICtrlCreateLabel("0", 32, 275, 130, 34, 0x07)
$copyright = GUICtrlCreateLabel("(c) by Mario Eckert", 50, 280, 100, 25)
$disp = GUICtrlCreateInput("", 50, 25, 165, 30, $GUI_SS_DEFAULT_INPUT)
#EndRegion Sonstiges
GUISetState(@SW_SHOW)
$font = "Comic Sans MS"
GUICtrlSetFont($disp, "16", 400, "", $font)
GUICtrlSetFont($copyright, 14, 400, 4, $font)
GUISetBkColor($hBlue)
GUICtrlSetState($disp, $GUI_FOCUS)
Dim $aAccelKeys[1][2] = [["{ENTER}", $gleich]]
GUISetAccelerators($aAccelKeys)
#EndRegion GUI
#Region Funcs
Func _check(); Checken, ob aktuelle Anzeige überschrieben werden soll
$nRead = GUICtrlRead($disp)
If $nRead == $nErgebnis Then;falls Anzeige = Ergebnis soll eine neue Rechnung gestartet werden
Global $bErsetzen = True;also werden wir nachher die Anzeige überschreiben
Else;ansonsten wird die Zahl hinter die aktuelle Anzeige gesetzt...
Global $bErsetzen = False
EndIf
EndFunc ;==>_check
Func _add($char)
_check()
If $bErsetzen = False Then
GUICtrlSetData($disp, GUICtrlRead($disp) & $char)
Else
GUICtrlSetData($disp, $char)
EndIf
EndFunc ;==>_add
Func _vorzeichen()
$nRead = GUICtrlRead($disp)
$left = StringLeft($nRead, "1");erstes Zeichen von links
If $left == "-" Then;falls das erste Zeichen von links ein Minus ('-') ist
$changed = StringReplace($nRead, "-", "");wird es gelöscht
GUICtrlSetData($disp, $changed)
Else;ansonsten
GUICtrlSetData($disp, "-" & GUICtrlRead($disp));wird ein Minus vor die erste Zahl gesetzt
EndIf
EndFunc ;==>_vorzeichen
#Region Sonstiges
#Region Memory
Func _memory($sAction, $i="")
Switch $sAction
Case "save"
If $anMem[$i] == "" Then ;noch nicht benützt
_ArrayInsert($anMem, $i, $nErgebnis)
MsgBox(64, "Memory", "Succesfully saved '" & $nErgebnis & " ' into Memoryslot " & $i)
GUICtrlSetData($anValue[$i], $anMem[$i])
Else ; wurde schon beschrieben
$iAnswer = MsgBox(292, "Already in use", "Memory slot A already contains something. Would you like to owerwrite the information?")
Switch $iAnswer
Case 6 ;Yes Button gedrückt
_calc()
_ArrayInsert($anMem, $i, $nErgebnis)
MsgBox(64, "Memory", "Succesfully saved '" & $nErgebnis & " ' into Memoryslot ")
GUICtrlSetData($anValue[$i], $anMem[$i])
Case 7 ;No Button gedrückt
EndSwitch
EndIf
Case "insert"
If $anMem[$i] == "" Then
MsgBox(16, "Not in use", "Memory Slot " & $i & "is NOT in use!")
Else
GUICtrlSetData($disp, GUICtrlRead($disp) & $anMem[$i])
EndIf
Case "copy"
If $anMem[$i] == "" Then
MsgBox(16, "Not in use", "Memory Slot " & $i & "is NOT in use!")
Else
ClipPut($anMem[$i])
EndIf
Case "clear"
$iAnswer = MsgBox(305, "Clear Memory?", "All information will be deleted.")
If $iAnswer == 1 Then
For $i = 1 To 5
$anMem[$i] = ""
Next
EndIf
EndSwitch
EndFunc ;==>_memory
#EndRegion Memory
Func _inscopy()
$nRead = GUICtrlRead($disp)
ClipPut($nRead)
EndFunc ;==>_inscopy
Func _insclip()
$sClip = ClipGet()
$nConverted = StringRegExpReplace($sClip, "[^0123456789*/+-^()]", "");aussortieren
If @error Then MsgBox(16, "Error", "Error: Clipboard contains invalid data!")
GUICtrlSetData($disp, $nConverted)
EndFunc ;==>_insclip
Func _inspi()
_check()
If $bErsetzen = False Then
GUICtrlSetData($disp, GUICtrlRead($disp) & $nPi)
Else
GUICtrlSetData($disp, $nPi)
EndIf
EndFunc ;==>_inspi
Func _calc($iMode = 1)
$nRead = GUICtrlRead($disp);Anzeige
If $iMode = "sqrt" Then
Global $nErgebnis = Execute("sqrt(" & StringRegExpReplace(StringReplace($nRead, ",", "."), "[^0123456789*/+-/^()]", "") & ")"); Wurzel von Display
Else
Global $nErgebnis = Execute(StringRegExpReplace(StringReplace($nRead, ",", "."), "[^0123456789*/+-/^()]", ""));rechnen
EndIf
If @error == 1 Then ; Fehler
MsgBox(16, "Error", "Couldn't calculate this expression!" _
& @CRLF & "Please check for syntax or other mistakes!" _
& @CRLF & "Expression was:" & $nRead, 15)
EndIf
GUICtrlSetData($disp, $nErgebnis); anzeigen
EndFunc ;==>_calc
Func _dellast() ; letztes Zeichen löschen
$nRead = GUICtrlRead($disp);Anzeige
GUICtrlSetData($disp, StringTrimRight($nRead, 1));Rechts ein Zeichen löschen
EndFunc ;==>_dellast
Func _about()
MsgBox(64, "About...", "This calculator was coded by Mario Eckert." & @CRLF & _
"Any changes or using without permission are strictly forbidden!" & @CRLF & _
"(c) 2009 Mario Eckert")
EndFunc ;==>_about
#EndRegion Sonstiges
#EndRegion Funcs
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $del
_dellast()
Case 36 To 45;0 bis 9
_add($nMsg-36)
Case $komma
_add(".")
Case $vorzeichen
_vorzeichen()
Case $plus
_add("+")
Case $minus
_add("-")
Case $mal
_add("*")
Case $geteilt
_add("/")
Case $clear
GUICtrlSetData($disp, "");Anzeige wird gelöscht
Case $hoch
_add("^")
Case $klammerauf
_add("(")
Case $klammerzu
_add(")")
Case $hoch2
_add("^2")
Case $gleich
_calc()
Case 11 To 15;Save to Slot 1-5
_memory("save", $nMsg - 10)
Case 17 To 20; Insert
_memory("insert", $nMsg - 16)
Case 23 To 27; Copy to Clip
_memory("copy", $nMsg - 22)
Case $memclear
_memory("clear")
Case $inscopy
_inscopy()
Case $inspi
_inspi()
Case $insclip
_check()
_insclip()
Case $sqrt
_calc("sqrt")
Case $about
_about()
EndSwitch
WEnd