Dynamisch GUI-Menüs bauen

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Spark Fountain

Betreff: Dynamisch GUI-Menüs bauen

BeitragDo, Jan 07, 2016 13:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin vor kurzem von Blitz3D auf BlitzMax umgestiegen. Jetzt möchte ich in einem Projekt, das später mal eine IDE werden soll, aus einer Textdatei dynamisch Menüs bauen lassen. Soll heißen, man kann das, was als Menüs im Programm dargestellt wird extern definieren.

Jetzt habe ich mir überlegt, für die Menühierarchie (Parent-Child-Beziehungen) ein Konstrukt wie einen Stack zu bauen, der speichert welches Menü das aktuelle Parent ist. Dafür wollte ich ein TList-Objekt nehmen, allerdings bin ich nicht in der Lage, nachdem ich ein TGadget-Element in die Liste eingefügt habe, auch wieder ein TGadget-Element herauszubekommen. Der Aufruf "First()" liefert immer ein Object und ich kenne keine Möglichkeit, das zurück in ein TGadget zu casten. Gibt es irgendeinen anderen Befehl auf TList, um das reine Objekt mit seinem Typen wieder abzurufen?

Viele Grüße
Stefan
Gewinner der MiniBCC's #11, #13 und #28
 

CO2

ehemals "SirMO"

BeitragDo, Jan 07, 2016 15:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

also, um von Object in einen anderen Typen zu casten, muss du folgendes machen: DeinType(Object). DeinType wäre in diesem Fall TGadget, Object wäre das aus der Liste geholte Objekt. Danach empfiehlt es sich, eine Null-Prüfung durchzuführen, denn wenn die Umwandlung nicht funktioniert, da das Objekt nicht vom angegebenen Typ ist, wird an dieser Stelle Null returned.

Einfacher ist es jedoch, die Liste durchzuiterieren. Dann gibst du als "Läufer" einfach eine Variable vom Zieltyp an, sprich: BlitzMax: [AUSKLAPPEN]
For Local gadget:TGadget = EachIn Liste
...
Next

Dann kannst du auf das TGadget über gadget zugreifen. Auch hier würde sich eine Null-Prüfung empfehlen, wenn du dir nicht 100%ig sicher bist, dass du nur TGadgets in deiner Liste hast.
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Thunder

BeitragFr, Jan 08, 2016 19:30
Antworten mit Zitat
Benutzer-Profile anzeigen
CO2 hat eigentlich alles wichtige schon gesagt, aber weil es zum Verständnis gut ist,
möchte ich noch was hinzufügen:

TGadget ist eine Klasse aus MaxGUI und in BlitzMax sind alle Klassen implizit von Object abgeleitet.
D.h. wenn du bei einer Type-Definition kein Extends schreibst, ist es das gleiche, wie wenn du Extends Object schreiben würdest. Falls du die Klasse von einer anderen ableitest, gilt das natürlich auch, weil schlussendlich irgendeine Überklasse von Object abgeleitet ist.

Wegen des Polymorphismus kannst du jetzt Kindklassen auf die Typen ihrer Elternklassen casten, ohne die Information zu verlieren, welcher Klasse sie eigentlich angehören. Beispiel:

BlitzMax: [AUSKLAPPEN]
Type A
EndType

Type B Extends A
EndType

Function findType(x:Object)
If A(x) <> Null Then
Print "object is of type A"
If B(x) <> Null Then
Print "object is of type B"
EndIf
Else
Print "object is of type Object"
EndIf
EndFunction

Local aa : A = New A
Local bb : B = New B

Local objA : Object = Object(aa)
Local objB : Object = Object(bb)
Local justanobject : Object

Print "objA"
findType objA
Print "objB"
findType objB
Print "justanobject"
findType justanobject


Die Information geht also nicht verloren. Auch nicht bei einer Liste:

BlitzMax: [AUSKLAPPEN]
Import maxgui.drivers

Local list:TList = CreateList()

list.addlast CreateWindow("hallo", 0,0, 100, 100, WINDOW_CENTER)

Local window = TGadget(list.first())

MaximizeWindow window

Delay 600
End
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Spark Fountain

BeitragSa, Jan 09, 2016 0:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für die schnellen Antworten! Diese Notation von Type-Casting kannte ich noch nicht. Hab ich auch nicht in der BlitzMax-Doku gefunden (welche ich überhaupt ziemlich bescheiden und unübersichtlich finde).
Gewinner der MiniBCC's #11, #13 und #28

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group