Seite 1 von 1

Bitte um Hilfe den Programcode zu bereinigen

Verfasst: 26.04.2007 00:42
von duli
Hallo :mrgreen: hier bin ich wieder, ich habe mit meinem Sohn versucht ein kleines Programm zu schreiben bei welchem er das ein mal ein besser üben kann.

Nun wir haben das so einigermassen hinbekommen aber es ist etwas geflickt weil es uns nicht gelungen ist das die Entertaste verwendet werden kann um eine neue Rechnung zu starten.

Es soll zufählig Zahl ein und Zahl zwei eintragen. Und man selber soll das resultat eingeben können. dann soll man mit der Schaltfläche kontrolliert werden können ob das Resultat zu sehen.

Ich wäre froh wenn ihr mir zeigen könntet wie ich die " IF " Abfrage für die Entertaste anderes direkt in dem Selekt lössen könnte.

Auch wäre es super wenn ihr zeigen könntet wie wir es fertig bringen auch einen Text der nach der Eingabe richtig oder falsch in einem Meldungsfenster ausgeben würde.

Hier der Code

Code: Alles auswählen

Label_1:

#ButtonPlus = 0
#ButtonMinus = 1
#ButtonMal = 2
#ButtonDurch = 3
#StringZahl1 = 4
#StringZahl2 = 5
#StringZahl3 = 6
#StringErgebnis = 7
#MainWindow = 0


