Kleine Erweiterung der MaxGUI-Tabber

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Blitzcoder

Newsposter

Betreff: Kleine Erweiterung der MaxGUI-Tabber

BeitragDi, Apr 03, 2007 12:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Apr 03, 2007 17:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Blitzcoder

Newsposter

BeitragDi, Apr 03, 2007 18:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ä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

BeitragDo, Apr 12, 2007 18:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Höhö!
Ein Bug ^^ Sad
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

BeitragDo, Apr 12, 2007 18:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Apr 30, 2011 19:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile

Ein schönes Wochenende noch!
WIP: Vorx.Engine

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group