Growbook, Cannabis, Notizbuch, Growbuch, Pflanzenzucht, Samenbank, Seedbank, Software, Stammbaum, Kreuzen, züchten,growen,anbauen,News,GIB,Lux,Omega,Mars, Dünger,BioBizz,Hesi,Athena,
die Software für deinen Anbau

Willkommen

Tutorial 2: Buttons und Events

The MaxGUI Beginner Tutorial Series - Tutorial 2: Buttons und Events 
(c) Assari Dec 22 2005
Ins Deutsche übersetzt von simi

Gadgets und Events sind etwas Zentrales von MaxGUI. Unglücklicherweise können wir nicht eines ohne das andere verstehen. Was ich hier versuche, ist in beide Themen langsam einzuführen. Ich nehme an, dass du mein erstes Tutorial über CreateWindow gelesen hast und dass du auch grundsätzliche Sachen weisst.

Starten wir mit dem Button-Gadget, etwas Vertrautes. (auf XP, wie auch auf Mac oder Linux)

   

Superstrict

Import MaxGui.Driver

Local MyWindow:TGadget=CreateWindow("Button-Beispiel", 200,200,320,240)
Local MyButton:TGadget=CreateButton("Klick-Mich",140,60,80,40, MyWindow)

Repeat
 WaitEvent()
Until EventID()=EVENT_WINDOWCLOSE

End


Kopiere und füge obigen Code in die MaxIDE ein und starte das Programm. Du solltest folgendes sehen (für Windows XP User):

    Tut2 1


Du kannst auf den Button klicken, aber es passiert nichts aussergewöhnliches. Später werden wir dazu kommen.

Jetzt werden wir uns anschauen, was diese Codezeilen bedeuten.

    SuperStrict


Im vorherigen Tutorial habe ich die Sachen einfach gehalten und den BlitzMax-Befehl SuperStrict nicht verwendet. Von jetzt an wird er in jedem Beispiel vorhanden sein. Das einzige was wir im jetzigen Zeitpunkt wissen müssen, ist dass dieser Befehl BlitzMax sehr strikt macht, wie wir unsere Variablen definieren. Glaub mir, dieser Befehl am Anfang des Codes erspart eine Menge Ärger.

Ich will den CreateWindow-Befehl nicht mehr erklären, weil dies schon im vorherigen Tutorial geschehen ist. Die Funktion, die uns interessiert ist CreateButton.

    Local MyButton:TGadget=CreateButton("Klick-Mich",140,60,80,40, MyWindow)


Der obige Code erstellt einen Button und zeigt ihn im Fenster an, das wir gerade vor dieser Linie erstellt haben. Das Zentrale Stück ist hier die Funktion CreateButton.

Wenn wir in die Hilfe schauen, finden wir folgende Syntax:

Function CreateButton:TGadget(label$,x,y,w,h,group:TGadget,style=BUTTON_PUSH)


Wie du sehen kannst, hat die CreateButton-Funktion fast die gleichen Parameter wie CreateWindow.

  • Die einzelnen Parameter haben folgende Bedeutung
    • label$ ist der Text, welcher angezeigt wird
    •  x,y sind die Koordinaten, wo der Button im Fenster erscheinen soll
    • w,h sind die Breite (width) und Höhe (height) vom Button
    • group:TGadget ist die Gruppe, zu welcher der Button gehört. Der Gadget, zu welchem der Button gehört, wird Parent (Eltern) genannt
    • style ist der Style des Buttons. BUTTON_PUSH ist als Standard gesetzt

Wie CreateWindow, gibt auch CreateButton ein TGadget-Object zurück. (siehe CreateButton:TGadget)

Einführung in die Events

Bevor wir mit der CreateButton-Funktion fortfahren, sprechen wir ein bisschen über Events.

Blitzmax (und auch Blitzplus) basiert auf Events. Das Eventsystem erlaubt dem Programm auf Ereignisse zu reagieren, welche geschahen. Beispiele von Events (Ereignissen):

  • Der Benutzer drückt die linke Maustaste
  • Der Benutzer bewegt ein Fenster
  • Der Benutzer gibt etwas mit seiner Tastatur ein