If OpenWindow(#MainWindow,0,0,200,340,"Taschenrechner",#PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget)
 
  If CreateGadgetList(WindowID(0))
  
 
      TextGadget(1111, 0, 10, 100, 20, "Erste Zahl")
  
    StringGadget(#StringZahl1,0,30,100,20,Str(Random(12)),#PB_String_Numeric)

      TextGadget(1112, 0, 60, 100, 20, "Zweite Zahl")
    
    StringGadget(#StringZahl2,0,80,100,20,Str(Random(12)),#PB_String_Numeric)

    ButtonGadget(#ButtonMal,0,110,100,20,"*")

      TextGadget(1113, 0, 135, 150, 20, "Resultat eingeben")

    StringGadget(#StringZahl3,0,150,100,20,"",#PB_String_Numeric)
    
      TextGadget(1114, 0, 175, 150, 20, "Resultat Richtig")

    StringGadget(#StringErgebnis,0,190,100,20,"",#PB_String_Numeric | #PB_String_ReadOnly)
    
      TextGadget(1115, 0, 230, 150, 20, "Neue Rechnung mit Enter") 
    
     
  EndIf
EndIf

Repeat
    EventID = WaitWindowEvent() 
     
  If GetAsyncKeyState_(#VK_RETURN) = -32767 ; RETURN key was pressed 
    Goto Label_1
    Debug "Return-Taste wurde gedrückt!"
  EndIf 
      
          
  Select WaitWindowEvent()
  
    Case #PB_Event_CloseWindow
      End
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #ButtonMal
        SetGadgetText(#StringErgebnis,Str(Val(GetGadgetText(#StringZahl1))*Val(GetGadgetText(#StringZahl2))))
      EndSelect
    
  EndSelect
     
Until EventID = #PB_Event_CloseWindow 
End 

Verfasst: 26.04.2007 01:09
von edel
Verzichte, wenn moeglich, auf goto usw. , benutze dafuer Prozeduren
Benutze eine fortlaufenden index oder pb_any fuer objecte wie gadgets
Nur einmal WaitWindowEvent benutzen.

Code: Alles auswählen

#ButtonPlus = 0
#ButtonMinus = 1
#ButtonMal = 2
#ButtonDurch = 3
#StringZahl1 = 4
#StringZahl2 = 5
#StringZahl3 = 6
#StringErgebnis = 7
#MainWindow = 0
#neu = 0

Procedure FillGadget()
  SetGadgetText(#StringZahl1,Str(Random(12)))
  SetGadgetText(#StringZahl2,Str(Random(12))) 
EndProcedure

Procedure rechne()
  
  val1.s = GetGadgetText(#StringZahl1)
  val2.s = GetGadgetText(#StringZahl2)
  
  SetGadgetText(#StringErgebnis,Str(Val(val1)*Val(val2)))
  
EndProcedure

If OpenWindow(#MainWindow,0,0,200,340,"Taschenrechner",#PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget)
  
  If CreateGadgetList(WindowID(0))
    
    
    TextGadget(#PB_Any, 0, 10, 100, 20, "Erste Zahl")
    
    StringGadget(#StringZahl1,0,30,100,20,Str(Random(12)),#PB_String_Numeric)
    
    TextGadget(#PB_Any, 0, 60, 100, 20, "Zweite Zahl")
    
    StringGadget(#StringZahl2,0,80,100,20,Str(Random(12)),#PB_String_Numeric)
    
    ButtonGadget(#ButtonMal,0,110,100,20,"*")
    
    TextGadget(#PB_Any, 0, 135, 150, 20, "Resultat eingeben")
    
    StringGadget(#StringZahl3,0,150,100,20,"",#PB_String_Numeric)
    
    TextGadget(#PB_Any, 0, 175, 150, 20, "Resultat Richtig")
    
    StringGadget(#StringErgebnis,0,190,100,20,"",#PB_String_Numeric | #PB_String_ReadOnly)
    
    TextGadget(#PB_Any, 0, 230, 150, 20, "Neue Rechnung mit Enter")
    
    AddKeyboardShortcut(#MainWindow,#PB_Shortcut_Return,#neu)
    
  EndIf
EndIf

Repeat
  EventID = WaitWindowEvent()
  
  
  Select EventID
    
    Case #PB_Event_Menu
      
      If EventMenu() = #neu
        FillGadget()
      EndIf
      
    Case #PB_Event_CloseWindow
      End
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #ButtonMal
          rechne()
      EndSelect
      
  EndSelect
  
Until EventID = #PB_Event_CloseWindow
End 

Verfasst: 26.04.2007 08:09
von duli
Danke vielmals für die super Arbeit.
Jetzt sieht es doch nicht mehr so geflickt und logisch aus.

Ich habe noch eine Zeile hinzugefügt im Code

Vorher

Code: Alles auswählen

Procedure FillGadget()
  SetGadgetText(#StringZahl1,Str(Random(12)))
  SetGadgetText(#StringZahl2,Str(Random(12)))
EndProcedure
Nachher

Code: Alles auswählen

Procedure FillGadget()
  SetGadgetText(#StringZahl1,Str(Random(12)))
  SetGadgetText(#StringZahl2,Str(Random(12)))
  SetGadgetText(#StringZahl3,"")
EndProcedure
So konnte ich erreichen, dass nach dem Enter das Eingabefeld wieder leer war.

:freak: Jetzt hätte ich noch eine Frage wie bekomme ich es hin, dass wenn ich eine Enter drücke, dass der Kursor automatisch in das Feld geht wo ich das Resultat von Hand eingeben muss. Das Feld (Sorry Variable) heisst #StringZahl3 wo der Kurser hin sollte.

Danke viel mal noch für die super hilfe.

Duli

Verfasst: 26.04.2007 08:49
von ts-soft

Code: Alles auswählen

SetActiveGadget(#StringZahl3)

Verfasst: 26.04.2007 10:17
von duli
Danke vielmals für den Tip. :allright:


Ich möchte ja noch ne automatische bestätigung haben in welcher gesagt wird ob es richtig ist, das nach dem Enter drücken. Ich weiss dann brauche ich die den Buttum Gadget nicht mehr, aber ich bekomme die Abfrage einfach nicht hin, ich glaube es hat was mit den Variabeltypen zu tun aber alle mir erdenklichen arten haben nicht gefunktioniert.

Code: Alles auswählen

If EventMenu() = #neu
        FillGadget()
         SetActiveGadget(#StringZahl3)
         If Str(Val(val1)*Val(val2))= #StringZahl3
         MessageRequester ("Nachricht", "Super gut gemacht", #PB_MessageRequester_Ok) 
         Else
         MessageRequester ("Nachricht", "Aber auch so was, tz tz tz....", #PB_MessageRequester_Ok) 
      EndIf
Seht ihr wo ich da was falsch mache, danke für euer engagement.

Duli

Verfasst: 26.04.2007 10:32
von edel
#StringZahl3 ist eine Konstante , die hat nichts mit deiner
Rechenaufgabe zu tun.

Code: Alles auswählen


#ButtonPlus = 0
#ButtonMinus = 1
#ButtonMal = 2
#ButtonDurch = 3
#StringZahl1 = 4
#StringZahl2 = 5
#StringZahl3 = 6
#StringErgebnis = 7
#MainWindow = 0
#neu = 0

Procedure FillGadget()
  SetGadgetText(#StringZahl1,Str(Random(12)))
  SetGadgetText(#StringZahl2,Str(Random(12)))
  SetGadgetText(#StringZahl3,"") 
EndProcedure

Procedure rechne()
  
  val1.s = GetGadgetText(#StringZahl1)
  val2.s = GetGadgetText(#StringZahl2)
  result = Val(val1)*Val(val2)
  SetGadgetText(#StringErgebnis,Str(result))
  
  If result = Val(GetGadgetText(#StringZahl3))
    ProcedureReturn #True
  EndIf
  
EndProcedure

If OpenWindow(#MainWindow,0,0,200,340,"Taschenrechner",#PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget)
  
  If CreateGadgetList(WindowID(0))
    
    
    TextGadget(#PB_Any, 0, 10, 100, 20, "Erste Zahl")
    
    StringGadget(#StringZahl1,0,30,100,20,Str(Random(12)),#PB_String_Numeric)
    
    TextGadget(#PB_Any, 0, 60, 100, 20, "Zweite Zahl")
    
    StringGadget(#StringZahl2,0,80,100,20,Str(Random(12)),#PB_String_Numeric)
    
    ButtonGadget(#ButtonMal,0,110,100,20,"*")
    
    TextGadget(#PB_Any, 0, 135, 150, 20, "Resultat eingeben")
    
    StringGadget(#StringZahl3,0,150,100,20,"",#PB_String_Numeric)
    
    TextGadget(#PB_Any, 0, 175, 150, 20, "Resultat Richtig")
    
    StringGadget(#StringErgebnis,0,190,100,20,"",#PB_String_Numeric | #PB_String_ReadOnly)
    
    TextGadget(#PB_Any, 0, 230, 150, 20, "Neue Rechnung mit Enter")
    
    AddKeyboardShortcut(#MainWindow,#PB_Shortcut_Return,#neu)
    
  EndIf
EndIf

Repeat
  EventID = WaitWindowEvent()
  
  
  Select EventID
    
    Case #PB_Event_Menu
      
      If EventMenu() = #neu
        FillGadget()
      EndIf
      
    Case #PB_Event_CloseWindow
      End
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #ButtonMal
          If rechne()
            MessageRequester ("Nachricht", "Super gut gemacht", #PB_MessageRequester_Ok) 
          Else
            MessageRequester ("Nachricht", "Aber auch so was, tz tz tz....", #PB_MessageRequester_Ok)
          EndIf
      EndSelect
      
  EndSelect
  
Until EventID = #PB_Event_CloseWindow
End


Verfasst: 26.04.2007 11:24
von duli
Danke viel mals.
Wau bin geplätet von der Super hilfe die ich hier bekomme.

Ich habe einige Fragen zum Code bei dem Teil mit dem Select

Damit ihr seht was ich wie verstanden habe, habe ich es in meinen Worten dokumentiert und gleich die Fragen dazugeschrieben, wäre froh um etwas Licht im Dunkeln ich denke das ich immer wieder hängen bleibe hat mit meinen Fragen zu tun.

Code: Alles auswählen

#ButtonPlus = 0
#ButtonMinus = 1
#ButtonMal = 2
#ButtonDurch = 3
#StringZahl1 = 4
#StringZahl2 = 5
#StringZahl3 = 6
#StringErgebnis = 7
#MainWindow = 0
#neu = 0

; Hier wird die Maske aufgebaut
Procedure FillGadget()
  SetGadgetText(#StringZahl1,Str(Random(12)))
  SetGadgetText(#StringZahl2,Str(Random(12)))
  SetGadgetText(#StringZahl3,"")
EndProcedure


; Hier wird ausgrechnet was das erbebnis ist und wenn das eingetragen Resultat stimmt wird der Konstante #True 1 zugewiesen
Procedure rechne()
 
  val1.s = GetGadgetText(#StringZahl1)
  val2.s = GetGadgetText(#StringZahl2)
  result = Val(val1)*Val(val2)
  SetGadgetText(#StringErgebnis,Str(result))
 
  If result = Val(GetGadgetText(#StringZahl3))
    ProcedureReturn #True
  EndIf
 
EndProcedure



; Hier wird das Hauptprogramm abbespielt und das Fenster aufgebaut
If OpenWindow(#MainWindow,0,0,200,340,"Taschenrechner",#PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget)
 
  If CreateGadgetList(WindowID(0))
      
    TextGadget(#PB_Any, 0, 10, 100, 20, "Erste Zahl")
   
    StringGadget(#StringZahl1,0,30,100,20,Str(Random(12)),#PB_String_Numeric)
   
    TextGadget(#PB_Any, 0, 60, 100, 20, "Zweite Zahl")
   
    StringGadget(#StringZahl2,0,80,100,20,Str(Random(12)),#PB_String_Numeric)
   
    ButtonGadget(#ButtonMal,0,110,100,20,"*")
   
    TextGadget(#PB_Any, 0, 135, 150, 20, "Resultat eingeben")
   
    StringGadget(#StringZahl3,0,150,100,20,"",#PB_String_Numeric)
   
    TextGadget(#PB_Any, 0, 175, 150, 20, "Resultat Richtig")
   
    StringGadget(#StringErgebnis,0,190,100,20,"",#PB_String_Numeric | #PB_String_ReadOnly)
   
    TextGadget(#PB_Any, 0, 230, 150, 20, "Neue Rechnung mit Enter")
   
    AddKeyboardShortcut(#MainWindow,#PB_Shortcut_Return,#neu)
   
  EndIf
EndIf




; Hier beginnt eine Schlaufe die erst verlassen wird wenn das Programm beendet wird.
Repeat
  
 ; Hier wartet das Programm und die Tasteneingaben oder Gadgeteingaben
  EventID = WaitWindowEvent()
 
 ; Hier werden die Tasten oder sonstige Ereignise abgefragt und werden hier ausgewertet, in Form von einer Selectabfrage. 
 ; Wobei der Wert welcher verglichen wird immer von der EventID stammt.
  Select EventID
   
  ; Alst wenn EventID = #PB_Event_Menu ist mache folgende Anweisungen 
    Case #PB_Event_Menu
     
     ; Hier wird abgefragt ob der Wert im EventMenu() = #neu ist wobei der Inhalt von #neu aus der Zeile mit 
     ; AddKeyboardShortcut(#MainWindow,#PB_Shortcut_Return,#neu) kommt. Und mir nicht klar ist was eigentlich in der #neu
     ; in wirklichkeit ist. und wiso weiss EventMenu() das es der Wert für Enter sein soll?
      If EventMenu() = #neu
        
        ; Hier wird die Prozedur FillGadget() ausgelöst
        FillGadget()
;               
      EndIf

    ; Hier wird abgefragt ob das Programm beendet werden soll
    Case #PB_Event_CloseWindow
      
      ; Das Programm wird beendet
      End
     
    ;Hier wird abgefragt ob der Buttom gedrückt wurde wenn ja das hier ausführen
    Case #PB_Event_Gadget
     
      ;Hier wird abgefragt welcher Buttom gedrückt wurde, wobei immer mit dem Wert von EventGadget verglichen wird.
        Select EventGadget()
        
        ;hier wird EventGadget() mit #ButtonMal verglichen wobei der Wert #ButtonMal von der 
        ;Schaltfläche ButtonGadget(#ButtonMal,0,110,100,20,"*") enthalten ist, woher EventGadget den Wert hat was in der Konstante 
        ;#ButtonMal steht um diese als Wahr zu bezeichnen weiss ich nicht. Wenn dies zutrifft folgendes auslösen.

                Case #ButtonMal
          ;Hier wird die Prozedur rechne() ausgelöst und abgefragt und ich nehme an das es eine verkürzte Form des IF ist die eigentlich
          ;heisst wenn #True gleich 1 (also wahr) ist folgendes auslösen.
          If rechne()
          
          ; hier wird die Meldung richtiges Resultat ausgegeben.
            MessageRequester ("Nachricht", "Super gut gemacht", #PB_MessageRequester_Ok)
            
          ; hier wird wenn die Abfrage nicht zutrifft folgendes ausgelöst  
          Else
            
            ;Hier wird die Meldung Falsch ausgegen.
            MessageRequester ("Nachricht", "Aber auch so was, tz tz tz....", #PB_MessageRequester_Ok)
          EndIf
      EndSelect
     
  EndSelect
;Hier wird die Schlaufe abgebrochen wenn ich das rote kreuz im Fenster anklicke. Wieso es das noch braucht ist mir nicht ganz klar 
;könnte doch hier auch forever haben, und es müsste immer oben in der Abfrage aufhören, tut es aber nicht deswegen habe ich es noch
;so gemacht. aber warum weiss ich nicht.
Until EventID = #PB_Event_CloseWindow
End 

Verfasst: 26.04.2007 12:41
von edel
Ueber WaitwindowEvent bekommst du ein Event fuer ein Gadget oder Menu
(Shortcuts haben eine Menue ID), danach wird mit Hilfe der Funktionen
EventGadget() oder EventMenu() das Gadget oder Menu abgefragt , welches
das Event abgesetzt hat, ist dieser gleich rutscht du in die If Abfrage.

Vieles davon ist aber auch gut beschrieben in der Hilfe zu finden. Einfach
mal durchblaettern ;-)

Verfasst: 26.04.2007 13:41
von duli
:oops: Danke Edel
Natürlich habe ich in der Hilfe tüchtig am Bildschirm gelesen (wäre aber sehr froh gewesen es gäbe das Teil als PDF. Den der Versuch es zu drucken ist bei mir kläglich gescheitert), aber da steht so viel und oft, das gehört zu dem und dann muss ich dort wieder nachsehen, kaum bin ich dort habe aber dann das Vorherige bereits wieder aus den Augen (Leider besitzte ich keine drei Bildschirme) wenn ich dort weiter lese dann wieder mit dem.
Als ich das mit der Enterabfrage versucht habe, bin ich durch mehrere Tutorials und die Hilfe intensive gegangen, wurde aber nicht sehr schlau daraus. Und das Resultat des ersten Anlaufs hast du ja gesehen.
Leider komme ich nicht aus der Ecke der Codeschreiber, sondern habe lange das meiste mit einer Datenbank gelöst, somit meine ich zu verstehen was es können muss und wie es von statten gehen soll, aber sachen die für Programmierer klar sind, bringen mich zur Zeit immer wieder fast zum Verzweifeln. Aber dank so engagierten HelferInnen die es hier hat, kann ich immer wieder aufatmen und mich freuen, und immer wieder etwas dazu lernen. :allright:
Danke für euere Geduld.

Ich erkläre diese Frage als für mich Beantwortet. Danke euch recht herzlich aber es wird bestimmt nicht lange gehen bis ich wieder mal ne Frage habe.

Duli