Delphi-PRAXiS
Seite 2 von 2     12   

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)

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 19:27 Uhr.
Seite 2 von 2     12   

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