Types
Übersicht

![]() |
PddBetreff: Types |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo.
Ich bin momentan dabei, etwas mit Types zu machen, da ich mit Bmax neu angefangen habe. Im grunde genommen geht es darum, wie ich ein Type lösche kann? Denn Delete funktioniert nicht mehr. Ausserdem habe ich eine Liste a:TList = new TList erstellt. In dieser Liste lege ich mit a.AddLast(player:TPlayer) ab. Wenn ich diesen Eintrag jetzt aber entferenen will, wie geht das? Thx schonmal ![]() |
||
Lieber Apfel als Birne. |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
a.remove(eintragsreferenz)
Wenn du die liste loswerden möchtest, einfach = null setzen und dafür sorgen das auch sonst nichts darauf verweist. Der GarbageCollector von BlitzMax entsorgt nicht mehr referenzierte Objekte selbstständig. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Pdd |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hm erstma danke, das funktioniert schon, nur leider habe ich folgendes:
Code: [AUSKLAPPEN] Global myWin:TWindow = new TWindow Und dann: Code: [AUSKLAPPEN] myWin.Close() Also wie kann ich innerhalb einer Methode von TWindow das "myWin" (welches ja ein Type ist) löschen?. //EDIT: Mir ist eingefallen, ads ich ja myWin = myWin.Close() machen könnte und dann eben null returnen. Allerdings geht das auch net, weil ich eben Alle Pbjekte in einer Schleife abarbeite, also komme ich so an das originale Objekt nich ran, wenn ihr versteht, was ich meine ![]() |
||
Lieber Apfel als Birne. |
![]() |
d-bug |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] Type MyType
Method Close () MyType.Free(Self) End method Function Free (mt:MyType) MyList.Remove(mt) '<-- verbessert nach Dreamoras Post mt = null End function End Type So sollte es gehen... |
||
- Zuletzt bearbeitet von d-bug am Mo, Dez 11, 2006 23:05, insgesamt einmal bearbeitet
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Bei dem code würde es prinzipiell genullt.
Grund: Es hat keine Referenz. Solange das objekt nicht in einer liste gespeichert ist oder so ist es sowieso direkt weg. In der Free müsste also primär list.remove(mt) stehen. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
d-bug |
![]() Antworten mit Zitat ![]() |
---|---|---|
Verzeihung, hatte überlesen, dass er es in eine TList eintrug. | ||
![]() |
Pdd |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also das hat auch net funktioniert, ich werde es jetzt etwas ausführlicher schreiben:
Code: [AUSKLAPPEN] Type TWindow
... Method Close(DeleteChilds:Byte = 1) If DeleteChilds = 1 Then ' Alle Buttons des Fensters löschen For Local btn:TButton = EachIn LGUI_Buttons If btn.Window = WindowID Then LGUI_Buttons.FindLink(btn:TButton) LGUI_Buttons.Remove(btn:TButton) btn = Null EndIf Next ' Das Fenster selbst löschen LGUI_Windows.FindLink(win:TWindow) LGUI_Windows.Remove(win:TWindow) win = Null Return Null Else LGUI_Windows.FindLink(win:TWindow) LGUI_Windows.Remove(win:TWindow) win = Null Return Null End If End Method ... End Type ... Global LGUI_Windows:TList = New TList Global LGUI_Buttons:TList = New TList Global MyWin:TWindow = PGUI_CreateWindow("Hallo", 100, 100, 300, 200, 1, 1, 1 ) Und hier ist jetzt der Code, der die Fenster/Buttons updatet. Code: [AUSKLAPPEN] Function PGUI_Update() ' Alle Fenster For Local win:TWindow = EachIn LGUI_Windows If win.Visible = 1 Then If win.Minimized = 0 Then ... Else ... EndIf ' Für die Leisten-Buttons: Local btn_anzahl:Int = 0 ' Schließen-Button If win.CloseBtn = 1 Then ... If (MouseX() > (win.X + win.XSize - (btn_anzahl*15))) And (MouseX() < (win.X + win.XSize + 15 - ((btn_anzahl)*15))) And (MouseY() > win.Y) And (MouseY() < (win.Y + 17)) And (MouseHit(MOUSE_LEFT)) Then win.close(1) ' HIER WIRD DIE FUNKTION AUFGERUFEN! DAS HEIST, ich verbinde das locale win mit dem Type aus der Liste!!! D.h. MyWin ist hier garnicht dabei! Aber dieses will ich auch löschen! DrawText "SChliesen", 1, 1 EndIf EndIf ... EndIf Next End Function |
||
Lieber Apfel als Birne. |
klepto2 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Code: [AUSKLAPPEN] Type TMyWindow Global List:TList = New TList Function Create:TMyWindow() Local Win:TMyWindow = New TMyWindow TMyWindow.List.Addlast(Win) Return Win End Function Method CLose() TMYWindow.Remove(Self) End Method Function Free(mt:TMyWindow) mt.Close() mt = Null End Function End Type so würde ich es in etwa machen. Wie von Dreamora schon angesprochen: das wichtigste ist alle Referenzen auf das Objekt zu Nullen. Sonst bleibt das Objekt ewig im Speicher und du wirst irgendwann riesige MemLeaks bekommen. |
||
Matrix Screensaver
Console Modul für BlitzMax KLPacker Modul für BlitzMax HomePage : http://www.brsoftware.de.vu |
![]() |
Pdd |
![]() Antworten mit Zitat ![]() |
---|---|---|
Erstma danke, Klepto, also ich hab jetzt meine ganze Struktur nocheinmal etwas verworfen ![]() Wenn ich Das Window mit Code: [AUSKLAPPEN] TWindow.Free(MyWin) Lösche, funktioniert das zwar, ABER ich will auch alle im Fenster erstellten Buttons, etc. löschen. Da das nur eine ganz kleine GUI wird, gibts da zwar net viel zu löschne, aber immerhin einiges ![]() |
||
Lieber Apfel als Birne. |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Löschen aller Untergadgets: Das setzt voraus, dass du auch ein field childs:TList = new TList hast wo du jeweils alle gadgets reinspeicherst.
Dann wenn das Window gefreet werden soll, musst du für alle elemente der Liste auch free aufrufen und danach einfach childs.clear(); childs = null machen. Was den zweiten Fehler betrifft: Hast du in TWindow ein global List:TList = new TList drin? sonst bringt das nämlich nicht viel ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Pdd |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, das 2. hab ich schon selbst gelöst ![]() Nund, aber wenn ich eine Liste mit Childs erstelle, dann lösche ich ja auch nur die Referenzen der Childs in der Liste! Ich will aber auch alle Anderen Referenzen (die z.b. mit MyNewTollButton = Tbutton.Create()) erstellt werden, löschen! Geht das überhaupt? |
||
Lieber Apfel als Birne. |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du kannst ja in deinem Destruktor für den Type (also deiner Free-methode) genau festlegen welche Dinge gelöscht werden sollen. Prinzipiell bietet es sich an jedem Window eine Liste mit allen darin erstellten gadgets zu speichern. Wird das Fenster zerstört nullst du einfach die liste mit clear.
Da du alle gadgets nur darin hast werden sie also automatisch entsorgt. |
||
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 |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Pdd hat Folgendes geschrieben: Ja, das 2. hab ich schon selbst gelöst
![]() Nund, aber wenn ich eine Liste mit Childs erstelle, dann lösche ich ja auch nur die Referenzen der Childs in der Liste! Ich will aber auch alle Anderen Referenzen (die z.b. mit MyNewTollButton = Tbutton.Create()) erstellt werden, löschen! Geht das überhaupt? Ich hoffe du meinst damit nicht, dass du deine Gadgets etc noch an anderen Orten gespeichert hast als in der Childlist des entsprechenden Fensters. Das wäre dann wirklich ein ernsthaftes Problem, dann würde das gadget niemals entsorgt. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Pdd |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dreamora hat Folgendes geschrieben: Ich hoffe du meinst damit nicht, dass du deine Gadgets etc noch an anderen Orten gespeichert hast als in der Childlist des entsprechenden Fensters. Das wäre dann wirklich ein ernsthaftes Problem, dann würde das gadget niemals entsorgt.
Es gäbe 2 Referenzen auf das Objekt. Die erste wäre in der Child List des Windows. Die 2. wäre die, die der Coder erstellt (mit Button:TButton = Tbutton.Create() Es ist doch in Bmax immernoch so, das die Variablen nur auf das Type zeigen, aber es nicht sind? |
||
Lieber Apfel als Birne. |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja.
Aber weswegen sollte der Coder eine Referenz auf ein Button erzeugen? Falls er das aber will, muss er dann halt Button.destroy() und button = null machen. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Pdd |
![]() Antworten mit Zitat ![]() |
---|---|---|
Naja, weil man die Buttons, Windows, etc. halt erstellt!
Also: Code: [AUSKLAPPEN] Button_1:Tbutton = TButton.Create() Button_2:Tbutton = TButton.Create() Window_1:TWindow = TWindow.create() ... Also erstellt der User eine Referenz! |
||
Lieber Apfel als Birne. |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wie wäre es mit einer Typeinternen globalen Liste ?
Code: [AUSKLAPPEN] Type TWindow
global LWindow:Tlist = new Tlist field LGadgets:Tlist method new() LWindow.addlast(self) LGadgets = new TList end method method delete:TWindow() LWindow.remove(self) LGadgets.clear() 'eigentlich unnötig, da die liste eh gelöscht wird. nur zur Demo return null end method method addgadget(gadget:object) 'Möglichkeit 1 LGadgets.addlast(gadget) end method method addbutton() 'möglichkeit 2 local temp:Tbutton = new tbutton lgadgets.addlast(temp) end method end type type TButton field ... end type Window:Twindow = new Twindow button:tbutton = new tbutton window.addgadget(button) button = null window.addbutton() Ungetestet, sollte aber so stimmen. |
||
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 |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
*nickt* So in etwa dachte ich das oder das new direkt in AddGadget.
Natürlich steht es jedem Programmierer frei, auch eigene Referenzen zu halten nur dann ist nix mit automatisch aufräumen, weil die eigenen Referenzen erst aufgehoben werden müssen, bevor das Objekt entsorgt werden kann. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Pdd |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, ich überlege mir grade auch, ob ich es so machen soll. Aber es wird wohl dabei bleiben, das das Fenster einfach versteckt wird. Nunja, eigene Refereznen brauche ich, weil ich es nicht mit Events mache. Also in etwa so: If MyBtn1.Presssed() then... ![]() |
||
Lieber Apfel als Birne. |
![]() |
Mathias-Kwiatkowski |
![]() Antworten mit Zitat ![]() |
---|---|---|
hi ich habe auch ein kleineres problem mit den types vorher war des so einfach
type user field name$ end type user.user=new user user\name$="Mathias" das war recht einfach. und wie geht genau dieser schritt in b max, habe mir die codes angesehen aber ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group