![]() |
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? |
Re: feststellen ob Object existiert!
Zitat:
Der Operator is nützt Dir an dieser Stelle gar nix. So wirst Du nie
Delphi-Quellcode:
erreichen, denn StringList : TStringList ist immer vom Typ TStrings.
StringList := TStringList.Create;
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. |
Re: feststellen ob Object existiert!
ich würde es so machen:
Delphi-Quellcode:
Dabei jedoch die Variable StringList vom Typ TStrings deklarieren, aber als eine TStringList erzeugen. Also so:
if (not (StringList is TStringsList)) then
begin StringList := TStringList.Create; end;
Delphi-Quellcode:
Das müsste funktionieren.
var StringList: TStrings; // so deklarieren
{...} proecedure TForm1.FormCreate(Sender: TObject); begin StringList := TStringList.Create; // so erzeugen end; |
Re: feststellen ob Object existiert!
leider nein,
*/meineantwortkopier/* |
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 |
Re: feststellen ob Object existiert!
Vielleicht hilft Dir der Thread
![]() |
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; |
Re: feststellen ob Object existiert!
Zitat:
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 ![]() Wie mach ich das in Delphi? Gruß, Robert |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:19 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