Types verschachteln (für Anfänger)

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Silvio

Betreff: Types verschachteln (für Anfänger)

BeitragFr, Jan 25, 2013 19:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab jetzt schon mehrere Threads hier gelesen über Types verschachteln und es immernoch nicht kapiert.

Was ich brauche:
Ein Type, das ein Type als Field hat.
Beispiel:
Ich hab Dateien von verschieden großen Maps. Also haben verschiedene große Maps ne unterschiedliche Anzahl von Daten die ich aus den Maps lade. Ich lege für jede Mapdatei ein Typ an und jetzt will ich innerhalb dieses Types ein Feld haben, das ich eben beliebig oft erstellen kann, da ich ja schlecht pro map 100x100 felder im Type fest legen kann.

Ich hab jetzt bloß keine ahnung wie ich das hinschreibe, also wie das auszusehen hat, wenn ich ein Type festlege mit nem Type als Feld. Oder wie ich dann beim durchgehen durch alle Types genau die richtigen "Unter-Types" anspreche.

Kann mir das bitte jemand ganz allgemein erklären?
Danke für die Hilfe.
 

Silvio

BeitragFr, Jan 25, 2013 20:05
Antworten mit Zitat
Benutzer-Profile anzeigen
okay ich hab ne Lösung für mein Problem gefunden, aber nicht so wie ich eigentlich dachte.

Ich hab jetzt einfach 2 Types. Eins für die Map allgemein und das andere für die Dateneinheiten in der Map. Jetzt geb ich einfach den Dateneinheiten einen Index von ner bestimmten Map so kann ich auf die bestimmten Daten zugreifen. Hab erst gemacht, dass kann man speziell mit verschachtelten Types machen, aber das kapier ich immernoch nicht, aber muss ich ja jetzt auch erstmal nicht Very Happy

Mathias-Kwiatkowski

BeitragFr, Jan 25, 2013 20:13
Antworten mit Zitat
Benutzer-Profile anzeigen
meinst du z.b. sowas...

das ist so ne art gui, bzw ein test dazu in blitzplus
das kannste so kopieren und auch starten

Code: [AUSKLAPPEN]
Graphics 1024,768
Global ScreenW%=1024, ScreenH%=768
SetBuffer(BackBuffer())

Global MBL%,KlickMX%,KlickMY%

Type TWindow
   Field GadGet.TWindow
   Field X%,Y%,W%,H%,Activ%,Scale%,Close%
   Field Name$
End Type
Function CreateGuiWindow.TWindow(Name$,X%,Y%,W%,H%,Close%=0,Scale%=0)
   Local win.TWindow
   win.TWindow = New TWindow
   win\X=X
   win\Y=Y
   win\W=W
   win\H=H
   win\Scale=Scale
   win\Name=Name
   
   win\GadGet=win
   Return win.TWindow
