Types verschachteln (für Anfänger)
Übersicht

SilvioBetreff: Types verschachteln (für Anfänger) |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
![]() |
Mathias-Kwiatkowski |
![]() Antworten mit Zitat ![]() |
---|---|---|
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)
|
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Mathias-Kwiatkowski |
![]() Antworten mit Zitat ![]() |
---|---|---|
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^^ |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ja hat mich nur verwirrt ![]() 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. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group