Bitte um Hilfe den Programcode zu bereinigen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
duli
Beiträge: 75
Registriert: 17.04.2007 11:39

Bitte um Hilfe den Programcode zu bereinigen

Beitrag 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 
Man kann nicht wissen was man nicht weiss..
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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 
Benutzeravatar
duli
Beiträge: 75
Registriert: 17.04.2007 11:39

Beitrag 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
Man kann nicht wissen was man nicht weiss..
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Code: Alles auswählen

SetActiveGadget(#StringZahl3)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
duli
Beiträge: 75
Registriert: 17.04.2007 11:39

Beitrag 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
Man kann nicht wissen was man nicht weiss..
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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

Benutzeravatar
duli
Beiträge: 75
Registriert: 17.04.2007 11:39

Beitrag 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 
Man kann nicht wissen was man nicht weiss..
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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 ;-)
Benutzeravatar
duli
Beiträge: 75
Registriert: 17.04.2007 11:39

Beitrag 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
Man kann nicht wissen was man nicht weiss..
Antworten