AddHook() im Type bei mehreren Referenzen

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Farbfinsternis

Betreff: AddHook() im Type bei mehreren Referenzen

BeitragMo, Jul 24, 2006 17:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe da mal wieder ein kleines Problem. Ich möchte in einem Type ein AddHook() anwenden welches sich aber jeweils immer nur auf seine eigene Referenz beziehen soll. Im Folgenden poste ich einfach mal den kompletten Code:
Code: [AUSKLAPPEN]

SuperStrict

rem
   bbdoc: MaxGui Imagebutton Extension
   about:
   Der Imagebutton erlaubt das erweiterte Erzeugen von grafischen
   Benutzeroberflchen mittels MaxGUI
end rem

Module pub.imagebutton

ModuleInfo "Version: 0.1"
ModuleInfo "Author: bruZard"
ModuleInfo "License: Freeware OpenSource"
ModuleInfo "Modserver: PUB"

Import brl.maxgui
?Win32
   Import brl.win32maxgui
?MacOs
   Import brl.cocoamaxgui
?Linux
   Import brl.fltkmaxgui
?
Import brl.bmploader
Import brl.pngloader
Import brl.jpgloader
 

Type TImageButton
   Field x:Int
   Field y:Int
   Field width:Int
   Field height:Int
   Field images:TPixmap[3]
   Field gadget:TGadget
   
   Function Add:TImageButton(x:Int, y:Int, group:TGadget, img0:String, img1:String, img2:String)
      Local btn:TImageButton = New TImageButton
            
      btn.images[0] = LoadPixmap(img0)
      If img1.length btn.images[1] = LoadPixmap(img1)
      If img2.length btn.images[2] = LoadPixmap(img2)
      
      btn.x            = x
      btn.y            = y
      btn.width      = btn.images[0].width
      btn.height   = btn.images[0].height
      
      btn.gadget   = CreatePanel(btn.x, btn.y, btn.width, btn.height, group, PANEL_ACTIVE)
      SetPanelPixmap btn.gadget, btn.images[0], PANELPIXMAP_FIT
      
      AddHook EmitEventHook, eventhook, btn
      
      Return btn
   End Function
   
   
   Function eventhook:Object(id:Int,data:Object,context:Object)
      Local btn:TImageButton = TImageButton(context)
      Local ev:TEvent = TEvent(data)
      
      If btn
         Local mx:Int = ev.x
         Local my:Int = ev.y
         
         Select ev.id
            Case EVENT_MOUSEUP
               
               If mx>0 and my>0 and mx<btn.width and my<btn.height
                  Local NewEvent:TEvent = New TEvent
                  NewEvent.id   = EVENT_GADGETACTION
                  NewEvent.source = btn
                  EmitEvent(NewEvent)
                  
                  If btn.images[1]      
                     SetPanelPixmap btn.gadget,btn.images[1],PANELPIXMAP_FIT
                  Else
                     SetPanelPixmap btn.gadget,btn.images[0],PANELPIXMAP_FIT
                  EndIf
               EndIf
                           
            Case EVENT_MOUSEENTER
               If btn.images[1]<>Null
                  SetPanelPixmap btn.gadget,btn.images[1],PANELPIXMAP_FIT
               EndIf
            
            Case EVENT_MOUSEDOWN
               If btn.images[2]<>Null
                  SetPanelPixmap btn.gadget,btn.images[2],PANELPIXMAP_FIT
               EndIf
                        
            Case EVENT_MOUSELEAVE
               SetPanelPixmap btn.gadget,btn.images[0],PANELPIXMAP_FIT
         EndSelect
      EndIf
      
      Return data   
   EndFunction
      
   Method Free()
      images[0] = Null
      images[1] = Null
      images[2] = Null
      
      FreeGadget gadget
      
      RemoveHook EmitEventHook,eventhook
      GCCollect()
   End Method
End Type

rem
   bbdoc: Erzeugt einen neuen ImageButton
   about:
   Erstellt an der Position x und y einen neuen Imagebutton.
   Dieser hat die Ausmasse des Bildes der Dstei img0. Die Grafikdateien
   img0, img1 und img2 stehen fuer die Buttonstates NORMAL, MOUSEOVER
   und PRESSED. Der Button erzeugt ein GADGETACTION Ereignis.
   Es duerfen keine Gadget-Befehle auf das Objekt angewendet werden.
end rem
Function CreateImageButton:TImageButton(x:Int, y:Int, group:TGadget, img0:String, img1:String = "", img2:String = "")
   Local bn:TImageButton = TImageButton.Add(x,y,group,img0,img1,img2)
   
   Return bn
End Function


rem
   bbdoc: Loescht den angegebenen ImageButton
   about:
   Loescht den Button aus dem Arbeitsspeicher
end rem
Function FreeImageButton(button:TImageButton)
   button.Free()
End Function

...ist jetzt leider schon komplett in Module-Form, sollte aber dennoch nicht allzu schwer zu lesen sein.

Das Problem:
Ich erzeuge zwei ImageButtons und warte im MainLoop auf ein EVENT_GADGETACTION, welches ja in der Klassenfunktion eventhook() erzeugt und gesendet wird. Klappt auch ganz prima, aber ich darf scheinbar nicht auf eine einzlene Referenz reagieren sondern bekomme das Event dauernd von allen Referenzen.

Jemand einen Plan was da falsch läuft?
Farbfinsternis.tv

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group