(erledigt) Types und Liste

Previous topic - Next topic

Markus

Ich hab grad ein Brett vor Kopf.
In anderen Sprachen gibt es Listen wo ich Objekte rein tun kann, wie kann man das in GLBasic lösen?

Code (glbasic) Select

TYPE TGui
x1
y1
x2
y2
text$
valuei
valuef#
enabled
visible
focus
SubList[] //AS TGui <<< ???

FUNCTION Add: x1,y1,x2,y2,text$

LOCAL G AS TGui

    //G_ProcentToReal( x1,y1 , x1,y1 )
    //G_ProcentToReal( x2,y2 , x2,y2 )

G.x1=x1
G.y1=y1
G.x2=x2
G.y2=y2
G.text$=text$
G.valuei=0
G.valuef#=0.0
G.enabled=TRUE
G.visible=TRUE
G.focus=FALSE

DIMPUSH SubList[], G //hier ist das nun der falsche Typ

ENDFUNCTION
//...

ENDTYPE //Gui

backslider

So sollte es gehen...
Quote from: Markus on 2012-Apr-19
Ich hab grad ein Brett vor Kopf.
In anderen Sprachen gibt es Listen wo ich Objekte rein tun kann, wie kann man das in GLBasic lösen?

Code (glbasic) Select

TYPE TGui
x1
y1
x2
y2
text$
valuei
valuef#
enabled
visible
focus
SubList[] AS TGui //<<< War schon richtig so

FUNCTION Add: x1,y1,x2,y2,text$

LOCAL G AS TGui

    //G_ProcentToReal( x1,y1 , x1,y1 )
    //G_ProcentToReal( x2,y2 , x2,y2 )

G.x1=x1
G.y1=y1
G.x2=x2
G.y2=y2
G.text$=text$
G.valuei=0
G.valuef#=0.0
G.enabled=TRUE
G.visible=TRUE
G.focus=FALSE

DIMPUSH self.SubList[], G //Type-eigene Variablen immer mit self.xxx aufrufen

ENDFUNCTION
//...

ENDTYPE //Gui


Markus

Näh , hab ich auch gedacht .
Der Compiler sagt "type member is defined recursively : SubList"
Hier mal das ganze:

Die Anwendung
Code (glbasic) Select

// --------------------------------- //
// Project: MRGUI
// Start: Thursday, April 19, 2012
// IDE Version: 10.283

GLOBAL Gui AS TGui

MainLoop()
END

FUNCTION MainLoop:

SYSTEMPOINTER TRUE

Gui.CreateWindow  (0, 00,100,100,"Window")
Gui.CreateLabel   (1, 10, 99, 20,"Label")
Gui.CreateButton  (1, 20, 99, 30,"Button")
Gui.CreateSlider  (1, 30, 99, 40,"Slider")
Gui.CreateList    (1, 40, 99, 60,"List")
Gui.CreateCheckbox(1, 60, 99, 70,"Checkbox")
Gui.CreateOption  (1, 70, 99, 80,"Option")
Gui.CreateFrame   (1, 80, 99, 90,"Frame")
//Gui.CreateItem()

REPEAT

//0=X - Geschwindigkeit
//1=Y - Geschwindigkeit
//2=Rad (1 auf, -1 ab)
//3=linke Maustaste
//4=rechte Maustaste
//5=mittlere Maustaste

LOCAL wheel=MOUSEAXIS(2)
LOCAL bm=MOUSEAXIS(5)
LOCAL mx,my,b1,b2

MOUSESTATE mx,my,b1,b2

LOCAL keyasc$ = INKEY$( )
LOCAL keycode = KEY(1) //ESC

    Gui.Update(mx,my,b1,b2,bm,wheel,keyasc$) //Keys & Mouse

Gui.Draw()

SHOWSCREEN

UNTIL FALSE

ENDFUNCTION



Und das GUI Modul wo ich grad dran bin
Code (glbasic) Select

// --------------------------------- //
// Project: MRGUI
// Start: Thursday, April 19, 2012
// IDE Version: 10.283

TYPE TGui
x1
y1
x2
y2
text$
valuei
valuef#
enabled
visible
focus
SubList[] AS TGui

FUNCTION Add: x1,y1,x2,y2,text$

LOCAL G AS TGui

    G_ProcentToReal( x1,y1 , x1,y1 )
    G_ProcentToReal( x2,y2 , x2,y2 )