End Function
Function DrawWindow()
   Local win.TWindow
   Local WinID%=0
   For win.TWindow=Each TWindow
      Local KillWindow%=0
      Color 255,255,255
      Line win\X,win\Y,win\X+win\W ,win\Y
      Line win\X,win\Y,win\X ,win\Y+win\H
      Color 0,0,0
      Line win\X+win\W,win\Y,win\X+win\W,win\Y+win\H
      Line win\X,win\Y+win\H,win\X+win\W,win\Y+win\H
      Color 15,95,95
      If win\Activ=1 Then Color 20,140,140
      Rect win\X+1,win\Y+1,win\W-1,win\H-1
      Color 0,0,0
      Line win\X+5 , win\Y+5, win\X+win\W-5,win\Y+5
      Line win\X+5,win\Y+5,win\X+5,win\Y+StringHeight("W")+1+5
      Color 255,255,255
      Line win\X+5,win\Y+5+StringHeight("W")+1,win\X+win\W-5,win\Y+5+StringHeight("W")+1
      Line win\X+win\W-5,win\Y+5,win\X+win\W-5,win\Y+StringHeight("W")+1+5
      Color 0,0,100
      If win\Activ=1 Then Color 0,0,150
      Rect win\X+6,win\Y+6,win\W-6-6+1,StringHeight("W")
      
      If win\Scale=1 Then
         Color 255,0,0
         Line win\X+win\W-7,win\Y+win\H,win\X+win\W,win\Y+win\H
         Line win\X+win\W,win\Y+win\H-7,win\X+win\W,win\Y+win\H
         Line win\X+win\W-7,win\Y+win\H,win\X+win\W,win\Y+win\H-7
      EndIf
      
      
      Viewport (win\X+5,win\Y+5, win\W,StringHeight("W")+5)
      
      If win\Close>0 Then
         Color 128,0,0
         If win\Activ=1 And MouseX()>win\X+win\W-5-StringWidth("X")-2 And MouseX()<win\X+win\W-5-2 And MouseY()>win\Y+5 And MouseY()<win\Y+5+StringHeight("W") Then
            Color 255,0,0
            win\Close=2
         EndIf
         Text win\X+win\W-5-StringWidth("X")-2,win\Y+5,"X"      
         
         Viewport (win\X+5,win\Y+5, win\W-5-StringWidth("X")-2-3,StringHeight("W")+5)
      EndIf

      
      Color 0,0,0
      Text win\X+5+2,win\Y+5,win\Name
      Color 190,190,0
      Text win\X+5+1+2,win\Y+5+1,win\Name
      
      Viewport (win\X+1,win\Y+5+StringHeight("W")+2, win\W-1,win\H-(5+StringHeight("W")+2))
      
      If MouseX()>win\X And MouseX()<win\X+win\W And MouseY()>win\Y And MouseY()<win\Y+win\H And WindowOver(WinID)=0  Then
         If MBL=1 Then
            If win\Activ=0 Then
               Local win2.TWindow
               For win2.TWindow =Each TWindow
                  win2\Activ=0
               Next
               Insert win After Last TWindow
               win\Activ=1
               MBL=100
            Else
               If MouseX()>win\X And MouseX()<win\X+win\W And MouseY()>win\Y And MouseY()<win\Y+StringHeight("W")+5+1   Then
                  KlickMX=MouseX()-win\X
                  KlickMY=MouseY()-win\Y
                  MBL=2
               EndIf
               If MouseX()>win\X+win\W-7 And MouseX()<win\X+win\W And MouseY()>win\Y+win\H-7 And MouseY()<win\Y+win\H And win\Scale=1  Then
                  MBL=3
               EndIf
               If win\Close>0 Then
                  If win\Activ=1 And MouseX()>win\X+win\W-5-StringWidth("X")-2 And MouseX()<win\X+win\W-5-2 And MouseY()>win\Y+5 And MouseY()<win\Y+5+StringHeight("W") Then
                     If win\Close=2 Then KillWindow%=1
                  EndIf
                  Text win\X+win\W-5-StringWidth("X")-2,win\Y+5,"X"         
               EndIf
            EndIf
         EndIf
      Else
         If MBL=1 Then win\Activ=0
      EndIf
      
      If MBL=2 And win\Activ=1 Then
         win\X=MouseX()-KlickMX
         win\Y=MouseY()-KlickMY
      EndIf
      
      If MBL=3 And win\Activ=1 Then
         win\W=MouseX()-win\X
         win\H=MouseY()-win\Y
      EndIf
      
      If KillWindow=1 Then Delete win
      WinID%=WinID%+1
      
      Viewport 0,0,ScreenW,ScreenH
   Next
   
   
End Function
Function WindowOver(ID%)
   Local win1.TWindow
   Local WinIDX%=0
   For win1.TWindow=Each TWindow
      If MouseX()>win1\X And MouseX()<win1\X+win1\W And MouseY()>win1\Y And MouseY()<win1\Y+win1\H And WinIDX>ID  Then
         Return 1
      EndIf
      WinIDX%=WinIDX%+1
   Next
   Return 0
End Function
Function SetWindowScale(Window.TWindow,Enable%=1)
   Local win.TWindow
   For win.TWindow=Each TWindow
      If win\GadGet=Window Then win\Scale=Enable
   Next
End Function
Function SetWindowClose(Window.TWindow,Enable%=1)
   Local win.TWindow
   For win.TWindow=Each TWindow
      If win\GadGet=Window Then win\Close=Enable
   Next
End Function
Function SetWindowCoords(Window.TWindow,X%=-1,Y%=-1,W%=-1,H%=-1)
   Local win.TWindow
   For win.TWindow=Each TWindow
      If win\GadGet=Window Then
         If X>-1 Then win\X=X
         If Y>-1 Then win\X=Y
         If W>-1 Then win\X=W
         If H>-1 Then win\X=H
      EndIf
   Next
End Function





ShowPointer

Function UpdateGUI()
   DrawWindow()
   
   If MouseDown(1) And MBL=0 Then MBL=1
   If Not MouseDown(1) Then MBL=0
End Function

Global Fenster0.TWindow
Fenster0.TWindow =CreateGuiWindow("Test",50,50,100,100)
SetWindowScale(Fenster0,1)
SetWindowClose(Fenster0,1)

Fenster1.twindow=CreateGuiWindow("Mathias",70,70,100,100)
Fenster2.twindow=CreateGuiWindow("Mathias 1",90,90,100,100)
Fenster3.twindow=CreateGuiWindow("Mathias 2",110,110,100,100)
Fenster4.twindow=CreateGuiWindow("Mathias 3",130,130,100,100)
Fenster5.twindow=CreateGuiWindow("Mathias 4",150,150,100,100)
Fenster6.twindow=CreateGuiWindow("Mathias 5",170,170,100,100)

f#=0
time=MilliSecs()

