Tutorial
Eventsystem
von MOD | Seite 2 von 5 |
Nun, ganz so leicht ist es nicht; es erfordert ein bisschen Vorarbeit. Für das Erkennen von Eingaben wie z.B. Mausklicks gibt es nämlich noch ein zweites Stichwort und das lautet Eventsystem. Also fangen wir mal damit an.
Wir brauchen also einen Type, der Events erkennt und auswertet. Um es nicht unnötig zu verkomplizieren, nehmen wir an, dass wir nur Fenster mit Buttons brauchen.
Buttons - die müssen wir natürlich auch definieren und dafür eignet sich auch ein Type:
Type ButtonType
As Integer btnsx, btnsy, btnex, btney
As Sub onClick
End Type
Der ButtonType enthält die Start- und Endwerte der Buttongröße und eine Variable, die die Sub entgegen nimmt, die aufgerufen werden muss, wenn der Button geklickt wird.
Jetzt wo wir das haben, kümmern wir uns endlich um das UDT für unsere Events:
Type EventType
Declare Function windowCreate(x As Integer, y As Integer, wndClick As Sub) As Integer
Declare Function buttonCreate(startx As Integer, starty As Integer, endx As Integer, endy As Integer, onButtonClick As Sub) As Integer
Declare Static Sub eventSub(temp As Any Ptr)
As Sub windowClick
As Integer wndx, wndy
As Integer buttonZaehler
As Integer terminate
As ButtonType Ptr newButtonArray
As Any Ptr mutex
As Any Ptr eventSubThread
End Type
Wir haben also eine Function windowCreate, die das Fenster erstellen soll und eine Function buttonCreate, die den Button erstellt.
Des Weiteren finden wir die Sub eventSub. Diese ist Static, weil wir sie als Eventhandler in einem Thread aufrufen wollen und das innerhalb eines Types nur so geht. Sie hat auch einen Übergabeparameter vom Typ Any Ptr, den wir als temporäre Übergabe der eigenen Type-Werte brauchen werden.
Die Variable windowClick nimmt beim Erstellen des Fensters die Sub (d.h. einen Pointer darauf) entgegen, die bei Anklicken des Fensters aufgerufen werden soll.
wndx und wndy speichern die Fenstergröße, aber was hat das für einen Hintergrund. Das Fenster könnte man schließlich auch mit Screen oder ScreenRes erstellen. Stimmt, aber wir wollen dem User Arbeit abnehmen, denn jeder erstellte Button muss ja innerhalb des Fensters liegen und ohne diesen Umweg müsste der User nicht nur das Fenster erstellen, sondern auch die Variablen zum Prüfen füllen, wohlgemerkt mit den richtigen Werten.
buttonZaehler muss wohl nicht weiter erläutert werden.
terminate hat die Aufgabe, den Eventhandler, also den Thread, zu beenden.
Der ButtonType Ptr newButtonArray soll ein dynamisches Array sein. Da FreeBASIC (noch) keine dynamischen Arrays in Types erlaubt, muss da eine andere Lösung her. Dazu später mehr.
eventSubThread wird für den Thread gebraucht und das Mutex zur Sicherheit, da GetMouse und InKey nicht threadsafe sind.
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|