Types

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Pdd

Betreff: Types

BeitragMo, Dez 11, 2006 22:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
Lieber Apfel als Birne.
 

Dreamora

BeitragMo, Dez 11, 2006 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 11, 2006 22:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Razz
Lieber Apfel als Birne.

d-bug

BeitragMo, Dez 11, 2006 22:50
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 11, 2006 22:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 11, 2006 23:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Verzeihung, hatte überlesen, dass er es in eine TList eintrug.

Pdd

BeitragMo, Dez 11, 2006 23:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 11, 2006 23:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Dez 12, 2006 15:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstma danke, Klepto, also ich hab jetzt meine ganze Struktur nocheinmal etwas verworfen Wink Auf jedenfall funktioniert das mit dem Löschen jetzt immernochnicht. Naja ich versuche es jetzt mal zu erklären:
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 Wink. Nun frage ich in einer Schleife ab, ob die WindowID des Buttons die ID des fensters ist, (d.h., der Button gehört zum Fenster), dann sollte diese Button auch gelöscht werden. Aus der TButton.List ist das ja kein Problem, aber die Referenz auf ihn, die der Benutzer erstellt, die muss ja auch gelöscht werden! Und ich weis innerhlab der schleife ja nicht, welche das ist! GIbt es da eine möglichkeit?
Lieber Apfel als Birne.
 

Dreamora

BeitragDi, Dez 12, 2006 15:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile BM hat keine eigenen internen Listen mehr um Objekte zu speichern.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Pdd

BeitragDi, Dez 12, 2006 15:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, das 2. hab ich schon selbst gelöst Razz
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.

BladeRunner

Moderator

BeitragDi, Dez 12, 2006 17:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Dez 12, 2006 19:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Pdd hat Folgendes geschrieben:
Ja, das 2. hab ich schon selbst gelöst Razz
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

BeitragDi, Dez 12, 2006 19:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Dez 12, 2006 19:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Dez 12, 2006 20:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

BladeRunner

Moderator

BeitragDi, Dez 12, 2006 22:22
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Dez 12, 2006 23:08
Antworten mit Zitat
Benutzer-Profile anzeigen
*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

BeitragMi, Dez 13, 2006 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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... Smile Trotzdem danke!
Lieber Apfel als Birne.

Mathias-Kwiatkowski

BeitragDo, Jan 04, 2007 2:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Rolling Eyes da sieht man ja gar nicht mehr durch im type auf einmal ne function Oo is bmax so abgekapselt von BB?

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group