Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Object richtig freigeben (https://www.delphipraxis.net/193044-object-richtig-freigeben.html)

derseitzer 14. Jun 2017 00:12

Object richtig freigeben
 
Ich erstelle immer wieder 3D Objekte auf meinem 3D Formular und möchte diese freigeben (auf buttonklick) und wieder ein neues erstellen.
1. Versuch: Objekt.free: hat nicht den erfolg gebracht den ich mir erwünschte, da das alte objekt immernoch da war und ich dann 2 objekte erstellt habe.
2. versuch: Objekt.destroy: funktioniert ca. 2-4 mal und dann stürzt mein Programm ab..:/

Wie gibt man ein Objekt richtig frei, damit mein Programm richtig läuft :)?
MFG

Jasocul 14. Jun 2017 06:51

AW: Object richtig freigeben
 
Dein Versuch 1 ist richtig.
Wie kommst du darauf, dass das Objekt danach noch existiert?

Ein Prüfung auf Nil oder mit Assigned wird bei Free nicht funktionieren, da Free den Zeiger nicht auf Nil setzt. Man meint also, dass das Objekt noch existiert. Es kann sogar passieren, dass man noch auf Eigenschaften des gelöschten Objekts zugreifen kann.

Abhilfe schafft FreeAndNil(Objekt) oder das Wissen, mit dem Phänomen richtig umgehen zu können. :wink:

Oder hast du noch andere Merkwürdigkeiten, weswegen du der Meinung bist, dass das Objekt noch existiert?

jaenicke 14. Jun 2017 07:02

AW: Object richtig freigeben
 
Ich rate einmal, dass es um ein mobiles Projekt geht (iOS, Android)?
Da ist dann nämlich ARC aktiv und Free gibt das Objekt nicht wirklich frei.

Ich würde dann einfach das Objekt von der Oberfläche entfernen. Das sollte mit RemoveObject (Methode des Formulars) funktionieren. Du kannst auch
Delphi-Quellcode:
Objekt.Parent.RemoveObject(Objekt)
benutzen, falls du unterschiedliche Parents hast.

derseitzer 14. Jun 2017 13:45

AW: Object richtig freigeben
 
Ja es geht um ein Android Projekt und ich weiß das das Objekt immernoch existiert, da ich es auf meinem Screen sehe.
Ich erstelle eine TSphere, mit dem "löschen" button, soll diese gelöscht werden und eine neue Created werden (z.B. ein Quader oder sonstwas..)
wenn ich das Objekt nur freigebe (Objekt.Free), ist es visuell immernoch sichtbar, dann habe ich 2 Objekte auf meinem 3D-Formular.
ich probiere gerade herum und schaue ob ich mit euren Befehlen eine Lösung finde:)
erstmal vielen Dank

Rollo62 14. Jun 2017 14:05

AW: Object richtig freigeben
 
Wie Sebastian schon schrieb.
Android ist ARC, und obj.Free macht gar nichts.

Wenn du wirklich sicher bist das du es löschen wilst/musst dan geht das mit obj.DisposeOf

Rollo

taveuni 14. Jun 2017 14:21

AW: Object richtig freigeben
 
Zitat:

Zitat von Jasocul (Beitrag 1374466)

Ein Prüfung auf (..) Assigned wird bei Free nicht funktionieren, da Free den Zeiger nicht auf Nil setzt.

Wirklich? :shock:

Namenloser 14. Jun 2017 14:35

AW: Object richtig freigeben
 
Zitat:

Zitat von taveuni (Beitrag 1374544)
Zitat:

Zitat von Jasocul (Beitrag 1374466)

Ein Prüfung auf (..) Assigned wird bei Free nicht funktionieren, da Free den Zeiger nicht auf Nil setzt.

Wirklich? :shock:

Ja, wirklich. Ich finde das eigentlich auch vernünftig und verwende grundsätzlich nur Free und nicht FreeAndNil. FreeAndNil wiegt einen nur in falscher Sicherheit, da es ja auch noch weitere Referenzen auf das Objekt geben kann, die von FreeAndNil nicht auf nil gesetzt werden.

Delphi-Quellcode:
var
  x,y: TObject;
begin
  x := TObject.Create;
  y := x;
  FreeAndNil(x);
  if Assigned(x) then WriteLn('x assigned');
  if Assigned(y) then WriteLn('y assigned');
end;
Edit: Nur zur Klarstellung, das bezieht sich jetzt natürlich auf klassisches Delphi, nicht auf ARC.

derseitzer 14. Jun 2017 14:41

AW: Object richtig freigeben
 
Also Vielen Dank an euch alle, wieder was gelernt!
Rollo62 Vielen Dank, Disposeof klappt super! Free bewirkt leider nichts und mit Destroy stürzt mein Programm nach ein paar malen ab.
Vielen Dank:)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:41 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