PureBasic: GUI-Programmierung

Aus Wikibooks

Dieses Kapitel soll eine Einführung in die GUI-Programmierung mit PureBasic bieten. Dabei sollen nicht alle Befehle behandelt werden, wenn man jedoch die Grundlagen verstanden hat, kann man sich die restlichen Befehle je nach Bedarf über die Referenz aneignen.

; Listing 34: Ein Fenster

OpenWindow(0, 0, 0, 200, 200, "Ein Fenster", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
TextGadget(0, 0, 0, 100, 20, "TextGadget")

Repeat : Until WindowEvent() = #PB_Event_CloseWindow

Nach der Kompilierung wird ein simples Fenster mit dem Text TextGadget dargestellt, das nichts anderes tut außer über "x" geschlossen zu werden.

Über OpenWindow() wird das Fenster geöffnet, wobei die Argumente darstellen, wie das Fenster dargestellt werden soll. Von Links, nach Rechts: Fensternummer, Position des Fensters in x- und in y-Richtung, Breite und Höhe, sowie der Titel. Die x-Achse verläuft von Links nach Rechts, die y-Achse von Oben nach Unten. Die beiden Konstanten sind sogenannte Flags, die über ein binäres "Oder" verknüpft werden. Es ist nicht wichtig zu verstehen was das ist, wichtig ist nur, dass man so die Flags trennt. Die erste bedeutet, dass das Fenster in der Bildschirmmitte angezeigt wird und die zweite sorgt dafür, dass das Schließensymbol angezeigt wird. In der nächsten Zeile ist ein sogeanntes Textgadget. Alles in Fenstern wird über Gadgets dargestellt. Die Argumente sind die gleichen, wie beim Fenster. Weitere Flags für Fenster und die jeweiligen Gadgets stehen in der Referenz. Die letzte Zeile ist eine Repeat-Schleife, wobei die Zeilenorientierung des Compilers über den Doppelpunkt umgangen wird. Durch ihn wird es möglich, mehrere Befehl in eine Zeile zu schreiben, was insbesondere bei solch kurzen Befehlen Sinn macht. Der Ausdruck hinter Until sorgt dafür, dass das Fenster erst geschlossen wird, genauer gesagt, dass das Programm erst beendet wird, denn darunter sind keine Befehle mehr, wenn das "x" geklickt wird. Dieses erzeugt nämlich ein sogenanntes Event, dass eine dynamische Programmsteuerung möglich macht. WindowEvent() gibt einen Wert zurück, wenn ein Event ausgelöst, der durch eine Konstante repräsentiert wird. In diesem Fall wurde also beim Klicken auf das "x" ein Event ausgelöst, das durch die Konstante #PB_Event_CloseWindow repräsentiert wird. Der Ausdruck wird wahr und die Schleife beendet.

Buttons[Bearbeiten]

Buttons werden ebenfalls über Gadgets repräsentiert.

; Listing 35: Button

OpenWindow(0, 0, 0, 200, 200, "Ein Fenster", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
TextGadget(0, 0, 0, 200, 20, "TextGadget")
ButtonGadget(1, 0, 30, 100, 30, "Klick mich!")

Repeat
  Select WindowEvent()
    Case #PB_Event_CloseWindow
      End
    Case #PB_Event_Gadget
      If EventGadget() = 1
        SetGadgetText(0, "Button geklickt")
      EndIf
  EndSelect
ForEver

Es wird genauso wie in Listing 34 ein Fenster geöffnet, wobei noch ein Button hinzugefügt wird. Die Gadgetnummer muss dabei natürlich eine andere als die vom Textgadget sein. Wenn man nun auf den Button klickt, ändert sich der Inhalt des Textgadgets.

In der Repeat-Schleife, wird wieder auf Events reagiert. Neu ist zuerst das Schlüsselwort ForEver, dass dafür sorgt, dass die Repeat-Schleife nie abbricht, außer durch Break oder wie in diesem Fall durch End. Man mach sich hier die Fallunterscheidung zunutze: WindowEvent() gibt wieder einen Wert zurück, wenn ein Wert ausgelöst wird, der durch Select unterschieden wird. Wenn das Fenster geschlossen wurde, wird das Programm durch das Schlüsselwort End beendet. Wen jedoch ein Event von einem Gadget ausgelöst wurde, wird der Wert #PB_Event_Gadget zurückgegeben. Mit dem Befehl EventGadget() wird die Gadgetnummer des auslösenden Gadgets zurückgegeben. Wenn es der Button war, wird über den Befehl SetGadgetText() der Text des Textgadgets geändert, wobei die Argumente die Gadgetnummer und der neue Text sind.

Stringgadgets[Bearbeiten]

Bisher passierte noch nicht viel. Interessant wird es, sobald Stringgadgets ins Spiel kommen, mit denen man Benutzereingaben empfangen kann.

; Listing 36: Stringgadgets

OpenWindow(0,200,200,200,150,"Idealgewicht",#PB_Window_SystemMenu|#PB_Window_ScreenCentered) 
StringGadget(0,0,0,200,25,"Körpergröße eingeben in cm") 
StringGadget(1,0,35,200,25,"Geschlecht (m/w)") 
ButtonGadget(2,0,75,200,30,"Idealgewicht ausrechnen")
StringGadget(3,0,115,200,25,"Idealgewicht", #PB_String_ReadOnly)

Repeat
  Select WindowEvent()
    Case #PB_Event_CloseWindow
      End
    Case #PB_Event_Gadget
      If EventGadget() = 2
        If GetGadgetText(1) = "m" 
          SetGadgetText(3, StrF((ValF(GetGadgetText(0))-100) * 0.93) + " bis " +StrF((ValF(GetGadgetText(0))-100)*0.97) + " kg")
        ElseIf GetGadgetText(1) = "w"
          SetGadgetText(3, StrF((ValF(GetGadgetText(0))-100) * 0.88) + " bis " +StrF((ValF(GetGadgetText(0))-100)*0.92) + " kg")
        Else
         MessageRequester("Fehler","Bitte echtes Geschlecht eingeben")
       EndIf
     EndIf
  EndSelect
ForEver

Abermals wird ein Fenster geöffnet. Neu sind die Eingabefelder, die durch Stringgadgets repräsentiert werden. In diese kann man Strings eingeben, die mit GetGadgetText() abgerufen werden, wobei das Argument die Gadgetnummer ist. GetGadgetText() ist also das Gegenstück zu SetGadgetText().

Das Programm tut nichts anderes, als das Idealgewicht anhand von Größe und Geschlecht auszurechnen. Sobald der Button gedrückt wurde (EventGadget() = 2), wird mit den genannten Befehlen abgerufen welches Geschlecht eingegeben wurde und dann mit der Körpergröße das Idealgewicht ausgerechnet, das mit SetGadgetText() im unteren Stringgadget angezeigt wird. Die Konstante beim unteren Stringgadget verhindert, dass in dieses Strings eingegeben werden können, es ist also lediglich zum Anzeigen von Strings da. Der letzte neue Befehl ist MessageRequester(). Dieser tut nichts anderes, als ein Fenster mit einem Titel und einem Text zu öffnen, das über einen Button geschlossen wird. Das erste Argument ist der Titel, das zweite der Text.

Mit diesen wenigen Beispielen hat man schon einen guten Überlick über die GUI-Programmierung gewonnen. Die wenigen anderen Elemente sind in der PureBasic-Referenz erläutert und können sich bei Bedarf angeeignet werden.

Enumeration und #PB_Any[Bearbeiten]

Bisher wurde den Gadgets und den Fenstern eine Nummer gegeben. Es ist offensichtlich, dass wenn man mit vielen Gadgets arbeitet, dies unübersichtlich werden kann. Es liegt nahe Konstanten zu benutzen, um das Problem zu lösen. Um das Ganze noch einfacher zu gestalten gibt es das Schlüsselwort Enumeration

; Listing 37: Enumeration

Enumeration
  #Window
  #TextGadget
  #ButtonGadget
EndEnumeration

OpenWindow(#Window, 0, 0, 200, 200, "Ein Fenster", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
TextGadget(#TextGadget, 0, 0, 100, 20, "TextGadget")
ButtonGadget(#ButtonGadget, 0, 30, 100, 30, "Klick mich!")

Repeat
 Select WindowEvent()
   Case #PB_Event_CloseWindow
     End
   Case #PB_Event_Gadget
     If EventGadget() = #ButtonGadget
       SetGadgetText(#TextGadget, "Button geklickt")
     EndIf
 EndSelect
ForEver

Durch Enumeration wird den eingeschlossenen Konstanten der Reihe nach ein Wert zugewiesen, angefangen bei 0, die nächste Konstante bekommt die 1 zugewiesen usw. Es ist außerdem möglich einen Startwert festzulegen, indem man ihn hinter Enumeration schreibt, und über das Schlüsselwort Step, wie bei der For-Schleife, die Schrittgröße festzulegen.

Es gibt noch eine weitere Möglichkeit, über die Konstante #PB_Any

; Listing 38: #PB_Any

Window = OpenWindow(#PB_Any, 0, 0, 200, 200, "Ein Fenster", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
TextGadget = TextGadget(#PB_Any, 0, 0, 100, 20, "TextGadget")
ButtonGadget = ButtonGadget(#PB_Any, 0, 30, 100, 30, "Klick mich!")

Repeat
 Select WindowEvent()
   Case #PB_Event_CloseWindow
     End
   Case #PB_Event_Gadget
     If EventGadget() = ButtonGadget
       SetGadgetText(TextGadget, "Button geklickt")
     EndIf
 EndSelect
ForEver

Indem man dem Fenster und dem Gadget die Konstante #PB_Any als Kennnummer übergibt, wird ihnen automatisch eine zugewiesen. Man erwirkt damit, dass der Rückgabewert der Befehle diese Nummer ist.