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 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?


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