BASIC

Author Topic: (erledigt) Types und Liste  (Read 4843 times)

Offline Markus

  • Mr. Polyvector
  • ***
  • Posts: 125
  • Offline
    • View Profile
(erledigt) Types und Liste
« 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 <<< ???

        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
 
« Last Edit: 2012-Apr-21 by Markus »

Offline backslider

  • Community Developer
  • Prof. Inline
  • ******
  • Posts: 892
    • View Profile
So sollte es gehen...
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
 

Offline Markus

  • Mr. Polyvector
  • ***
  • Posts: 125
  • Offline
    • View Profile
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

 


Offline backslider

  • Community Developer
  • Prof. Inline
  • ******
  • Posts: 892
    • View Profile
Huh?

Ich bin mir sicher, dass das mal ging! Oo

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

Offline backslider

  • Community Developer
  • Prof. Inline
  • ******
  • Posts: 892
    • View Profile
Also das hier geht bei mir ... Ich verstehs auch gerad nicht :D
Code: GLBasic [Select]
TYPE TTest
        test AS TTest
        tests[] AS TTest
ENDTYPE

Offline Markus

  • Mr. Polyvector
  • ***
  • Posts: 125
  • Offline
    • View Profile
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

Offline Markus

  • Mr. Polyvector
  • ***
  • Posts: 125
  • Offline
    • View Profile
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.

Offline backslider

  • Community Developer
  • Prof. Inline
  • ******
  • Posts: 892
    • View Profile
Jo habe denselben... Ich glaube eher das lag daran, dass ich deinen Type darunter hatte...

Gernot?

Offline Markus

  • Mr. Polyvector
  • ***
  • Posts: 125
  • Offline
    • View Profile
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:
« Last Edit: 2012-Apr-19 by Markus »

Offline backslider

  • Community Developer
  • Prof. Inline
  • ******
  • Posts: 892
    • View Profile
Würde ich dir auch raten, das nicht zu tun. :P

Offline Markus

  • Mr. Polyvector
  • ***
  • Posts: 125
  • Offline
    • View Profile
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
 

Offline Schranz0r

  • Premium User :)
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 5013
  • O Rly?
    • View Profile
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 1700 @3.9Ghz, 16GB HyperX Fury 2666Mhz Ram, ASUS ROG GTX 1060 STRIX 6GB, Windows 10 Pro 64Bit, MSi Tomahawk B350 Mainboard

Offline Markus

  • Mr. Polyvector
  • ***
  • Posts: 125
  • Offline
    • View Profile
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
« Last Edit: 2012-Apr-19 by Markus »

Offline Markus

  • Mr. Polyvector
  • ***
  • Posts: 125
  • Offline
    • View Profile
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]
« Last Edit: 2012-Apr-20 by Markus »

Offline kanonet

  • Administrator
  • Prof. Inline
  • *******
  • Posts: 1142
    • View Profile
    • My GLBasic code archiv
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