G.x1=x1
G.y1=y1
G.x2=x2
G.y2=y2
G.text$=text$
G.valuei=0
G.valuef#=0.0
G.enabled=TRUE
G.visible=TRUE
G.focus=FALSE

DIMPUSH self.SubList[], G

ENDFUNCTION

FUNCTION Draw:

IF self.visible=TRUE

LOCAL w,h
w=(self.x2-self.x1)+1
h=(self.y2-self.y1)+1

LOCAL vx,vy,width,height
        GETVIEWPORT vx,vy,width,height //merken
VIEWPORT self.x1,self.y1,w,h

DRAWRECT 0,0,w,h,RGB(0,0,64) //Hintergrund

//Rahmen
DRAWLINE 0,0,w-1,0,RGB(255,255,255) //Oben
DRAWLINE 0,0,0,h-1,RGB(255,255,255) //Links
DRAWLINE 0,h-1,w-1,h-1,RGB(128,128,128) //Unten
DRAWLINE w-1,0,w-1,h-1,RGB(255,255,255) //Rechts

PRINT self.text$,0,0 //BitmapFont

VIEWPORT vx,vy,width,height //wieder herstellen

//----------------------------------------------- Unterliste

LOCAL G AS TGui
FOREACH G IN SubList[]
G.Draw()
NEXT

ENDIF

ENDFUNCTION //Draw

FUNCTION Update: mx,my,b1,b2,bm,wheel,keyasc$

//...
//Wenn sichtbar und enabled und Focus bei Textbox den Text verändern

//untere aufrufen
LOCAL G AS TGui
FOREACH G IN SubList[]
G.Update(mx,my,b1,b2,bm,wheel,keyasc$)
NEXT

ENDFUNCTION //Uodate

FUNCTION CreateWindow: x1,y1,x2,y2,text$

Add(x1,y1,x2,y2,text$)

ENDFUNCTION

FUNCTION CreateLabel: x1,y1,x2,y2,text$

Add(x1,y1,x2,y2,text$)

ENDFUNCTION

FUNCTION CreateButton: x1,y1,x2,y2,text$

Add(x1,y1,x2,y2,text$)

ENDFUNCTION

FUNCTION CreateSlider: x1,y1,x2,y2,text$

Add(x1,y1,x2,y2,text$)

ENDFUNCTION

FUNCTION CreateList: x1,y1,x2,y2,text$

Add(x1,y1,x2,y2,text$)

ENDFUNCTION

FUNCTION G_CreateCheckbox: x1,y1,x2,y2,text$

Add(x1,y1,x2,y2,text$)

ENDFUNCTION

FUNCTION CreateOption: x1,y1,x2,y2,text$

Add(x1,y1,x2,y2,text$)

ENDFUNCTION

FUNCTION CreateFrame: x1,y1,x2,y2,text$

Add(x1,y1,x2,y2,text$)

ENDFUNCTION

FUNCTION CreateItem: x1,y1,x2,y2,text$

Add(x1,y1,x2,y2,text$)

ENDFUNCTION

ENDTYPE //Gui

FUNCTION G_ProcentToReal: px#,py#,BYREF x,BYREF y

LOCAL vx,vy,width,height
GETVIEWPORT vx,vy,width,height

px=px/100.0
py=py/100.0

x=px*width
y=py*height

    //DEBUG "px " + px + " py " +py +" x " + x + " y " +y  +"\n"

ENDFUNCTION




backslider

Huh?

Ich bin mir sicher, dass das mal ging! Oo

EDIT: Der Fehler liegt auf jeden Fall nicht an der Deklaration...

backslider

Also das hier geht bei mir ... Ich verstehs auch gerad nicht :D
Code (glbasic) Select
TYPE TTest
test AS TTest
tests[] AS TTest
ENDTYPE

Markus

Bei mir kommt mit deinem Beispiel beim compilieren

*** Configuration: WIN32 ***
precompiling:
GPC - GLBasic Precompiler V.9.829 SN:471f0175 - 2D, WIN32
"Test.gbas"(1) error : type member is defined recursively : test

Markus

Haste auch den gleichen gcc Compiler ???

GLBasic IDE, Version: 10.283
GLBasic SDK - Editor

Copyright ©2011 Dream Design Entertainment Software
Webpage: www.glbasic.com

Contains gcc versions: 3.4.2, 3.3.3, 4.0.1, 4.0.2 which are Copyright ©2007 Free Software Foundation, and licensed under the GPL.
See www.glbasic.com/main.php?site=gcc for more info.

