Eigene Steuerelemente? - Ein Gerüst wie dieses OK?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

SlasHeR

Betreff: Eigene Steuerelemente? - Ein Gerüst wie dieses OK?

BeitragDo, Jul 06, 2006 21:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Begriffe für die Suchmaschine: Eigenes Objekt, Steuerelement, TGadget, eigenes Gadget ...

Eigenes Steuerelement

Wie sieht das eigentlich aus mit eigenen Steuerelementen in BlitzMax?

Ich bin auf der Suche nach einer "festen" Methode solche zu erstellen, was Events & Hooks angeht. Also eine art Grundgerüst, welches man erweitern kann.

Im englischen Forum bin ich dabei auf folgenden Code gestoßen:

Code:

Strict

Type Test

   Field canvas:TGadget
   
   Function Hook:Object(id,data:Object,context:Object)
   Local ev:TEvent=TEvent(data)
   If Not ev Return data
   'Print ev.toString()
   Local Act_Can:Test = Test(TGadget(ev.source).Context)
   If Act_Can <> Null Then
      Select ev.id
         Case Event_MouseEnter
               Act_Can.Update(1)
         Case Event_MouseLeave
                  Act_Can.Update(0)
         Case Event_TimerTick
               RedrawGadget Act_Can.Canvas
      End Select
   EndIf      
   Return data
   
   End Function
   
   Method update(state:Byte=0)
      SetGraphics CanvasGraphics(canvas)
         SetClsColor 128+state*127,128+state*127,128+state*127
         Cls
      Flip
   End Method
   
   Function create:Test(x,y,w,h,parent:TGadget)
      Local a:Test=New Test
      a.canvas=CreateCanvas(x,y,w,h,parent)
      a.canvas.Context = a
      a.Update(0)
      AddHook EmitEventHook,Test.Hook,Null,0
      Return a
   End Function

End Type

Function createtest:Test(x,y,w,h,parent:TGadget)
   Return Test.Create(x,y,w,h,parent)
End Function

Local win:TGadget=CreateWindow("o_O",0,0,640,480)

Local t:Test=createtest(32,32,48,24,win)
t:Test=createtest(32,60,48,24,win)
t:Test=createtest(32,88,48,24,win)


Repeat
   WaitEvent()
   If EventID()=EVENT_WINDOWCLOSE End
Forever

von klepto2 aus dem englischen forum

Der Code funktioniert soweit ganz gut, jedoch ist die Frage, ist das so richtig?
Ich wollte gerne mal eure Meinung dazu hören, ob es nicht eleganter / einfacher / besser geht.

Eventuell hat jemand ja auch ein kleines Beispiel parat, oder kann ein bißchen von seinen Erfahrungen erzählen die er damit gemacht hat.
  • Zuletzt bearbeitet von SlasHeR am Fr, Jul 07, 2006 10:23, insgesamt einmal bearbeitet
 

Dreamora

BeitragDo, Jul 06, 2006 21:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist ziemlich richtig. Allerdings wird die lineare Hookkette irgendwann kritisch (wenn für jedes Gadget ein eigener Hook kommt).
Schau mal im englischen Codearchiv nach dem MasterHook System. Das könnte das von dir gebrachte beispiel für "grosse Nutzung" tauglicher machen
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

SlasHeR

BeitragDo, Jul 06, 2006 22:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich vermute mal du meintest diesen Source:
Code:

'
' Example of using one master hook, to send sorted events to
' registered gadgets.
'
' Also an example of how to control program flow in a more efficent manner.
'

SuperStrict


Type TMasterEventHook

  'Master sub hook list of intrested gadgets
  Global tSubHookIntrestedList:TList=Null    'Starts off empty

  Method New()
    If tSubHookIntrestedList:TList=Null
      Print "Sub hook list created"
      tSubHookIntrestedList:TList=CreateList()
      EndIf
    End Method

  'Add the master hooking method in
  Function InstallMasterHook()
    Print "Hook installed"
    AddHook EmitEventHook,TMasterEventHook.ProcessEvents
    End Function


  'All events pass to here
  Function ProcessEvents:Object(iId:Int,tData:Object,tContext:Object)

    If tData=Null Then Return Null     'Nothing here to work on
    Local tEv:TEvent=TEvent(tData)     'Convert into an event
   
    'Scan the list, see if we have a source
    For Local tSH:TSubEventHook = EachIn tSubHookIntrestedList:TList
      If tSH.pWidget = tEv.Source
        tSH.OnEvent(tEv)    'Send the event to the proper place
        Return Null
        EndIf
      Next
'    Print tEv.Source.tostring()+" -> "+tEv.tostring()

    Return Null     'Presume we want to capture events!
    End Function


  End Type



Type TSubEventHook Extends TMasterEventHook

  Method New()
    Print "Sub hook in"
    ListAddLast TMasterEventHook.tSubHookIntrestedList,Self
    End Method

  Field pWidget:TGadget=Null             'Events of this gadget needed

  Method OnEvent(tEv:TEvent) Abstract    '----> coded someplace else

  End Type




'_/ code \____________________________________________________________________________________________________



Type TWin1Code Extends TSubEventHook 

  'Register a gadget to this code lump ....
  Function RegisterGadget:TWin1Code(tG:TGadget)
    Local tSH:TWin1Code = New TWin1Code
    tSH.pWidget = tG
    Return tSH:TWin1Code
    End Function

  'Event processing for this gadget
  Method OnEvent(tEv:TEvent)
    Print "TWin 1 Code -> "+tEv.tostring()

    'Event handle...
    Select tEv.Id
      Case EVENT_WINDOWCLOSE
      End    'Quit this program on window close
      End Select

    End Method

  End Type





