Hook-System
Übersicht

![]() |
GeeeckoBetreff: Hook-System |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wer kennt das nicht?
Man hat eine sehr große Select-Case Sammlung untereinander, weil man jedes Fenster "abfragen" muss. Aber es interessieren einen nur ganz bestimme Fenster... Das Problem ist nun mehr oder weniger gelöst! Ich habe mir ein Hook-System zusammen gebaut habe, welches Events sortiert. Man kann Filter erstellen, und diese Registrieren. Jeder Filter hat eine Funktion, welche aufgerufen wird, fals ein Event durchkommt. Ein Event wird auf folgende Sachen überprüft: Code: [AUSKLAPPEN] id extra data source x y Das sind alle "Sachen" in einem Event. Man kann so viele Werte wie man möchte hinzufügen. Hier ein Beispiel: Code: [AUSKLAPPEN] 'Treiber Import maxgui.drivers 'Fenster erstellen Global Window:TGadget = CreateWindow("Test-Fenster",0,0,500,500) 'Hook hinzufügen Global MyHook:THookFilter = THookFilter.NormalHook(MyTestHook) MyHook.AddID(EVENT_WINDOWMOVE) MyHook.AddID(EVENT_WINDOWCLOSE) THookSystem.RegisterHook(myhook) 'Schleife Repeat WaitEvent Forever 'Hook-Funktion Function MyTestHook(Event:TEvent) Print Event.toString() End Function Es wird ein Filter erstellt, die Funktion MytestHook zugewiesen und 2 ID´s hinzugefügt. Die Funktion wird also nur aufgerufen, wenn ein Fenster bewegt worden ist, oder geschlossen. Es gibt folgende Funktionen: Code: [AUSKLAPPEN] THookSystem.RegisterHook(Filter:THookFilter) - Registriert einen Filter THookSystem.UnregisterHook(Filter:THookFilter) - Löscht einen Filter Code: [AUSKLAPPEN] THookFilter.AddData(data:int) - Fügt "data" hinzu THookFilter.AddExtra(extra:object) THookFilter.AddSource(source:object) THookFilter.AddID(id:int) THookFilter.AddX(x:int) THookFilter.AddY(y:int) THookFilter.RemoveData() - Löscht die "daten" liste. "data" wird ignoiert THookFilter.RemoveExtra() THookFilter.RemoveID() THookFilter.RemoveX() THookFilter.RemoveY() THookFilter.NormalHook(func(event:TEvent)) - Liefert einen Fitler zurück, der ALLE Events durchlässt Hier der eigentliche Code: Code: [AUSKLAPPEN] Type THookSystem Global HookFilterList:TList Global initED:Int '###Initialisiert das Hooksystem Function Init() THookSystem.HookFilterList = New TList AddHook(EmitEventHook, TempHook) THookSystem.initED = True End Function '###Registriert ein "Hook" Function RegisterHook(HookFilter:THookFilter) If THookSystem.InitED = False Then THookSystem.Init() THookSystem.HookFilterList.AddLast(HookFilter) End Function '###Löscht einen "Hook" Function UnregisterHook(HookFilter:THookFilter) If THookSystem.InitED = False Then THookSystem.Init() THookSystem.HookFilterList.FindLink(HookFilter).Remove() End Function End Type '###Diese Funktion leitet die Events nur weiter Function TempHook:Object(id:Int, data:Object, context:Object) If THookSystem.InitED = False Then THookSystem.Init() Local event:TEvent = TEvent(data) '###HookFilters durchgehen und vergleichen For Local HookFilter:THookFilter = EachIn THookSystem.HookFilterList Local okay:Int = True 'Wird auf false gesetzt, fals eine Option nicht übereinstimmt '###Data If HookFilter.data_list And okay Then For Local data_object:THookFilterObject = EachIn HookFilter.data_list If data_object._int <> event.data Then okay = False Else okay = True Exit EndIf Next End If '###Extra If HookFilter.extra_list And okay Then For Local extra_object:THookFilterObject = EachIn HookFilter.extra_list If extra_object._object <> event.extra Then okay = False Else okay = True Exit EndIf Next EndIf '###ID If HookFilter.id_list And okay Then For Local id_object:THookFilterObject = EachIn HookFilter.id_list If id_object._int <> event.id Then okay = False Else okay = True Exit EndIf Next End If '###Source If HookFilter.source_list And okay Then For Local source_object:THookFilterObject = EachIn HookFilter.source_list If source_object._object <> event.source Then okay = False Else okay = True Exit EndIf Next End If '###X If HookFilter.x_list And okay Then For Local x_object:THookFilterObject = EachIn HookFilter.x_list If x_object._int <> event.x Then okay = False Else okay = True Exit EndIf Next End If '###Y If HookFilter.y_list And okay Then For Local y_object:THookFilterObject = EachIn HookFilter.y_list If y_object._int <> event.y Then okay = False Else okay = True Exit EndIf Next End If '###Wenn okay = true ist, dann das event weiterleiten If okay Then HookFilter.func(event) Next End Function '###Informationen für das HookSystem welche Events weitergeleitet sollen und welche nicht Type THookFilter '###Listen welche übereinstimmen müssen (wenn die liste NULL ist, wird die "gruppe" ignoiert) Field data_list:TList Field extra_list:TList Field id_list:TList Field source_list:TList Field x_list:TList Field y_list:TList Field func(event:TEvent) 'Funktion die aufgerufen werden soll '###Fügt etwas zu "data" hinzu Method AddData(data:Int) If Not Self.data_list Then Self.data_list = New TList Local data_object:THookFilterObject = New THookFilterObject data_object._int = data Self.data_list.AddLast(data_object) End Method '###Fügt etwas zu "extra" hinzu Method AddExtra(extra:Object) If Not Self.extra_list Then Self.extra_list = New TList Local extra_object:THookFilterObject = New THookFilterObject extra_object._object = extra Self.extra_list.AddLast(extra_object) End Method '###Fügt etwas zu "source" hinzu Method AddSource(source:Object) If Not Self.source_list Then Self.source_list = New TList Local source_object:THookFilterObject = New THookFilterObject source_object._object = source Self.source_list.AddLast(source_object) End Method '###Fügt etwas zu "id" hinzu Method AddID(id:Int) If Not Self.id_list Then Self.id_list = New TList Local id_object:THookFilterObject = New THookFilterObject id_object._int = id Self.id_list.AddLast(id_object) End Method '###Fügt etwas zu "id" hinzu Method AddX(x:Int) If Not Self.x_list Then Self.x_list = New TList Local x_object:THookFilterObject = New THookFilterObject x_object._int = x Self.x_list.AddLast(x_object) End Method '###Fügt etwas zu "y" hinzu Method AddY(y:Int) If Not Self.y_list Then Self.y_list = New TList Local y_object:THookFilterObject = New THookFilterObject y_object._int = y Self.y_list.AddLast(y_object) End Method '###Löscht die "data"-liste Method RemoveData() Self.data_list = Null End Method '###Löscht die "extra" liste Method RemoveExtra() Self.extra_list = Null End Method '###Löscht die "id" liste Method RemoveID() Self.id_list = Null End Method '###Löscht die "source" liste Method RemoveSource() Self.source_list = Null End Method '###Löscht die "x" liste Method RemoveX() Self.x_list = Null End Method '###Löscht die "y" liste Method RemoveY() Self.y_list = Null End Method '###Erstellt einn Hook, zu dem ALLE Events weitergeleitet werden Function NormalHook:THookFilter(func(event:TEvent)) Local HookFilter:THookFilter = New THookFilter HookFilter.data_list = Null HookFilter.extra_list = Null HookFilter.id_list = Null HookFilter.source_list = Null HookFilter.x_list = Null HookFilter.y_list = Null HookFilter.func = func Return HookFilter End Function End Type '###Hier drin können Werte in einem object abgepsiehcert werden Type THookFilterObject Field _int:Int Field _string:String Field _object:Object End Type ich hoffe es gefällt so einigermaßen xD Ich kann es gut gebrauchen! PS: Ich weiß, das es davon schon einige Sachen gibt, aber ich habs selber gemacht ![]() lg MD |
||
![]() |
Geeecko |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe noch ein paar Bugs entfernt.
Jetzt sollte alles Funktionieren. Funktionen sind kommentiert. Viel Spaß! Code: [AUSKLAPPEN] Type THookSystem Global HookFilterList:TList Global initED:Int '###Initialisiert das Hooksystem Function Init() THookSystem.HookFilterList = New TList AddHook(EmitEventHook, TempHook) THookSystem.initED = True End Function '###Registriert ein "Hook" Function RegisterHook(HookFilter:THookFilter) If THookSystem.InitED = False Then THookSystem.Init() THookSystem.HookFilterList.AddLast(HookFilter) End Function '###Löscht einen "Hook" Function UnregisterHook(HookFilter:THookFilter) If THookSystem.InitED = False Then THookSystem.Init() THookSystem.HookFilterList.FindLink(HookFilter).Remove() End Function End Type '###Diese Funktion leitet die Events nur weiter Function TempHook:Object(id:Int, data:Object, context:Object) If THookSystem.InitED = False Then THookSystem.Init() Local event:TEvent = TEvent(data) '###HookFilters durchgehen und vergleichen For Local HookFilter:THookFilter = EachIn THookSystem.HookFilterList Local okay:Int = True 'Wird auf false gesetzt, fals eine Option nicht übereinstimmt '###Data If HookFilter.data_list And okay Then For Local data_object:THookFilterObject = EachIn HookFilter.data_list If data_object._int <> event.data Then okay = False Else okay = True Exit EndIf Next If HookFilter.data_list.Count() = 0 Then okay = False End If '###Extra If HookFilter.extra_list And okay Then For Local extra_object:THookFilterObject = EachIn HookFilter.extra_list If extra_object._object <> event.extra Then okay = False Else okay = True Exit EndIf Next If HookFilter.extra_list.Count() = 0 Then okay = False EndIf '###ID If HookFilter.id_list And okay Then For Local id_object:THookFilterObject = EachIn HookFilter.id_list If id_object._int <> event.id Then okay = False Else okay = True Exit EndIf Next If HookFilter.id_list.Count() = 0 Then okay = False End If '###Source If HookFilter.source_list And okay Then For Local source_object:THookFilterObject = EachIn HookFilter.source_list If source_object._object <> event.source Then okay = False Else okay = True Exit EndIf Next If HookFilter.source_list.Count() = 0 Then okay = False End If '###X If HookFilter.x_list And okay Then For Local x_object:THookFilterObject = EachIn HookFilter.x_list If x_object._int <> event.x Then okay = False Else okay = True Exit EndIf Next If HookFilter.x_list.Count() = 0 Then okay = False End If '###Y If HookFilter.y_list And okay Then For Local y_object:THookFilterObject = EachIn HookFilter.y_list If y_object._int <> event.y Then okay = False Else okay = True Exit EndIf Next If HookFilter.y_list.Count() = 0 Then okay = False End If '###Wenn okay = true ist, dann das event weiterleiten If okay Then HookFilter.func(event) Next End Function '###Informationen für das HookSystem welche Events weitergeleitet sollen und welche nicht Type THookFilter '###Listen welche übereinstimmen müssen (wenn die liste NULL ist, wird die "gruppe" ignoiert) Field data_list:TList Field extra_list:TList Field id_list:TList Field source_list:TList Field x_list:TList Field y_list:TList Field func(event:TEvent) 'Funktion die aufgerufen werden soll '###Fügt etwas zu "data" hinzu Method AddData(data:Int) If Not Self.data_list Then Self.data_list = New TList Local data_object:THookFilterObject = New THookFilterObject data_object._int = data Self.data_list.AddLast(data_object) End Method '###Fügt etwas zu "extra" hinzu Method AddExtra(extra:Object) If Not Self.extra_list Then Self.extra_list = New TList Local extra_object:THookFilterObject = New THookFilterObject extra_object._object = extra Self.extra_list.AddLast(extra_object) End Method '###Fügt etwas zu "source" hinzu Method AddSource(source:TGadget) If Not Self.source_list Then Self.source_list = New TList Local source_object:THookFilterObject = New THookFilterObject source_object._object = source Self.source_list.AddLast(source_object) End Method '###Fügt etwas zu "id" hinzu Method AddID(id:Int) If Not Self.id_list Then Self.id_list = New TList Local id_object:THookFilterObject = New THookFilterObject id_object._int = id Self.id_list.AddLast(id_object) End Method '###Fügt etwas zu "id" hinzu Method AddX(x:Int) If Not Self.x_list Then Self.x_list = New TList Local x_object:THookFilterObject = New THookFilterObject x_object._int = x Self.x_list.AddLast(x_object) End Method '###Fügt etwas zu "y" hinzu Method AddY(y:Int) If Not Self.y_list Then Self.y_list = New TList Local y_object:THookFilterObject = New THookFilterObject y_object._int = y Self.y_list.AddLast(y_object) End Method '###Löscht die "data"-liste Method RemoveData() Self.data_list = Null End Method '###Löscht die "extra" liste Method RemoveExtra() Self.extra_list = Null End Method '###Löscht die "id" liste Method RemoveID() Self.id_list = Null End Method '###Löscht die "source" liste Method RemoveSource() Self.source_list = Null End Method '###Löscht die "x" liste Method RemoveX() Self.x_list = Null End Method '###Löscht die "y" liste Method RemoveY() Self.y_list = Null End Method '###Erstellt einen Hook, zu dem ALLE Events weitergeleitet werden Function CreateEmptyHook:THookFilter(func(event:TEvent)) Local HookFilter:THookFilter = New THookFilter HookFilter.data_list = Null HookFilter.extra_list = Null HookFilter.id_list = Null HookFilter.source_list = Null HookFilter.x_list = Null HookFilter.y_list = Null HookFilter.func = func Return HookFilter End Function '###Erstellt einen Hook, zu dem keine Events weitergeleitet werden. Optionen müssen erst getroffen werden Function CreateNormalHook:THookFilter(func(event:TEvent)) Local HookFilter:THookFilter = New THookFilter HookFilter.data_list = New TList HookFilter.extra_list = New TList HookFilter.id_list = New TList HookFilter.source_list = New TList HookFilter.x_list = New TList HookFilter.y_list = New TList HookFilter.func = func Return HookFilter End Function End Type '###Hier drin können Werte in einem object abgepsiehcert werden Type THookFilterObject Field _int:Int Field _string:String Field _object:Object End Type lg MD |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group