Einträge verschwinden nicht aus Liste...
Übersicht

![]() |
FirstdeathmakerBetreff: Einträge verschwinden nicht aus Liste... |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
hast du eventuell die compare methode überschrieben? | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Firstdeathmaker |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group