Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Feststellen, ob Objekt schon erzeugt wurde (https://www.delphipraxis.net/140770-feststellen-ob-objekt-schon-erzeugt-wurde.html)

karma 25. Sep 2009 19:26


Feststellen, ob Objekt schon erzeugt wurde
 
Moin,
wie kann ich innerhalb einer Prozedur erkennen, ob das Objekt, welches verwendet werden soll, schon erzeugt wurde?
Die Prozedur soll beispielsweise Elemente zu einer Objectlist hinzufügen und dazu am Anfang entweder die List erzeugen, oder wenn sie schon existiert, sie leeren.
Ist es gültig, den Zeiger auf das Objekt einfach auf Nil zu überprüfen? Oder das objectlist.clear in ein try-except Konstrukt schieben und bei einer Exception die Liste erzeugen? Das erscheint mir aber alles nicht so optimal.

Danke für eure Hilfe!

mkinzler 25. Sep 2009 19:33

Re: Feststellen, ob Objekt schon erzeugt wurde
 
Wenn die Liste die Objekte besitzt, sollte .Clear die richtige Methode sein

BenjaminH 25. Sep 2009 19:47

Re: Feststellen, ob Objekt schon erzeugt wurde
 
Hi,
Delphi-Quellcode:
var obj:TObject;

if assigned(obj) then
  obj.tuwas;
ist besser als auf nil zu prüfen.
Viele Grüße,
Benjamin

Tryer 25. Sep 2009 20:31

Re: Feststellen, ob Objekt schon erzeugt wurde
 
Zitat:

Zitat von BenjaminH
...ist besser als auf nil zu prüfen.

Schön wär´s, aber leider prüft Assigned() auch nur auf nil.

Grüsse, Dirk

BenjaminH 25. Sep 2009 20:38

Re: Feststellen, ob Objekt schon erzeugt wurde
 
Oh, stimmt. Schade.
Warum verwendet man dann das und nicht die überprüfung auf nil?

alzaimar 25. Sep 2009 20:46

Re: Feststellen, ob Objekt schon erzeugt wurde
 
Weil es hübscher ist.

Ralf Kaiser 25. Sep 2009 21:09

Re: Feststellen, ob Objekt schon erzeugt wurde
 
Ausserdem kann Assigned() noch ein wenig mehr. So kann man z.B. prüfen ob ein Event bereits zugewiesen ist (if Assigned(ButtonOnClick)...) was man nicht mit einem Test auf "nil" machen kann.

Wenn man nun einmal Assigned() einsetzen muss, ist es nur konsequent es auch da zu tun wo man es kann. Das ist dann einheitlicher und damit "hübscher" :wink:

Luckie 25. Sep 2009 22:07

Re: Feststellen, ob Objekt schon erzeugt wurde
 
Zitat:

Zitat von Alfi001
Ausserdem kann Assigned() noch ein wenig mehr. So kann man z.B. prüfen ob ein Event bereits zugewiesen ist (if Assigned(ButtonOnClick)...) was man nicht mit einem Test auf "nil" machen kann.

Und das geht nicht?
Delphi-Quellcode:
if Button1.OnClick = nil

Ralf Kaiser 25. Sep 2009 22:15

Re: Feststellen, ob Objekt schon erzeugt wurde
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von Alfi001
Ausserdem kann Assigned() noch ein wenig mehr. So kann man z.B. prüfen ob ein Event bereits zugewiesen ist (if Assigned(ButtonOnClick)...) was man nicht mit einem Test auf "nil" machen kann.

Und das geht nicht?
Delphi-Quellcode:
if Button1.OnClick = nil

Nein. Das geht nicht. "Button1.OnClick" ist ein Methodenzeiger der intern eigentlich aus 2 Zeigern besteht, einem der auf die Methode verweist und einem der auf das aktuelle Objekt verweist. (in einen Record verpackt)

Das ganze wird mit einer Prise Compiler-Magie verwaltet.

EDIT:

wenn man "if Button1.OnClick = nil" benutzt, geht der Compiler ausserdem davon aus, dass "OnClick" eine Methode ist die aufgerufen werden soll - compilliere es mal!

=> [DCC Error] Unit33.pas(97): E2035 Not enough actual parameters

EDIT2:

schau mal hier: http://de.wikibooks.org/wiki/Program...Methodenzeiger

EDIT3:

des Grund, dass man Assigned nehmen muss ist wohl eher der, dass der Ausdruck vom Compiler als Methodenaufruf augewertet wird

karma 26. Sep 2009 14:47

Re: Feststellen, ob Objekt schon erzeugt wurde
 
Zitat:

Zitat von mkinzler
Wenn die Liste die Objekte besitzt, sollte .Clear die richtige Methode sein

Erscheint mir aber auch irgendwie nicht ganz richtig, immer auf eine Speicherverletzung zu spekulieren. Könnte nicht der Zeiger zufällig auf einen gültigen Bereich des Programms zeigen, und das Clear infolge dessen mir den Speicher kaputt machen?



Zum assigned: Das kannte ich noch nicht. Allerdings werden ja die Zeiger beim zerstören des Objekts nicht wieder auf nil gesetzt, darauf fällt assigned dann auch rein.
Also müsste ich nach dem zerstören eines Objektes am besten auch gleich den Zeiger auf nil setzen?


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