Repeat
   Cls
   Color 200,190,230
   Rect 0,0,GraphicsWidth(),GraphicsHeight()
   Color 255,255,255
   UpdateGUI
   Color 0,0,0
   ;Schleife Beginn
   f=f+1
   Text 1,1,Int(f#/(MilliSecs()-time)*1000 )
   ;Schleife Ende
   Flip
   
Until KeyDown(1)
End





EDIT:
wichtig ist vieleicht:
Code: [AUSKLAPPEN]
Type TWindow
   Field GadGet.TWindow
   Field X%,Y%,W%,H%,Activ%,Scale%,Close%
   Field Name$
End Type
Function CreateGuiWindow.TWindow(Name$,X%,Y%,W%,H%,Close%=0,Scale%=0)
   Local win.TWindow
   win.TWindow = New TWindow
   win\X=X
   win\Y=Y
   win\W=W
   win\H=H
   win\Scale=Scale
   win\Name=Name
   
   win\GadGet=win
   Return win.TWindow
End Function


über das return wird ausgegeben um was es sich handelt darum imcreateguiwindow auch das .TWindow

dann kann man es so nutzen:
Code: [AUSKLAPPEN]
Global Fenster0.TWindow =CreateGuiWindow("Test",50,50,100,100)


nun könnte man hingehen und abfragen x achse vom Fenster0 ca so:

Code: [AUSKLAPPEN]
Function SetWindowCoords(Window.TWindow,X%=-1,Y%=-1,W%=-1,H%=-1)
   Local win.TWindow
   For win.TWindow=Each TWindow
      If win\GadGet=Window Then
         If X>-1 Then win\X=X
         If Y>-1 Then win\X=Y
         If W>-1 Then win\X=W
         If H>-1 Then win\X=H
      EndIf
   Next
End Function


der aufruf wäre dann so:
Code: [AUSKLAPPEN]
SetWindowCoords(Fenster0,10,10,300,400)

Xeres

Moderator

BeitragFr, Jan 25, 2013 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
@Mathias-Kwiatkowski: In wie fern soll der Code relevant sein? "win\GadGet=win" sieht komisch aus - wozu sollte ein type sich selbst enthalten? Wenn du den Link zu einem Type bereits hast, warum willst du mit for..each den link nochmal wiederfinden? Das sind unzählige unsinnige Operationen.

@Silvio: Ohne den Code dazu gesehen zu haben, hört es sich nach der richtigen Lösung an. Man muss sich den Starteintrag merken und bewegt sich so lange nach unten in der zweiten typeliste, bis der Subtype nicht mehr dem richtigen Parent gehört.
Simpler geht es halt nicht, weil BB nett zu Anfängern sein will und die Dinge selbst verwaltet... zur Verwirrung vieler Anfänger.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Mathias-Kwiatkowski

BeitragFr, Jan 25, 2013 21:03
Antworten mit Zitat
Benutzer-Profile anzeigen
das kann sein aber das ist ein uralt code von vor knapp 8 jahren ^^

ihm ging es ja nur darum den type anhängig zu machen

was eigentlich mit return ging. bzw geht.

fazit. das ist hier genau das richtige was ihm fehlt
Code: [AUSKLAPPEN]
Type TWindow
   Field GadGet.TWindow
   Field X%,Y%,W%,H%,Activ%,Scale%,Close%
   Field Name$
End Type
Function CreateGuiWindow.TWindow(Name$,X%,Y%,W%,H%,Close%=0,Scale%=0)
   Local win.TWindow
   win.TWindow = New TWindow
   win\X=X
   win\Y=Y
   win\W=W
   win\H=H
   win\Scale=Scale
   win\Name=Name
   
   win\GadGet=win
   Return win.TWindow
End Function


um genauer zu werden.
Code: [AUSKLAPPEN]
CreateGuiWindow.TWindow
Return win.TWindow


damit der return im -> CCC steht ( CCC.TWindow ) somit sind einfachere abfragen möglich. ich habe nur ein alten code genommen, mehr nicht. er suchte gewiss auch keine gui. nur die abfrage^^

BladeRunner

Moderator

BeitragFr, Jan 25, 2013 21:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Matthias, wie du selbst feststellst ist der Code nicht optimal. Damit verwirrst du aber unter Umständen mehr als das du hilfst.
Daher möchte ich dich bitten wenn Du denn helfen willst ein kurzes, einfaches und nur das Problem betreffendes Beispiel zu verfassen. Danke.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Silvio

BeitragFr, Jan 25, 2013 21:55
Antworten mit Zitat
Benutzer-Profile anzeigen
ja hat mich nur verwirrt Very Happy
ist im Grunde vielleicht das richtige, aber das Beispiel ist doch was ganz anderes, was mich eher verwirrt. Wollte ja eigentlich was ganz allgemein so in die Richtung:
a.blabla = new blabla.

Weil ich die Schreibweise an sich nicht kannte für verschachtelte Types und ich dachte, dass das die Lösung ist.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group