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

SlasHeRBetreff: Eigene Steuerelemente? - Ein Gerüst wie dieses OK? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
BtbNBetreff: Re: Eigene Steuerelemente? - Ein Gerüst wie dieses OK? |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() Hinweis: In deinem Code stehts richtig. |
||
SlasHeR |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
lol^^... Da war ich gestern wohl zu müde. habs gleich mal geändert. | ||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group