Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi feststellen ob Object existiert! (https://www.delphipraxis.net/13333-feststellen-ob-object-existiert.html)

fredel007 16. Dez 2003 12:58


feststellen ob Object existiert!
 
Hi Leute,
ich hab gerade versucht herauszufinden wie ich feststellen
kann ob ein objeckt existiert, bin aber leider zu keinem ergebniss gekommen!
kann mir jemand von euch helfen?




Delphi-Quellcode:
if "Objekt existiert" then
begin
  //source
end;
ich suche nur den befehl um festzustellen ob das gewünschte object z.B. ein Tshape bereits
existiert!



schon mal vielen dank!

Tyrael Y. 16. Dez 2003 12:59

Re: feststellen ob Object existiert!
 
Delphi-Quellcode:
if assigned(meinObjkt) then
.
.
.
Gruß

eddy 16. Dez 2003 13:02

Re: feststellen ob Object existiert!
 
Hallo fredel007,

dürfte auf TShape auch anwendbar sein:

Code:
  if (FindComponent('lbl821') is TLabel) then begin
mfg
eddy

fredel007 16. Dez 2003 13:06

Re: feststellen ob Object existiert!
 
ihr seid echt super!!!!

jetzt klappts!

danke! :bounce2:

choose 16. Dez 2003 13:06

Re: feststellen ob Object existiert!
 
Hallo fredel007,

solltest Du eine Referenz auf das Objekt besitzen und handelt es sich um eine globale Variable oder eine Exemplarvariable ist sie mit nil vorbelegt. Der Test könnte dann lauten
Delphi-Quellcode:
if FMyShape <> nil then
oder
Delphi-Quellcode:
if Assigned(FMyShape) then
allerdings funktioniert dieser Test nur, wenn das Objekt nicht zwischenzeitlich freigegen worden ist, ohne dass diese Referenz zurück auf nil gesetzt wurde.
Solltest Du das Objekt "beim Namen" kennen, sollte TComponent.FindComponent (siehe OH) weiterhelfen...

Kannst Du Deine Situation noch etwas genauer schildern?

Christian Seehase 16. Dez 2003 16:13

Re: feststellen ob Object existiert!
 
Moin Fredel,

und wenn Du das Objekt freigibst, dann mit

Code:
FreeAndNil(Objektbezeichner);
// oder
Objektbezeichner.Free;
Objektbezeichner := nil;
ansonsten würde nach einer Freigabe des Objektes noch ein Wert in der Variablen stehen, der dann aber auf einen ungültigen Speicherbereich zeigt, was zur Folge hätte, dass die Abfrage <> nil bzw. Assigned true zurückliefert obwohl nicht mehr auf ein Objekt gezeigt wird.

Puhbaehr 20. Nov 2005 23:50

Re: feststellen ob Object existiert!
 
Servus!

Das Thema hier ist zwar sehr alt, aber interessant für mein Problem. Und warum einen Thread nochmal eröffnen:

Ich muss prüfen ob eine Variablenreferenz existiert bevor ich sie mit Create neu erstelle.

Soll in etwa so aussehen:

Delphi-Quellcode:
...
var
  StringList : TStrings;
...
if (not (Exists (StringList))) then
 begin
  StringList := TStringList.Create;
 end;
...
Ich dachte erst, ich kann das mit StringList <> nil prüfen. Assigned funktioniert auch nicht so recht. Jedesmal tritt eine Exception auf (EAccessViolation). Gibt es noch andere Möglichkeiten?

Gruß, Robert

Christian Seehase 21. Nov 2005 00:05

Re: feststellen ob Object existiert!
 
Moin Robert,

wenn Du in dem Falle eine AV bekommst, dann enthält StringList einen Wert <> nil zeigt aber nicht auf eine Instanz des Objektes.
Der gezeigte Sourcecodeabschnitt lässt da allerdings keine Aussage zu (mal abgesehen davon dass die Exists-Abfrage wohl als Metacode zu verstehen ist.)

himitsu 21. Nov 2005 00:06

Re: feststellen ob Object existiert!
 
Das Problem mit <>NIL und Assigned wurde ja schon erörtert ... wenn die Variable nicht mit NIL initialisiert, oder das Objekt beim Freigeben wieder auf NIL gesetzt wurde, dann ist in der Variable ja noch ein Pointer auf etwas, welches aber nichtmehr das uhrsprüngliche Objekt enthält, sondern irgendwas anderes.


Die einzige wirkliche Lösung ist undbleibt halt immernoch dafür zu sorgen, das die Variable auf NIL steht, wenn kein Objekt enthalten ist.

Eine Möglichkeit, welche mir gerade einfällt ist allerdings etwas radikal.
Und zwar kannst du ja einfach mal etwas von dem Objekt aufrufen und bei einem Fehler existiert es nicht.
Delphi-Quellcode:
Try
  If StringList.Count <> 0 Then ;
Except
  StringList := TStringList.Create;
End;
Delphi-Quellcode:
If StringList <> NIL Then Begin
  Try
    If StringList.Count <> 0 Then ;
  Except
    StringList := TStringList.Create;
  End;
End Else StringList := TStringList.Create;
Delphi-Quellcode:
Try
  If StringList.Count <> 0 Then ;
Except
  StringList := NIL;
End;
If StringList = NIL Then StringList := TStringList.Create;
Es gibt dabei allerdings ein Problem (welches aber auch alle anderen Testverfahren haben werden, welche nachschauen, ob das Objekt, welches in einer Variable steckt auch wirklich existiert.
Und zwar, wenn rein zufällig ein anderes Objekt an der selben Stelle im RAM rumliegt, worauf die Variable(Pointer) zeigt, dann wird jedes Testverfahren ein "Ja, es existiert" zurückliefern,

Puhbaehr 21. Nov 2005 00:22

Re: feststellen ob Object existiert!
 
Es ging darum zu prüfen ob das Objekt (die Komponente) irgendwann bereits mit Create erstellt wurde. Unabhängig davon ob sie noch nie erstellt wurde oder irgendwann mal mit Free bzw. FreeAndNil freigegeben wurde.

Ich hab etwas weiter überlegt und gesucht und bin auf den Operator is gekommen.

Delphi-Quellcode:
if (not (StringList is TStrings)) then
 begin
  StringList := TStringList.Create;
 end;
Damit sollte es doch gehen oder?

Das Abfangen der Exception mit try...except bzw. try...finally wäre allenfalls eine Notlösung.
Aber selbst bevor die Exception ausgelöst wird wurde ja irgendwie festgestellt, dass das Objekt nicht existiert. Oder registriert der Compiler einfach nur, dass "irgendwas" auf "irgendwas" zugreifen wollte was gar nicht existiert?

sh17 21. Nov 2005 06:16

Re: feststellen ob Object existiert!
 
Zitat:

Es ging darum zu prüfen ob das Objekt (die Komponente) irgendwann bereits mit Create erstellt wurde. Unabhängig davon ob sie noch nie erstellt wurde oder irgendwann mal mit Free bzw. FreeAndNil freigegeben wurde.
Das widerspricht sich.

Der Operator is nützt Dir an dieser Stelle gar nix. So wirst Du nie

Delphi-Quellcode:
StringList := TStringList.Create;
erreichen, denn StringList : TStringList ist immer vom Typ TStrings.

Der Operator is dient nur der Klassentypüberprüfung einer Variable. Um zu prüfen, ob eine Instanz von StringList existiert, musst Du dich an die obige Antwort halten.

malo 21. Nov 2005 06:24

Re: feststellen ob Object existiert!
 
ich würde es so machen:
Delphi-Quellcode:
if (not (StringList is TStringsList)) then
begin
  StringList := TStringList.Create;
end;
Dabei jedoch die Variable StringList vom Typ TStrings deklarieren, aber als eine TStringList erzeugen. Also so:
Delphi-Quellcode:
var StringList: TStrings; // so deklarieren
{...}
proecedure TForm1.FormCreate(Sender: TObject);
begin
  StringList := TStringList.Create; // so erzeugen
end;
Das müsste funktionieren.

sh17 21. Nov 2005 06:31

Re: feststellen ob Object existiert!
 
leider nein,

*/meineantwortkopier/*

dataspider 21. Nov 2005 06:50

Re: feststellen ob Object existiert!
 
Hallo Puhbaehr,
man sollte sich angewöhnen, Objekte, welche dynamisch erzeugt werden, immer mit nil zu initialisieren.
Jetzt ist natürlich wichtig, wo deine Variable des Typs TStrings definiert ist.
Gehört sie global zur Unit des Forms, so sollte man das im Constructor mit:
StringList := nil;
erledigen. Die Prüfung mit Assigned(StringList) ist üblich und funktioniert, solange man das Freigeben der Stringlist, wie schon im Thread erläutert, mit FreeAndNil(StringList) erledigt.
Ist StringList eine lokale Variable in einer Procedure, so ist eine Prüfung auf die Existenz dieser eh unsinnig.
Also musst du nur die richtige Stelle für die Initialisierung auf nil finden!
Gruß, Frank

choose 21. Nov 2005 07:18

Re: feststellen ob Object existiert!
 
Vielleicht hilft Dir der Thread IsObject/IsClass weiter, eine "endgültige" Lösung gibt es aber leider auch dort (noch) nicht.

himitsu 21. Nov 2005 09:14

Re: feststellen ob Object existiert!
 
@malo:

wenn ich aber jetzt auf ein noch nicht initialisiertes Objekt (in 'ner lokalen Variable) prüfen lassen, dann bekomm ich aber einen netten Fehler und dat Programm verreckt.

Delphi-Quellcode:
var StringList: TStringList;
begin
  // StringList := Pointer($12314564); // notfalls könnte man ja auch seber mal einen undefinierten Wert einfügen
  if (not (StringList is TStringList)) then
  begin
    StringList := TStringList.Create;
  end;
  StringList.Free;
end;

Puhbaehr 21. Nov 2005 20:40

Re: feststellen ob Object existiert!
 
Zitat:

Zitat von dataspider
...man sollte sich angewöhnen, Objekte, welche dynamisch erzeugt werden, immer mit nil zu initialisieren...

Naja, leuchtet mir erstmal ein. Sozusagen setze ich das Objekt im Constructor (bzw. FormCreate) auf nil. Anschließend kann ich beliebig prüfen ob das Objekt bereits existiert. Aber somit müsste ich trotzdem sicherstellen, dass das Objekt mit nil initialisert wurde. Oder anders: Ich könnte das Objekt gleich im Constructor erstellen (Create). Somit wäre das Problem hinfällig.
Ich hab aber leider nicht immer die Möglichkeit den Constructor aufzurufen. Ich könnte ja auch eine typungebundene Funktion haben die beliebig aufgerufen werden kann und die das Objekt benutzt.

Ich möchte halt nur prüfen ob das Objekt das ich gleich erstelle schonmal erstellt wurde.
Der Operator is funktioniert dahingehend schoneinmal. Bis jetzt zumindest.
Aber es muss doch etwas geben, dass hunderprozentig sicherstellt, dass das Objekt existiert.
In JavaScript kann ich das mit if (Object) ... tun.
Wie mach ich das in Delphi?

Gruß, Robert


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