Gadgets verwenden

Anfängerfragen zum Programmieren mit PureBasic.
PB42
Beiträge: 243
Registriert: 13.10.2005 03:21

Gadgets verwenden

Beitrag von PB42 »

Hallo,

ich übe heute zum ersten Mal den Einsatz von Gadgets. Mein Code sieht bisher so aus:

Code: Alles auswählen

OpenWindow(0,300,300,500,250,#PB_Window_SystemMenu|#PB_Window_screencentered|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget,"") And CreateGadgetList(WindowID(0))

arial=LoadFont(#PB_any, "Arial", 15, #PB_Font_Highquality)

x = Random(10) + 1
y = Random(10) + 1

z = x + y

StringGadget(1,180,80,50,30,"")
ButtonGadget(2,240,80,50,30,"OK")
SetGadgetState(1,2)
ActivateGadget(1)

StartDrawing(WindowOutput())
FrontColor(0,0,200)
DrawingMode(1)
Locate(50,10)
DrawingFont(UseFont(arial))
DrawText("")

Locate(50, 80)
DrawText(Str(x) + "   +   " + Str(y) + "   = ")
StopDrawing()

Repeat
EventID = WaitWindowEvent()
Until EventID = #PB_EventCloseWindow
Das Ergebnis der Rechenaufgabe soll eingetragen und hinterher auf richtig oder falsch geprüft werden. Wie erreiche ich nun, daß die eingegebene Lösung mit OK weiterverarbeitet wird? Wenn mir das einmal gezeigt wird, müßte ich das hoffentlich verstanden haben. Danke!

PB42
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

ändere mal die Repeat-Schleife wie folgt ab:

Code: Alles auswählen

Repeat
  
  EventID = WaitWindowEvent()
  GadgetID = EventGadgetID()
  
  Select EventID
    
    Case #PB_Event_Gadget
      
      Select GadgetID
        
        Case 2 ; Dein OK-Button
          
          If Val(GetGadgetText(1))=x+y
            MessageRequester("", "Richtisch!")
          Else
            MessageRequester("", "Möööp!")
          EndIf
          
      EndSelect
      
  EndSelect
  
Until EventID = #PB_EventCloseWindow
Grüße ... Kiffi
PB42
Beiträge: 243
Registriert: 13.10.2005 03:21

Beitrag von PB42 »

Das klappt! :) Auf sowas wie

Code: Alles auswählen

Case #PB_Event_Gadget 
wäre ich nie gekommen, weil ich bisher immer davon ausging, daß Case nur mit Zahlen belegt wird, also Case 1, Case 2 usw. Ohne Forum könnte ich PB voll einpacken. Vielen Dank Kiffi!

PB42
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 »

Case funktioniert mit allen Werten, mit denen Du z.B. auch bei If vergleichen kannst, also auch mit Strings

Case "ja"
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
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Hallo PB42,

hier noch'n kleiner Hinweis: Verwende für die Gadgets, die Du in Deinem
Projekt einsetzt, aussagekräftige Konstantennamen.

Am wenigsten Probleme gibt es, wenn Du eine Enumeration dafür
verwendest

Code: Alles auswählen

Enumeration
  #frmMain
  #txtEingabe
  #cmdOK
EndEnumeration
Die Enumeration sorgt dafür, dass die darin stehenden Konstanten
automatisch durchnumeriert werden.

Somit würde dann Dein Code wie folgt aussehen:

Code: Alles auswählen

Enumeration
  #frmMain
  #txtEingabe
  #cmdOK
EndEnumeration

OpenWindow(#frmMain,300,300,500,250,#PB_Window_SystemMenu|#PB_Window_screencentered|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget,"") And CreateGadgetList(WindowID(#frmMain))

arial=LoadFont(#PB_any, "Arial", 15, #PB_Font_Highquality)

x = Random(10) + 1
y = Random(10) + 1

z = x + y

StringGadget(#txtEingabe,180,80,50,30,"")
ButtonGadget(#cmdOK,240,80,50,30,"OK")

StartDrawing(WindowOutput())
FrontColor(0,0,200)
DrawingMode(1)
Locate(50,10)
DrawingFont(UseFont(arial))
DrawText("")

Locate(50, 80)
DrawText(Str(x) + "   +   " + Str(y) + "   = ")
StopDrawing()

Repeat
 
  EventID = WaitWindowEvent()
  GadgetID = EventGadgetID()
 
  Select EventID
   
    Case #PB_Event_Gadget
     
      Select GadgetID
       
        Case #cmdOK ; Dein OK-Button
         
          If Val(GetGadgetText(#txtEingabe))=x+y
            MessageRequester("", "Richtisch!")
          Else
            MessageRequester("", "Möööp!")
          EndIf
         
      EndSelect
     
  EndSelect
 
Until EventID = #PB_EventCloseWindow
Du siehst: Dadurch wird das Programmieren ein wenig übersichtlicher.
Gerade wenn Du viele Gadgets verwendest, wirst Du ansonsten
irgendwann nicht mehr durchblicken, was Gadget 32 oder Gadget 89 ist.

Nur so'n kleiner Tipp...

Grüße ... Kiffi
PB42
Beiträge: 243
Registriert: 13.10.2005 03:21

Beitrag von PB42 »

Auch interessant, Danke, aber ehe ich mit mehr Gadgets arbeite, stellen sich mir erstmal ganz viele andere Fragen.

1) Z.B. steht unten in der Schleife

Code: Alles auswählen

Until EventID = #PB_Eventclosewindow
aber wenn man die Schleife mit Eingaben wie

Code: Alles auswählen

IF EventID = #PB_key_F1
bereichern will, klappt das Null.

PB42
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

PB42 hat geschrieben:aber wenn man die Schleife mit Eingaben wie

Code: Alles auswählen

IF EventID = #PB_key_F1
bereichern will, klappt das Null.
das ist verständlich, denn wenn man mal in die Online-Hilfe schaut, dann
gibt's nur folgende Ereignisse, auf die (Wait)WindowEvent reagiert:
#PB_Event_Menu : ein Menü wurde ausgewählt
#PB_Event_Gadget : ein Gadget wurde gedrückt
#PB_Event_CloseWindow : das Schließgadget vom Fenster wurde gedrückt
#PB_Event_Repaint : der Fensterinhalt wurde zerstört und muss neu gezeichnet werden (nützlich für 2D Grafik-Operationen)
#PB_Event_SizeWindow : das Fenster wurde in der Größe verändert
#PB_Event_MoveWindow : das Fenster wurde verschoben
#PB_Event_ActivateWindow : das Fenster wurde aktiviert (hat den Fokus erhalten)
Um Tastaturabfragen zu machen, gehst Du wie folgt vor:

Code: Alles auswählen

Enumeration
  ...
  #mnu_F1
EndEnumeration
 
OpenWindow(...

AddKeyboardShortcut(#frmMain, #PB_Shortcut_F1, #mnu_F1)

Repeat
  
  EventID = WaitWindowEvent()
  GadgetID = EventGadgetID()
  MenuID = MenuID()

  Select Case EventID
    
    Case #PB_Event_Menu
      
      Select MenuID
        
        Case #mnu_F1
          
          ; Here we are!
          
      EndSelect
      
  EndSelect
  
Until ...
Alles weitere findest Du hierzu in der Online-Hilfe.

//Edit:

sorry, Du kannst natürlich auch die Ereignisse "Taste gedrückt"
(#WM_KEYDOWN) und "Taste losgelassen" (#WM_KEYUP) abfragen. Das
sähe dann so aus:

Code: Alles auswählen

Repeat
  
  EventID = WaitWindowEvent()
  GadgetID = EventGadgetID()
  
  Select EventID
    
    Case #WM_KEYUP
      
      Select EventwParam()
        
        Case #VK_F1
          
          ; Here we are
          
      EndSelect
    
    Case #PB_Event_Gadget

      ...

Grüße ... Kiffi
PB42
Beiträge: 243
Registriert: 13.10.2005 03:21

Beitrag von PB42 »

Mit event_Menu habe ich mich bisher noch gar nicht beschäftigt, aber trotzdem natürlich vielen Dank für Deine umfangreiche Mühe. Ich probiere das morgen mal aus.

PB42
Antworten