Nun möchte ich es euch zeigen und fragen ob ich es so wie wir es kommentiert haben richtig verstanden haben. Dabei ist es so wie es ist ok. Ihr müsst uns also nichts verbessern, eigentlich nur bitte und ich weis das sehr zu schätzten, einfach sagen ob wir richtig sind im verständnis.
Danke euch sehr
Code: Alles auswählen
; Dies ist das erste Projekt von Tom und Erwin Jaberg.
; Wir haben viel Hilfe im Forum erhalten und bedanken uns recht herzlich für diese Unterstützung.
; Es geht nicht darum hier so schlank und gut wie möglich zu Programmieren, sondern so nachvollziehbar wie möglich. Deswegen
; sind auch Prozeduren für die einzelnen Aufgaben nicht zusammengelegt.
; Mit Eneumeritation wird den Konstanten eine Fortlaufende Nummer vergeben anstelle dies von Hand zu machen.
Enumeration ; hier kommen alle Windows rein
#Hauptfenster
EndEnumeration
Enumeration ; hier kommen alle Menüitems rein
#Entergedrueckt
EndEnumeration
Enumeration ; hier kommen alle Gadgets rein
#ErsteZahl
#ZweiteZahl
#EingabeErgebnis
#ErgebnisErrechnet
#RichtigOderFalschText
#AnzahlRichtigeText
#AnzahlRichtigeWert
#AnzahlFalscherText
#AnzahlFalscherWert
#AktuelleDauer
#BildKonstante
#BildGadgetKonstante
#Schriftformatkonstante
#MalZeichen
EndEnumeration
; Hier werden die Variabeln mit den entsprechenden Werten versehen die es später braucht.
Anzahl_Rechnungen = 0 ; Diese Variabel wird für den Zähler gebraucht der die Rechenaufgaben zählt, damit es immer mit
; eins beginnt in der Schlaufe
Anzahl_Richtig = 0 ; Diese Variable hilft beim Zählen der richtigen, und wird hier auf null gestellt.
Anzahl_Falsche = 0 ; Diese Variable hilft beim Zählen der falschen, und wird hier auf null gestellt.
t_start = ElapsedMilliseconds() ; Hier wird die Zeit gemessen seit start vom Programm und den Anfangswert eingegeben.
; Diese Prozedur ermöglicht das anzeigen der Zeit die Sekundenweise angezeigt wird.
Procedure Zeit_Updaten(Dummy) ;Beginn der Prozedur, welche aber als Threat gestartet wird, dass macht es möglich das es
;Zeitlich unabhängig vom rest des Programmes läuft.
Shared t_start ;der Variablewert t_start wird in die Prozedur übernommen
Repeat ;Beginn der Schlaufe
laufzeit_jetzt = ElapsedMilliseconds() - t_start ;Es wird die Zeit vom Start des Programms bis jetzt errechnet.
SetGadgetText(#AktuelleDauer, "Laufzeit: " + Str(laufzeit_jetzt/1000) + " s") ;Es wird dem TextGadget mit der Konstante
;#AktuelleDauer den Wert zugewiesen welcher
;zum einen aus dem Resultat der Zeitberechnung
;zum anderen aus dem nötigen Text besteht
Delay(1000) ;Damit die Schlaufe nicht zuviel Prozessorleistung verbraucht, gibt es hier ein Pause von einer Sekunde.
ForEver ;Die Schlaufe läuft bis das Programm beendet wird.
EndProcedure ;Ende der Prozedur
; Diese Prozedur erstellt die neue Rechnung, und schreibt sie auf die Oberfläche
Procedure FillGadget() ;Beginn der Prozedur
SetGadgetText(#ErsteZahl,Str(Random(8)+2)) ;Ein Zufallswert ab der Ziffer 2 bis zum Wert 10 wird dem Textgadget mit der Konstante
;#ErsteZahl zugewiesen.
SetGadgetText(#ZweiteZahl,Str(Random(8)+2)) ;Ein Zufallswert ab der Ziffer 2 bis zum Wert 10 wird dem Textgadget mit der Konstante
;#ZweiteZahl zugewiesen.
SetGadgetText(#EingabeErgebnis,"") ;Das Feld wo das Ergebniss reingeschrieben wird, welches das StringGadget mit der
;Konstante #EingabeErgebnis ist wird geleert.
EndProcedure ;Ende der Prozedur
; Diese Prozedur berechnet die Werte in den GadgetTexten mit den Konstanten #ErsteZahl und #ZweiteZahl und wertet aus ob das
; Eingegeben Resultat mit dem errechneten übereinstimmt, und wenn es stimmt wird die Konstante #True mit dem Wert "Wahr" gefühlt.
Procedure rechne() ;Beginn der Prozedur
val1.s = GetGadgetText(#ErsteZahl) ;die Variable val1.s wird mit dem Wert des Textgadget mit der Konstante
;#ErsteZahl gefühlt und als Stringvariable deklariert.
val2.s = GetGadgetText(#ZweiteZahl) ;die Variable val2.s wird mit dem Wert des Textgadget mit der Konstante
;#ErsteZahl gefühlt und als Stringvariable deklariert.
result = Val(val1)*Val(val2) ;die Variable result wird mit dem gerechneten Wert gefühlt.
SetGadgetText(#ErgebnisErrechnet,Str(result)) ;der Variabelwert result wird dem Textgadget mit der Konstante
;#ErgebnisErrechnet zugewiesen.
If result = Val(GetGadgetText(#EingabeErgebnis)) ;"Wenn" das eingegeben Resultat mit dem berechneten Resultat übereinstimmt
ProcedureReturn #True ;wird dem Prozedurresultat mit der Konstante #True "Wahr" zugewiesen.
EndIf ;Wenn beendet
EndProcedure ;Ende der Prozedur
; Diese Prozedur gibt eine Meldung aus in einem Meldefenster in welchem die Anzahl richtigen und falschen Antworten und die benötigte
; Zeit für die Aufgabe ausgegeben wird.
Procedure Auswertung() ;Beginn der Prozedur
Shared Anzahl_Richtig ;Der Variabelwert Anzahl_Richtige wird in die Prozedur übernommen
Shared Anzahl_Falsche ;Der Variabelwert Anzahl_Falsche wird in die Prozedur übernommen
Sekunden.s = GetGadgetText(#AktuelleDauer) ;Der Variabelwert der Dauer wird in die Prozedur übernommen
;Die folgende Meldungsausgabe stellt die Variabelwerte in einem Sinnergebenden
;Text dar.
MessageRequester("Information", "Du Wicht hast nur " + Str(Anzahl_Richtig) + " Richtige von 10 Herausvorderungen gemacht und dafür "+ Sekunden + " gebraucht" , #PB_MessageRequester_Ok)
End
EndProcedure ;Ende der Prozedur
; Beginn des Hauptteil des Programms welches nur einmal durchlaufen wird.
;Das Fenster wird in der entsprechenden grösse und Titelbeschriftung geöffent.
If OpenWindow(#Hauptfenster,0,0,200,300,"Taschenrechner",#PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget)
;Hier werden die verschiedenen Gadgets eingefügt und Positioniert
If CreateGadgetList(WindowID(#Hauptfenster))
TextGadget(#ErsteZahl,20,30,20,30,Str(Random(8)+2)) ;Die erste Zahl der Rechnung wird Positioniert,
;20 Pixel von links, 30 Pixel von oben, 20 Pixel breit, 30 Pixel hoch
;Da sich das bei den anderen Zeilen wiederhollt beschreibe ich die sich
;wiederhollenden Zeilen hier nicht noch einmal.
TextGadget(#MalZeichen, 41, 30, 20, 30, "*")
TextGadget(#ZweiteZahl,60,30,100,30,Str(Random(8)+2))
TextGadget(#PB_Any, 0, 70, 150, 20, "Sag was Sache ist Du Pfeife") ;Das erzeugt ein Text der Fest ist auf dem Fenster.
StringGadget(#EingabeErgebnis,0,90,100,38,"",#PB_String_Numeric) ;Das erzeugt ein Feld auf dem Fenster
TextGadget(#PB_Any, 0, 140, 200, 20, "Rechne und hau die Finger aufs Enter")
TextGadget(#RichtigOderFalschText, 0, 160, 150, 40, "")
TextGadget(#ErgebnisErrechnet,160,160,100,30,"")
TextGadget(#AnzahlRichtigeText, 0, 200, 100, 20, "Richtige")
TextGadget(#AnzahlRichtigeWert, 100, 200, 30, 20, "")
TextGadget(#AnzahlFalscherText, 0, 220, 100, 20, "Falsche")
TextGadget(#AnzahlFalscherWert, 100, 220, 30, 20, "")
TextGadget(#AktuelleDauer, 0, 270, 150, 20, "Laufzeit: " + Str(laufzeit_jetzt/1000) + "s")
; Hier werden die Konstanten welche aufgeführt sind mit der Schriftart VErdana 22 versehen,
If LoadFont(#Schriftformatkonstante, "Verdana", 22, 0) ;Der Formatierungswert wird die Formatierungskonstante
;#Schriftformatkonstante erfasst
SetGadgetFont(#ErsteZahl, FontID(#Schriftformatkonstante)) ;mit da FontID meherer Werte haben kann wird dies mit der
;Konstante #Schriftformatkonstante definiert das es um den
;Wert Verdana 22 geht.
SetGadgetFont(#ZweiteZahl, FontID(#Schriftformatkonstante))
SetGadgetFont(#MalZeichen, FontID(#Schriftformatkonstante))
SetGadgetFont(#EingabeErgebnis, FontID(#Schriftformatkonstante))
EndIf
AddKeyboardShortcut(#Hauptfenster,#PB_Shortcut_Return,#Entergedrueckt) ; Hier wird der Konstante #Entergedrueckt ein Wert zugewiesen
; der unten ausgewertet werden kann, dieser Wert wurde oben
; festgelegt mit der Ziffer1 in der Zeile 21
SetActiveGadget(#EingabeErgebnis) ; Mit dem Cursor das Feld der Eingabe anspringen.
CreateThread(@Zeit_Updaten(),0) ; Die Prozedur als Thread aufrufen (unterprogramm das Zeitlich unabhänig ist.)
EndIf
EndIf
;Damit das Programm nicht gleich abstellt sondern weiterläuft wird mit einer Schlaufe gearbeited welche die möglichen zustände
;und ergebnisse die entstehen abfängt und auswerted.
Repeat
EventID = WaitWindowEvent() ; Es muss was geschehen auf dem Fenster
Select EventID ; Auswertung der Geschehnisse die in der Variable EventID sind.
Case #PB_Event_Menu ; Wenn es eine Wert ist der mit der Funktionen der Menüsteurung im Programm zu tun hat hier weiter fahren.
If EventMenu() = #Entergedrueckt ; Wenn es die Entertaste war die gedrückt wurde.
EndIf
If rechne() ; Prozedur rechne() aufrufen und das Resultat hier gleich auswerten und wenn es in der
; in der Prozedur bei der Auswertung richtig ist, sprich die Eingabe war richtig
; war und wird hier ausgeführt.
Anzahl_Richtig = Anzahl_Richtig +1 ;Zähler richtige Antwort eins höher stellen
SetGadgetText(#RichtigOderFalschText, "Richtig das Resultat war")
SetGadgetText(#AnzahlRichtigeWert, Str(Anzahl_Richtig))
Else
; Wenn in der Prozedur rechne() ausgeführt wurden, und das Eingegeben Ergebenis nicht
; Stimmte wird das hier ausgeführt.
Anzahl_Falsch = Anzahl_Falsch +1 ;Zähler falsche Antwort eins höher stellen
SetGadgetText(#RichtigOderFalschText, "Aber aber so was auch, das richtige Resultat lautet")
SetGadgetText(#AnzahlFalscherWert,Str(Anzahl_Falsch))
EndIf
FillGadget() ;die Prozedur FillGadget aufrufen
SetActiveGadget(#EingabeErgebnis) ;gehe mit dem Curser in das Eingabefeld
Anzahl_Rechnungen=Anzahl_Rechnungen+1 ;Zähler anzahl gerechneter Rechnungen eins höher stellen
If Anzahl_Rechnungen = 10 ;Wenn zehn Rechnungen gemacht wurden die Prozedur Auswertung starten
Auswertung()
EndIf
Case #PB_Event_CloseWindow
End
Case #PB_Event_Gadget
EndSelect
Until EventID = #PB_Event_CloseWindow
End