backslider

Jo habe denselben... Ich glaube eher das lag daran, dass ich deinen Type darunter hatte...

Gernot?

Markus

Edit:
Hm ,für Windows gibt es wohl nur MinGW und da hab ich nur die gefunden
mingw-get-inst-20111118.exe

Aber an den GLBasic\Compiler Unterordner möchte ich nicht dran rumfummeln.
Der scheint dort von 2008 zu sein.

:help:

backslider

Würde ich dir auch raten, das nicht zu tun. :P

Markus

Plan B geht auch nicht , kommt auch ...

*** Configuration: WIN32 ***
precompiling:
GPC - GLBasic Precompiler V.9.829 SN:471f0175 - 2D, WIN32
"Test.gbas"(2) error : type member is defined recursively : Listx

Code (glbasic) Select

TYPE TList
    a=0
Listx[] AS TTest
b=0

FUNCTION Add:A AS TTest
DIMPUSH self.Listx[],A
ENDFUNCTION

ENDTYPE

TYPE TTest
x
y
Listy AS TList

FUNCTION Add: a AS TTest
self.Listy.Add(a)
ENDFUNCTION

ENDTYPE

Schranz0r

Code (glbasic) Select
TYPE Bla
X;Y;Z
    ID
    //usw
    FUNCTION Add:
DIMPUSH Blub[], self
  ENDFUNCTION
ENDTYPE

GLOBAL Blub[] AS Bla



So würde ich es machen... Ausm Bauch raus!
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Markus

Ich brauche aber eine Struktur mit einer Liste welche die gleiche Struktur merken kann.
Ist wichtig für das GUI was ich grad mache.
Als Beispiel, wenn das Fenster unsichtbar ist braucht man den rest drunter nicht malen.
Wäre eine Liste unsichtbar,braucht mal die Items nicht malen.
Wenn ich das Fenster verschiebe kann ich alle Unterdinger mit verschieben.
Wenn eine Liste aus geschaltet ist sind es die unter Items quasi auch.

Vieleicht macht der Vorkompiler aus dem Basic komischen C Quelltext das der dann nicht verstanden wird oder der Compiler hat ein Bug.

EDIT: Ich nehme jetzt eine gesamt Liste das ich weiter komme

Markus

Habe die Hirachie über eine Connect Liste gemacht.
Ich weiß es sieht noch häßlich aus aber es wird :-)
Das mit dem Viewport im Viewport wird noch ein gezauber aber ich weiß was ich will  8)
Die Pos. der Steuerelemente habe ich in % angegeben und umgerechnet, damit kann man viel einfacher eine Maske aufbauen.

[attachment deleted by admin]

kanonet

Rekursive Typedeklaration geht nicht und ging nach meiner Kenntnis auch nie. Backsliders Beispiel geht bei mir auch nicht, kA, warum es bei ihm gehen soll...
Connected Liste ist der beste Weg zum das zu erledigen.

Kurze Erklärung, warum es gar nicht gehen kann:
In BB z.B. geht es, jedoch müssen neue Instanzen eines Types dort immer mir einem NEW Operator deklariert werden, bevor man sie nutzen kann, Beispiel in Pseudo-Code, Übertragung von BB auf GLB:
Code (glbasic) Select
TYPE Ta
t as Ta
i
ENDTYPE

b as Ta
NEW b
b.i=3

// zum nutzen von b.t wird ein weiteres NEW benötigt:
NEW b.t

// für jede weitere Instanz ebenfalls...
NEW b.t.t...

In GLB wird ein solcher NEW Operator nicht benötigt (genauer: existiert nicht), da hier ein Type immer vollständig deklariert wird, sobald eine Variable deklariert wird:
Code (glbasic) Select
TYPE Ta
i
ENDTYPE

b as Ta
b.i=3

Ein Type wird immer vollständig deklariert, inklusive aller Untertypes!:
Code (glbasic) Select
TYPE Tb
i
a as Ta
ENDTYPE

c AS Tb
c.i=3
c.a.i=5

Hatte man jetzt einen rekursiven Type, dann hätte man automatisch unendlich viele Types dieses Types, schließlich führt die Deklaration dieses Types dazu, dass eine weitere Instanz deklariert werden muss, dies führt dazu, dass eine weitere Instanz deklariert werden muss, dies führt dazu, dass eine weitere Instanz deklariert werden muss, dies...
Ich denke, du siehst das Problem. ;)
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64