Type TBut1Code Extends TSubEventHook 

  'Register a gadget to this code lump ....
  Function RegisterGadget:TBut1Code(tG:TGadget)
    Local tSH:TBut1Code = New TBut1Code
    tSH.pWidget = tG
    Return tSH:TBut1Code
    End Function

  'Event processing for this gadget
  Method OnEvent(tEv:TEvent)
    Print "TBut 1 Code -> "+tEv.tostring()
    End Method

  End Type






Type TBut2Code Extends TSubEventHook 

  'Register a gadget to this code lump ....
  Function RegisterGadget:TBut2Code(tG:TGadget)
    Local tSH:TBut2Code = New TBut2Code
    tSH.pWidget = tG
    Return tSH:TBut2Code
    End Function


  'Event processing for this gadget
  Method OnEvent(tEv:TEvent)
    Print "TBut 2 Code -> "+tEv.tostring()
    End Method

  End Type





Type TBut3Code Extends TSubEventHook 

  'Register a gadget to this code lump ....
  Function RegisterGadget:TBut3Code(tG:TGadget)
    Local tSH:TBut3Code = New TBut3Code
    tSH.pWidget = tG
    Return tSH:TBut3Code
    End Function

  'Event processing for this gadget
  Method OnEvent(tEv:TEvent)
    Print "TBut 3 Code -> "+tEv.tostring()
    End Method

  End Type






Type TBut4Code Extends TSubEventHook 

  'Register a gadget to this code lump ....
  Function RegisterGadget:TBut4Code(tG:TGadget)
    Local tSH:TBut4Code = New TBut4Code
    tSH.pWidget = tG
    Return tSH:TBut4Code
    End Function

  'Event processing for this gadget
  Method OnEvent(tEv:TEvent)
    Print "TBut 4 Code -> "+tEv.tostring()
    End Method

  End Type




Type TBut5Code Extends TSubEventHook 

  'Register a gadget to this code lump ....
  Function RegisterGadget:TBut5Code(tG:TGadget)
    Local tSH:TBut5Code = New TBut5Code
    tSH.pWidget = tG
    Return tSH:TBut5Code
    End Function

  'Event processing for this gadget
  Method OnEvent(tEv:TEvent)
    Print "TBut 5 Code -> "+tEv.tostring()
    End Method

  End Type





'Gui building ...
Global pWin1:TGadget=CreateWindow("Supersize me!",500,100,400,400,Null,WINDOW_TITLEBAR|WINDOW_RESIZABLE|WINDOW_CLIENTCOORDS)
Global pBut1:TGadget=CreateButton("But1",40,40,80,26,pWin1)
Global pBut2:TGadget=CreateButton("But2",40,120,80,26,pWin1)
Global pPan1:TGadget=CreatePanel(180,50,200,200,pWin1,PANEL_BORDER)
Global pBut3:TGadget=CreateButton("But3",40,10,80,26,pPan1)
Global pPan2:TGadget=CreatePanel(20,300,240,80,pWin1,PANEL_BORDER)
Global pBut4:TGadget=CreateButton("But4",40,20,80,26,pPan2)
Global pBut5:TGadget=CreateButton("But5",140,40,80,26,pPan2)
SetMinWindowSize pWin1,200,200


'Install sub event hooks for given gadgets ....
Local tWin1Logic:TWin1Code = TWin1Code.RegisterGadget( pWin1 )
Local tBut1Logic:TBut1Code = TBut1Code.RegisterGadget( pBut1 )
Local tBut2Logic:TBut2Code = TBut2Code.RegisterGadget( pBut2 )
Local tBut3Logic:TBut3Code = TBut3Code.RegisterGadget( pBut3 )
Local tBut4Logic:TBut4Code = TBut4Code.RegisterGadget( pBut4 )
Local tBut5Logic:TBut5Code = TBut5Code.RegisterGadget( pBut5 )


'Master hook routine install
TMasterEventHook.InstallMasterHook()

'Main loopage
Repeat
  WaitEvent
  Forever
End

BtbN

Betreff: Re: Eigene Steuerelemente? - Ein Gerüst wie dieses OK?

BeitragFr, Jul 07, 2006 6:42
Antworten mit Zitat
Benutzer-Profile anzeigen
SlasHeR hat Folgendes geschrieben:
Begriffe für die Suchmaschine: Eigenes Objekt, Steuerelement, TGadjet, eigenes Gadjet ...


Jeder der englische Rechtschreibung beherscht, wird, zumindest auf die letzen beiden Punkte, nichts finden. Rolling Eyes
Hinweis: In deinem Code stehts richtig.
 

SlasHeR

BeitragFr, Jul 07, 2006 10:24
Antworten mit Zitat
Benutzer-Profile anzeigen
lol^^... Da war ich gestern wohl zu müde. habs gleich mal geändert.
 

Dreamora

BeitragFr, Jul 07, 2006 11:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja den Source meinte ich mehr oder weniger.
Nu musst du nur verstehen, wie er funktioniert und beides Kombinieren und du solltest etwas akzeptables erhalten Smile

Je nachdem was du machen möchtest, gibts noch den ein oder anderen kniff (ich habe zb EventHandler Funktionen direkt in Gadets als alles zu select - casen wie ein blöder)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group