Eine der Funktion zum handhaben der Events heisst WaitEvent(). Schauen wir uns ein Codeschnippsel aus einem frühren Beispiel an:

    Repeat
 WaitEvent()
Until EventID()=EVENT_WINDOWCLOSE

End


Ich hoffe du bist vertraut mit der Repeat Until-Schleife. Grundsätzlich wird BlitzMax WaitEvent()
so lange wiederholen, bis EventID() den "Fensterschliessevent" zurückgibt. (EVENT_WINDOWCLOSE)

WaitEvent()
prüft ob ein Event aufgetreten ist. Wichtig zu Merken ist, dass WaitEvent() so lange wartet, bis ein Event auftritt, und erst dann mit der nächsten Codezeile fortfährt.

Die EventID()-Funktion gibt die ID des Events zurück, die dann mit EVENT_WINDOWCLOSE verglichen wird. Stimmen sie überrein, verlässt das Programm die Schleife.

Grundsätzlich kann man also sagen, dass der Code folgendes macht:

  • Auf einen Event warten. Wenn etwas passiert zur nächsten Zeile gehen.
  • Überprüfen, ob der Event ein EVENT_WINDOWCLOSE war.
  • Wenn ja, Schleife verlassen, wenn nein, auf den nächsten Event warten.

Jetzt können wir das obige Programm in einem leicht anderem Weg schreiben:

   

Superstrict

Import MaxGui.Driver


Local MyWindow:TGadget=CreateWindow("Button-Beispiel", 200,200,320,240)
Local MyButton:TGadget=CreateButton("Klick-Mich",140,60,80,40, MyWindow)

Repeat
  WaitEvent()
  Select EventID()
  Case EVENT_WINDOWCLOSE
     End
   End Select
Forever


Anstelle der Repeat/Until-Schleife, benutzen wir nun eine Repeat/Forever-Schleife, die, wie der Name schon sagt, sich für "immer" wiederhohlt.

Wir benutzen jetzt auch das Select/Case
-Konstrukt. Im obigen Beispiel wählen (Select) wir den Wert von EventID() aus und vergleichen (Case) ihn mit dem Event EVENT_WINDOWSCLOSE. Wenn ID und Event übereinstimmen, wird das Programm beendet (end).

Jetzt, wo wir obiges Konstrukt verstehen, können wir mehrere EventIDs überprüfen:

   

Superstrict

Import MaxGui.Driver

Local MyWindow:TGadget=CreateWindow("Button-Beispiel", 200,200,320,240)
Local MyButton:TGadget=CreateButton("Klick-Mich",140,60,80,40, MyWindow)

Repeat
  WaitEvent()
  Select EventID()
  Case EVENT_WINDOWCLOSE
     End
  Case EVENT_GADGETACTION
    SetGadgetText(MyButton,"Geklickt!")
   End Select
Forever


Beachte, dass wir jetzt zwei Fälle zu prüfen haben, EVENT_WINDOWCLOSE und  EVENT_GADGETACTION.
EVENT_WINDOWCLOSE wird ausgelöst, wenn der Benutzer das Fenster schlliesst. EVENT_GADGETACTION wird ausgelöst, wenn der Benutzer auf unser Button klickt.

Kopiere den obigen Code und führe ihn aus. Du kannst sehen, dass sich der Text auf dem Button ändert, wenn du auf ihn klickst. Dies wird durch die MaxGUI-Funktion SetGadgetText gemacht.

    Tut2 1
Tut2 2


Errinnern wir uns, was wir so weit gelernt haben.

Events sind Ereignisse, auf die unser BlitzMax-Programm reagieren kann.
Fast alle MaxGUI-Gadgets senden Events. Gadgets sind Objekte in MaxGUI. Beispiele für Gadgets sind

  • Fenster via CreateWindow erstellt
  • Buttons via CreateButton erstellt

Als Veranschaulichung, probiere dieses Programm aus:

   

Superstrict

Import MaxGui.Driver

