![]() |
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:
ich suche nur den befehl um festzustellen ob das gewünschte object z.B. ein Tshape bereits
if "Objekt existiert" then
begin //source end; existiert! schon mal vielen dank! |
Re: feststellen ob Object existiert!
Delphi-Quellcode:
Gruß
if assigned(meinObjkt) then
. . . |
Re: feststellen ob Object existiert!
Hallo fredel007,
dürfte auf TShape auch anwendbar sein:
Code:
mfg
if (FindComponent('lbl821') is TLabel) then begin
eddy |
Re: feststellen ob Object existiert!
ihr seid echt super!!!!
jetzt klappts! danke! :bounce2: |
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:
oder
if FMyShape <> nil then
Delphi-Quellcode:
allerdings funktioniert dieser Test nur, wenn das Objekt nicht zwischenzeitlich freigegen worden ist, ohne dass diese Referenz zurück auf nil gesetzt wurde.
if Assigned(FMyShape) then
Solltest Du das Objekt "beim Namen" kennen, sollte TComponent.FindComponent (siehe OH) weiterhelfen... Kannst Du Deine Situation noch etwas genauer schildern? |
Re: feststellen ob Object existiert!
Moin Fredel,
und wenn Du das Objekt freigibst, dann mit
Code:
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.
FreeAndNil(Objektbezeichner);
// oder Objektbezeichner.Free; Objektbezeichner := nil; |
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:
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?
...
var StringList : TStrings; ... if (not (Exists (StringList))) then begin StringList := TStringList.Create; end; ... Gruß, Robert |
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.) |
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:
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.
Try
If StringList.Count <> 0 Then ; Except StringList := NIL; End; If StringList = NIL Then StringList := TStringList.Create; 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, |
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:
Damit sollte es doch gehen oder?
if (not (StringList is TStrings)) then
begin StringList := TStringList.Create; end; 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 06:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz