AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler bei FreeAndNil(TObjekt)

Ein Thema von Chrissi91 · begonnen am 29. Mai 2007 · letzter Beitrag vom 29. Mai 2007
Antwort Antwort
Seite 1 von 2  1 2      
Chrissi91

Registriert seit: 28. Jul 2005
849 Beiträge
 
#1

Fehler bei FreeAndNil(TObjekt)

  Alt 29. Mai 2007, 05:36
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
Miniaturansicht angehängter Grafiken
unbenannt_901.jpg  
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Fehler bei FreeAndNil(TObjekt)

  Alt 29. Mai 2007, 05:59
Versuch mal
Delphi-Quellcode:
If Assigned(Holz[1]) then
begin
  aHolz := Holz[1];
  FreeAndNil( aHolz);
end;
Markus Kinzler
  Mit Zitat antworten Zitat
Chrissi91

Registriert seit: 28. Jul 2005
849 Beiträge
 
#3

Re: Fehler bei FreeAndNil(TObjekt)

  Alt 29. Mai 2007, 06:10
Gleicher Fehler.

Aber Sachen wie

Showmessage(IntToStr(Holz[1].Width)); gehen.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Fehler bei FreeAndNil(TObjekt)

  Alt 29. Mai 2007, 06:13
Kommt der Fehler vielleicht schon beim Assigned?
Markus Kinzler
  Mit Zitat antworten Zitat
Chrissi91

Registriert seit: 28. Jul 2005
849 Beiträge
 
#5

Re: Fehler bei FreeAndNil(TObjekt)

  Alt 29. Mai 2007, 06:16
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Fehler bei FreeAndNil(TObjekt)

  Alt 29. Mai 2007, 06:21
Wird vielleicht nach dem Zerstören noch darauf zugegriffen?
Markus Kinzler
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#7

Re: Fehler bei FreeAndNil(TObjekt)

  Alt 29. Mai 2007, 07:09
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.
  Mit Zitat antworten Zitat
Chrissi91

Registriert seit: 28. Jul 2005
849 Beiträge
 
#8

Re: Fehler bei FreeAndNil(TObjekt)

  Alt 29. Mai 2007, 12:34
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
  Mit Zitat antworten Zitat
Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#9

Re: Fehler bei FreeAndNil(TObjekt)

  Alt 29. Mai 2007, 13:10
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;
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
  Mit Zitat antworten Zitat
Chrissi91

Registriert seit: 28. Jul 2005
849 Beiträge
 
#10

Re: Fehler bei FreeAndNil(TObjekt)

  Alt 29. Mai 2007, 14:29
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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:08 Uhr.
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