![]() |
Fehler bei FreeAndNil(TObjekt)
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
ich programmiere im Moment mein 1. 2D Game mit DelphiX. Die Frage bezieht sich aber eher aufs Allgemeine, deshalb "Sonstige Fragen" und nicht "Multimedia".
Delphi-Quellcode:
Woran kann das liegen? Falls mehr Code benötigt wird, einfach nur sagen.
type
THolz = class(TImageSprite) Public Constructor Create(aparent:Tsprite); override; end; var Holz: Array[1..1] of THolz; ... //Level wir erstellt und auch 1x Holz: Holz[1] := THolz.Create(Sprite.Engine); Holz[1].X := J * 31 + Round((31 - Holz[1].Width) / 2); Holz[1].Y := I * 31 + Round((31 - Holz[1].Height) / 2); Holz[1].Z := 1; Jetzt kommt die ganz gewöhnliche Kollisionsabfrage: procedure TSpieler.DoCollision(Sprite: TSprite; var Done: Boolean); begin //Kollision abfragen If (Sprite is TWand) then Kollision := True; If (Sprite is TPlatzhalter) then Kollision := True; If (Sprite is TZiel) then Ende := True; If (Sprite is THolz) and then begin Kollision := True; If Assigned(Holz[1]) then FreeAndNil(Holz[1]); //Hier kommt die Fehlermeldung (s. Screenshot) frmMain.Player.FileName := 'Forest.wav'; frmMain.Player.Open; frmMain.Player.Play; end; end; Chrissi91 |
Re: Fehler bei FreeAndNil(TObjekt)
Versuch mal
Delphi-Quellcode:
If Assigned(Holz[1]) then
begin aHolz := Holz[1]; FreeAndNil( aHolz); end; |
Re: Fehler bei FreeAndNil(TObjekt)
Gleicher Fehler.
Aber Sachen wie
Delphi-Quellcode:
gehen.
Showmessage(IntToStr(Holz[1].Width));
|
Re: Fehler bei FreeAndNil(TObjekt)
Kommt der Fehler vielleicht schon beim Assigned?
|
Re: Fehler bei FreeAndNil(TObjekt)
Das Komische er mach Folgendes:
Delphi-Quellcode:
Er geht alles durch, spielt auch den sound ab, und beim End gibts dann den Fehler. Nehm ich FreeAndNil raus, klappt es prima. Am sound liegts also nicht.
If (Sprite is THolz) and Assigned(Holz[1]) then
begin Kollision := True; //If Assigned(Holz[1]) then FreeAndNil(Holz[1]); If Assigned(Holz[1]) then begin aHolz := Holz[1]; FreeAndNil(aHolz); end; frmMain.Player.FileName := 'Forest.wav'; frmMain.Player.Open; frmMain.Player.Play; end; So kommt kein Fehler:
Delphi-Quellcode:
Also am Assigned liegts nicht.
If (Sprite is THolz) and Assigned(Holz[1]) then
begin Kollision := True; //If Assigned(Holz[1]) then FreeAndNil(Holz[1]); If Assigned(Holz[1]) then begin //aHolz := Holz[1]; //FreeAndNil(aHolz); end; frmMain.Player.FileName := 'Forest.wav'; frmMain.Player.Open; frmMain.Player.Play; end; |
Re: Fehler bei FreeAndNil(TObjekt)
Wird vielleicht nach dem Zerstören noch darauf zugegriffen?
|
Re: Fehler bei FreeAndNil(TObjekt)
Ich wuerde mal ob die offensichtlich verknuepfte Sprite.Engine nicht versucht auf das bereits erlegte Objekt zuzugreifen. FreeAndNil setzt erst Holz[1] auf nil und gibt erst dann das Objekt frei. Greift Sprite.Engine nun auf Holz[1] zu, so ist dort schon nil enthalten, aber das Objekt hat noch nicht den Destruktor aufgerufen.
Das 66 deutet auf den Aufruf einer virtuellen Methode. |
Re: Fehler bei FreeAndNil(TObjekt)
Anscheinend liegt es daran:
Ich habs einfach anders gemacht: Kollision wird nur 1x abgefragt, danach nie wieder und aus dem THolz habe ich einfach nen andderes Bild rübergemacht |
Re: Fehler bei FreeAndNil(TObjekt)
Da muß ich Robert recht geben. FreeAndNil ist völlig irreführend. Die Funktion sollte NilAndFree heissen, denn es wird tatsächlich die übergebene Instanz zurückgesichert, dann der Parameter Nil gesetzt und erst dann die Instanz freigegeben. Versuch doch mal:
Delphi-Quellcode:
aHolz.Free;
aHolz:=Nil; |
Re: Fehler bei FreeAndNil(TObjekt)
Stimmt. Aber warum ist dem nicht so? Borland ist doch auch nicht dumm? Warum ändern die das in der nächsten Version nicht? Oder heißt es FreeAndNil und macht eigentlich NilAndFree?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz