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):
![]() |
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.
![]() |
![]() |
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.
![]() |
![]() |
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.
![]() |
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.