Einträge verschwinden nicht aus Liste...

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Firstdeathmaker

Betreff: Einträge verschwinden nicht aus Liste...

BeitragMi, Apr 26, 2006 19:43
Antworten mit Zitat
Benutzer-Profile anzeigen
So, hab ein etwas schwereres Problem. Nachdem ich jetzt schon ne Weile an meinem Spiel sitze, der Code also auch schon entsprechend gewachsen ist dass ich hier nicht mehr alles posten kann, ist ein dummer Fehler aufgetaucht den ich absolut nicht mehr nachvollziehen kann. Folgendes: Ich habe eine einfache GUI programmiert, die meine Buttons/Schalter verwaltet. Mit dieser GUI wollte ich nun auch das Kaufmenü machen, aber leider taucht jetzt folgender Fehler auf:

Die Buttons, als Typeeinträge in der TList "CGGUI_OBJECTS:TList" gespeichert werden irgendwie nur noch halb gelöscht. Ich habe das ganze mal isoliert nachgecodet, aber da taucht der Fehler nicht auf. Jetzt ist meine Frage, ob ich das so überhaupt richtig verstanden habe, wenn Typeeinträge nirgendwo mehr stehen, dann werden die doch aus dem Speicher gelöscht, oder? Also ist dieser Code doch so sauber?

Code: [AUSKLAPPEN]
G:GUI = New GUI
B:GUI_Button = G.CreateButton("Testbutton")
B.Kill

C:GUI_Button = B

For B:GUI_Button = EachIn G.GObjects
   DebugLog B.Name
Next






Type GUI
   Field GObjects:TList
   
   Method New()
      Self.GObjects:TList = New TList
   End Method
   
   Method CreateButton:GUI_Button(Name$)
      B:GUI_Button = New GUI_Button
      B.Name = Name
      B.GUI = Self
      Self.GObjects.Addlast(B)
      Return B
   End Method
End Type


Type GUI_Button
   Field GUI:GUI
   Field Name:String
   
   Method Kill()
      ListRemove(GUI.GObjects,Self)
      Self.GUI = Null
   End Method
End Type



Nur in meinem Spiel ist die Situation so, dass zwar der Befehl "Kill" bei GUI_Button ausgeführt wird, dieser aber immer noch als Eintrag in der Liste der GUI aufgeführt wird (obwohl ich ihn ja, wie im Beispiel angegeben, mit "ListRemove" aus der Liste entferne) und somit nachher bei der Aktualisierung zu einer Fehlermeldung führt weil ich ja in der Kill Funktion auch die im Typefeld gespeicherte zugehörige Verbindung zur GUI genullt habe.
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

Dreamora

BeitragMi, Apr 26, 2006 19:55
Antworten mit Zitat
Benutzer-Profile anzeigen
hast du eventuell die compare methode überschrieben?
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Firstdeathmaker

BeitragDo, Apr 27, 2006 14:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, selbst wenn, was würde das daran ändern dass Befehle nicht mehr aus der Liste verschwinden? Noche etwas ist komisch: Wenn ich den Befehl ListRemove(GUI.GObjects,Self) zweimal hinein schreibe, wird der Eintrag zunächst richtig gelöscht, wenn ich es allerdings öfters lösche und neu erstelle werden nach einer Weile auch mehrere willkürlich gelöscht, obwohl doch eigendlich nur der eine gelöscht werden könnte (weil ich ja mit "self" als Parameter arbeite).
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Jolinah

BeitragDo, Apr 27, 2006 15:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest ein TLink-Objekt im Button-Typ speichern. Bei dem kannst du dann nur die Remove-Methode aufrufen, und das Objekt wird aus der Liste entfernt. Ist vielleicht nicht der beste Weg, aber es funktioniert Wink

Ein Beispiel:

Code: [AUSKLAPPEN]
Type GUI
   Field GObjects:TList
   
   Method New()
      Self.GObjects:TList = New TList
   End Method
   
   Method CreateButton:GUI_Button(Name$)
      B:GUI_Button = New GUI_Button
      B.Name = Name
      B.GUI = Self
      B._link = GObjects.Addlast(B)
      Return B
   End Method
End Type


Type GUI_Button
   Field GUI:GUI
   Field Name:String
   Field _link:TLink
   
   Method Kill()
      If _link <> Null Then _link.Remove()
   End Method
End Type



Bezüglich Objekt aus dem Speicher löschen:
Code: [AUSKLAPPEN]
G:GUI = New GUI
B:GUI_Button = G.CreateButton("Testbutton")
B.Kill


Die Kill-Methode entfernt nur den Eintrag in der Liste, die Variable B zeigt aber noch immer auf das Objekt, also wird es nicht aus dem Speicher entfernt. Um es aus dem Speicher zu entfernen muss B auch noch auf Null gesetzt werden.

Firstdeathmaker

BeitragDo, Apr 27, 2006 16:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Zum ersten: Wo genau ist jetzt der Unterschied wenn ich den Link mit B._link = GObjects.Addlast(B) im Buttontype abspeichere und den nachher mit _link.Remove() entferne zu der Weise wie ich es erst angefangen habe, dass ich den Buttontypeeintrag per ListRemove(GUI.GObjects,Self) aus der Liste entferne?

Und zum zweiten: Ja, ist klar dass das Objekt noch nicht gelöscht wird wenn es noch mit einer Variable verknüpft ist, dass ist auch so absicht gewesen, ich wollte testen ob der Button vielleicht deshalb nicht richtig aus der Liste entfernt wird weil er irgendwoanders noch abgespeichert ist, aber das scheint nicht der Fall zu sein im Beispiel.
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Jolinah

BeitragDo, Apr 27, 2006 17:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Unterschied ist, dass mit TLink nicht die ganze Liste nach dem Objekt durchsucht werden muss, welches du entfernen willst. Pro Listeneintrag gibt es einen dazugehörigen Link, der mit dem Objekt in der Liste verbunden ist.
 

Dreamora

BeitragDo, Apr 27, 2006 18:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Das überschreiben der compare hätte eine ziemlich verherrende auswirkung. Denn die Compare Rückgabe von 0 wird benutzt um ein item in der liste zu finden zum löschen. Das heisst, man kann damit auch das falsche Objekt löschen, wenn man beim falschen 0 zurück gibt.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Firstdeathmaker

BeitragDo, Apr 27, 2006 20:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, das mit dem TLink leuchtet ein, dass werde ich mir merken. Wieder was dazugelernt. Und das mit der compare Methode ist auch logisch, aber wie gesagt, die überschreibe ich nicht.
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group