Kleine Erweiterung der MaxGUI-Tabber
Übersicht

![]() |
BlitzcoderNewsposterBetreff: Kleine Erweiterung der MaxGUI-Tabber |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe mich über die grauenhaften Tabber in der MaxGUI aufgeregt. Die bestehen an sich wirklich nur aus einer Leiste von Tabs, das ganze Ein/Ausblenden der Gadgets muss man selber machen. Ich hab mal einen kleinen Code geschrieben, der das für einen übernimmt. Es gibt 3 Befehle, CreateTab(), UpdateTabber(), und FreeTab.
CreateTab:TGadget(tabber:TGadget,TabName:String,TabToolTip:String="") Erstellt einen neuen Tab. Übergeben wird der Tabber, die Beschriftung und evtl. ein ToolTip (Dieser kleine Beschreibungskasten, der kommt, wenn man mit der Maus über etwas fährt). Zurückgeben wird ein TGadget(genaugenommen ein Panel), auf dem man die Gadgets des jeweiligen Tabs platzieren kann. FreeTab(Tab:Tgadget) Entfernt einen Tab. UpdateTabber() Kommt in die Hauptschleife hinter WaitEvent(). Regelt das Umschalten der Tabs mit dem Wechseln der Inhalte. Beispiel Code: [AUSKLAPPEN] SuperStrict Include "tab.bmx" Local window:Tgadget = CreateWindow("Testwindow",100,100,200,200) Local tabber:TGadget = CreateTabber(0,0,190,190,window) Local tab1:Tgadget = createtab(tabber,"Tab 1","This is the beatiful Tab 1") Local tab2:Tgadget = createtab(tabber,"Tab 2","This is the beatiful Tab 2") Local tab3:Tgadget = createtab(tabber,"Tab 3","This is the beatiful Tab 3") Local button1:Tgadget = CreateButton("Button1",0,0,100,20,tab1) Local button2:Tgadget = CreateButton("Button2",0,20,100,20,tab2) Local bbutton3:Tgadget = CreateButton("Button3",0,40,100,20,tab3) freetab(tab2) While True WaitEvent() Updatetabber() Select EventID() Case event_windowclose End End Select Wend Das Beispiel erstellt ein kleines Fenster mit einem Tabber. Angelegt werden 3 Tabs, von denen der zweite zu Demonstrationszwecken gleich wieder gelöscht wird. Jeder Tab bekommt einen Button mit unterschiedlicher Beschriftung und unterschiedlicher Position. Zu guter Letzt der eigentliche Code: [AUSKLAPPEN] Type TTab Global list:TList = CreateList() Field id:Int Field tabber:Tgadget Field panel:Tgadget End Type Function CheckTabber:Byte(Tab:TGadget) For Local T:TTab = EachIn TTab.list If T.Tabber = Tab Then Return True Next Return False End Function Function CreateTab:Tgadget(tabber:Tgadget,name:String,tip:String="") Local id:Int = -1 Local tab:TTab For tab:TTab = EachIn TTab.list If tab.tabber = tabber HideGadget tab.panel If tab.id > id Then id = tab.id EndIf Next id:+1 tab:TTab = New TTab TTab.list.addlast(tab) tab.tabber = tabber tab.id=id tab.panel = CreatePanel(0,0,ClientWidth(tabber),ClientHeight(tabber),tabber) AddGadgetItem tabber,name,False,-1,tip ShowGadget tab.panel SelectGadgetItem tabber,id Return Tab.panel End Function Function updatetabber() If CheckTabber(TGadget(EventSource())) = False Then Return If EventID() = EVENT_GADGETACTION Then For Local tab:TTab = EachIn TTab.list If tab.id = EventData() Then ShowGadget tab.panel Else HideGadget tab.panel EndIf Next EndIf End Function Function FreeTab(t:Tgadget) Local id:Int Local tab:TTab For tab:TTab = EachIn TTab.list If tab.panel = t Then RemoveGadgetItem tab.tabber,tab.id id=tab.id FreeGadget tab.panel TTab.list.remove(tab) tab=Null EndIf Next For tab:TTab = EachIn TTab.list If tab.id>Id Then tab.id:-1 HideGadget tab.panel Next ShowGadget TTab(TTab.list.first()).panel SelectGadgetItem TTab(TTab.list.first()).tabber,0 End Function MfG Blitzcoder |
||
- Zuletzt bearbeitet von Blitzcoder am Mi, Nov 07, 2007 23:35, insgesamt 2-mal bearbeitet
![]() |
Cardonic |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: Compile Error
Duplicate identifier 'tab' |
||
If you should go skating on the thin ice of modern life, dragging behind you the silent reproach of a million tear-stained eyes, don't be surprised when a crack in the ice appears under your feet. |
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ähm, ich hätte schwören können, dass das vorhin ging.
So, ich habs editiert. Lag irgendwie an SuperStrict. |
||
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________ |°°°°°°°°°°°°°°||'""|""\__,_ |______________ ||__ |__|__ |) |(@) |(@)"""**|(@)(@)****|(@) |
![]() |
Geeecko |
![]() Antworten mit Zitat ![]() |
---|---|---|
Höhö!
Ein Bug ^^ ![]() wenn ich 2 Reiter mache, in beide textfelder, und in einer etwas eingebe, schaltet es automatisch auf das andere. Sprich: ich kann nur einen buchstaben eingeben. |
||
.... |
![]() |
Geeecko |
![]() Antworten mit Zitat ![]() |
---|---|---|
Behoben: (Naja... klepto2 war es *immernochfreu* -> danke nochma *g*)
und danke an blitzcoder. jetzt muss ich nich immer alles selber machen. Naja: Code: [AUSKLAPPEN] Type TTab Global list:TList = CreateList() Field id:Int Field tabber:Tgadget Field panel:Tgadget End Type Function CheckTabber:Byte(Tab:TGadget) For Local T:TTab = EachIn TTab.list If T.Tabber = Tab Then Return True Next Return False End Function Function CreateTab:Tgadget(tabber:Tgadget,name:String,tip:String="") Local id:Int = -1 Local tab:TTab For tab:TTab = EachIn TTab.list If tab.tabber = tabber HideGadget tab.panel If tab.id > id Then id = tab.id EndIf Next id:+1 tab:TTab = New TTab TTab.list.addlast(tab) tab.tabber = tabber tab.id=id tab.panel = CreatePanel(0,0,ClientWidth(tabber),ClientHeight(tabber),tabber) AddGadgetItem tabber,name,False,-1,tip ShowGadget tab.panel SelectGadgetItem tabber,id Return Tab.panel End Function Function updatetabber() If CheckTabber(TGadget(EventSource())) = False Then Return If EventID() = EVENT_GADGETACTION Then For Local tab:TTab = EachIn TTab.list If tab.id = EventData() Then ShowGadget tab.panel Else HideGadget tab.panel EndIf Next EndIf End Function Function FreeTab(t:Tgadget) Local id:Int Local tab:TTab For tab:TTab = EachIn TTab.list If tab.panel = t Then RemoveGadgetItem tab.tabber,tab.id id=tab.id FreeGadget tab.panel TTab.list.remove(tab) tab=Null EndIf Next For tab:TTab = EachIn TTab.list If tab.id>Id Then tab.id:-1 HideGadget tab.panel Next ShowGadget TTab(TTab.list.first()).panel SelectGadgetItem TTab(TTab.list.first()).tabber,0 End Function |
||
.... |
![]() |
ComNik |
![]() Antworten mit Zitat ![]() |
---|---|---|
Aloah,
ich weiss ich grabe hier ziemlich alte Threads aus, aber mein Problem hat unmittelbar mit dieser Erweiterung zu tun. Ich bemerkte nämlich letztens das im Release Mode nach einigen Tab Wechseln das ganze mit einer Access Exception bzw der Fehlermeldung "setMemBit Error MemBit already set" abbricht. Nun natürlich kann das ganze an den tausenden Codezeilen drumherum liegen, aber ich habe es soweit isolieren können, das es wirklich nur an den Funktionen in dieser Erweiterung hier liegt. Im Debug Modus kompiliert, kann ich jedoch wechseln sooft ich will - keine Exception. Um ganz sicher zu gehen habe ich nochmal ein Programm geschrieben das 3 leere Tabs anzeigt. Gleiches Spiel, Release Mode, Absturz nach unterschiedlicher Anzahl Wechsel, Debug Modus, alles wunderbar. Sollte niemand eine Lösung wissen, so würde mich genauso interessieren, was genau die Unterschiede zwischen Release und Debug Mode sind. Mein Verdacht waren unsauber initialisierte Variablen oder ein Speicherleck. Habe beides überprüft und es ist nicht der Fall. Wer Infos zu einem der beiden hat, vielen Dank ![]() Ein schönes Wochenende noch! |
||
WIP: Vorx.Engine |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group