Seite 1 von 1

Bitte um Korrektur

Verfasst: 12.05.2007 18:48
von duli
Hallo zusammen, nach dem mein Sohn und ich nun, so einiges zu verdauen hatte, haben wir uns daran gemacht das programm zu Kommentieren, und es ist fertig geworden.

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 

Verfasst: 12.05.2007 19:23
von Macros
Alles richtig, bis auf eine Kleine Sache:
in Zeile 203 steht:

Code: Alles auswählen

      If EventMenu() = #Entergedrueckt  ; Wenn es die Entertaste war die gedrückt wurde.

      EndIf
Das Endif dürfte aber erst nach dem

Code: Alles auswählen

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
kommen,
sonst wird das jedesmal bei einem Menüevent ausgeführt.
soll heißen, im Moment funktioniert es,
aber wenn du z.B. einbaust, das man mit P eine Pause machen kann,
Und dein Nutzer jetzt P drückt,
dann würde dein Programm nicht nur Pause machen, sondern auch noch
schaun, ob im Feld das richtige Ergebnis steht,
obwohl der Nutzer dort vielleicht noch gar nichts eingegeben hat.

Verfasst: 13.05.2007 15:51
von duli
:D Danke vielmals für das Engagement, bin sehr froh.

Freue mich natürlich dass es soweit ok ist. Ich weiss da kann noch vieles verbessert werden, aber für mich ist es ein Grundreferenz die mir Grundsätzliches näher bringt.

:allright: Auf ein Forum wie dieses könnt ihr stolz sein.

Duli der Anfänger