Local MyWindow:TGadget=CreateWindow("Button-Beispiel", 200,200,320,240)
Local MyButton:TGadget=CreateButton("Klick-Mich",140,60,80,40, MyWindow)

Repeat
  WaitEvent()
  Select EventID()
  Case EVENT_WINDOWCLOSE
     End
  Case EVENT_GADGETACTION
    SetGadgetText(MyButton,"
Geklickt!")
    SetGadgetText(MyWindow,"Button geklickt!")
   End Select
Forever


Beachte das Bild vor dem Klick und nachher. Der Fenstertitel wechselt infolge unseres zweiten SetGadgetText-Befehl, welcher den Text Button geklickt! an den MyWindow-Gadget sendet. Ein Button sowie ein Fenster (Window) ist ein Gadget.

    Tut2 1
Tut2 3

    Local MyWindow:TGadget=CreateWindow("Button-Beispiel", 200,200,320,240)
Local MyButton:TGadget=CreateButton("Klick-Mich",140,60,80,40, MyWindow)


Beide Gadgets, MyWindow und MyButton, die wir erstellt haben, sind vom Type Gadget. Das kannst du an der Syntax erkennen.

    Local GadgetName:TGadget= ....


Local sagt uns, dass wir eine lokale Variable erstellen, die zwar begrenzt verfügbar aber schneller ist. Dann geben wir den Namen dieser Variable an und zum Schluss den Typ, hier :TGadget, denn wir wollen eine Variable vom Typ Gadget haben.
Zum Zeigen, wie diese Variablendekleration funktioniert, erstellen wir mit den folgenden drei Zeilen Code eine Integer (Ganzzahl), Float (Kommazahl) und eine String (Text) Variable.

    Local MyNumber:Int
Local A:Float = 1.234
Local
Text:String


Es ist nicht die Aufgabe dieses Tutorials, die Variablendeklaration zu behandeln. Aber für MaxGUI ist es wichtig die Variablen explizit zu deklarieren.

    Local MyWindow=CreateWindow("Button-Beispiel", 200,200,320,240)


Der obige Code funktioniert zwar, aber er ist falsch und wird dir später ein Bein stellen. Deshalb deklariere sie so:

    Local MyWindow:TGadget=CreateWindow("Button-Beispiel", 200,200,320,240)


Wenn du SuperStrict am Anfang deines Codes benutzt, wird BlitzMax diese Fehler melden.

EventSource

Bis jetzt hat unser Programm zwichen den IDs EVENT_WINDOWCLOSE und EVENT_GADGETACTION unterschieden. Nun lass uns sehen, wie wir mit zwei Buttons umgehen.

   

Superstrict

Import MaxGui.Driver

Local MyWindow:TGadget=CreateWindow("Zwei-Button-Beispiel", 200,200,320,240)
Local Button1:TGadget=CreateButton("Eins",140,40,80,40, MyWindow)
Local Button2:TGadget=CreateButton("Zwei",140,100,80,40, MyWindow)

Repeat
  WaitEvent()
  Select EventID()
  Case EVENT_WINDOWCLOSE
     End
  Case EVENT_GADGETACTION
    Select EventSource()
      Case Button1
         SetGadgetText(Button1,"Nr. 1 geklickt")
      Case Button2
         SetGadgetText(Button2,"Nr. 2 geklickt")
      End Select
   End Select
Forever


Wie du sehen kannst erlaubt uns EventSource() zu erfahren, welcher Gadget den Event erzeugt hat. Das können wir wieder mit einem
Select/Case-Konstrukt auswerten.

    Tut2 4


Wiederhohlen wir, was wir in diesem Tutorial gelernt haben.

  • Wir haben gelernt, dass wir Gadgets erstellen können (z.B. mit CreateButton) und dass diese Events erzeugen (z.B. bei einem Mausklick)
  • Diese Events können können dann vom BlitzMax-Code via Funktionen wie WaitEvent(), EventSource() und Standardkonstrukten wie Schleifen und Select/Case verarbeitet werden.

Es gibt noch mehr zu lernen, deshalb gehen wir doch zum nächsten Tutorial.