Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fehler bei FreeAndNil(TObjekt) (https://www.delphipraxis.net/92933-fehler-bei-freeandnil-tobjekt.html)

Chrissi91 29. Mai 2007 05:36


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:
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;
Woran kann das liegen? Falls mehr Code benötigt wird, einfach nur sagen.

Chrissi91

mkinzler 29. Mai 2007 05:59

Re: Fehler bei FreeAndNil(TObjekt)
 
Versuch mal
Delphi-Quellcode:
If Assigned(Holz[1]) then
begin
  aHolz := Holz[1];
  FreeAndNil( aHolz);
end;

Chrissi91 29. Mai 2007 06:10

Re: Fehler bei FreeAndNil(TObjekt)
 
Gleicher Fehler.

Aber Sachen wie

Delphi-Quellcode:
Showmessage(IntToStr(Holz[1].Width));
gehen.

mkinzler 29. Mai 2007 06:13

Re: Fehler bei FreeAndNil(TObjekt)
 
Kommt der Fehler vielleicht schon beim Assigned?

Chrissi91 29. Mai 2007 06:16

Re: Fehler bei FreeAndNil(TObjekt)
 
Das Komische er mach Folgendes:

Delphi-Quellcode:
  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;
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.

So kommt kein Fehler:

Delphi-Quellcode:
  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;
Also am Assigned liegts nicht.

mkinzler 29. Mai 2007 06:21

Re: Fehler bei FreeAndNil(TObjekt)
 
Wird vielleicht nach dem Zerstören noch darauf zugegriffen?

Robert Marquardt 29. Mai 2007 07:09

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.

Chrissi91 29. Mai 2007 12:34

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

Sidorion 29. Mai 2007 13:10

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;

Chrissi91 29. Mai 2007 14:29

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 19:38 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz