Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Nicht erstellle Komponente abfragen? (https://www.delphipraxis.net/67847-nicht-erstellle-komponente-abfragen.html)

Hallo_Thomas 20. Apr 2006 18:56


Nicht erstellle Komponente abfragen?
 
Mal ne Frage grundsätzlich, ich erstelle zur Laufzeit ne Komponente, die immer mah wieder gelöscht und erstellt wird.

Wie kann ich zur Laufzeit abfragen, ob diese Komponente überhaupt existiert?

mkinzler 20. Apr 2006 18:57

Re: Nichtersteltle Komponente abfragen?
 
Form.FindComponent('<komponame>');

JasonDX 20. Apr 2006 19:05

Re: Nichtersteltle Komponente abfragen?
 
Zitat:

Zitat von mkinzler
Form.FindComponent('<komponame>');

Dies funktioniert nur, wenn ich auch der Komponente auch ein Name zugewiesen wird, was nicht zwingend der Fall sein muss (gerade weil sie dynamisch erstellt wird ;) )
Mein Tip ist, alle Objekte ueber Delphi-Referenz durchsuchenFreeAndNil freizugeben, bzw. Instanzzeiger nach dem Freigeben haendisch auf nil setzen. Das erleichtert dein Problem dann auf eine einfache Abfrage:
Delphi-Quellcode:
FreeAndNil(MyComponent);
//...
if (MyComponent <> nil) then
  MyComponent.DoSomething()
else
  //blubb
greetz
Mike

Hallo_Thomas 20. Apr 2006 19:14

Re: Nicht erstellle Komponente abfragen?
 
Danke erst mah echt nett ich glaub das geht bei mir nicht.

Um mah eh bissl genauer zu werden ich will vor meine Abfrage ne if abfrage platztieren.

Ob die Komponente exitiert(True) oder nicht(False).Mehr möchte ich gar ni wissen.

xZise 20. Apr 2006 19:46

Re: Nichtersteltle Komponente abfragen?
 
Zitat:

Zitat von JasonDX
Zitat:

Zitat von mkinzler
Form.FindComponent('<komponame>');

Dies funktioniert nur, wenn ich auch der Komponente auch ein Name zugewiesen wird, was nicht zwingend der Fall sein muss (gerade weil sie dynamisch erstellt wird ;) )

Vielleicht löst es durch:
Delphi-Quellcode:
Form.FindComponent(MyKomponent.Name)
?

JasonDX 20. Apr 2006 19:58

Re: Nichtersteltle Komponente abfragen?
 
Zitat:

Zitat von xZise
Zitat:

Zitat von JasonDX
Zitat:

Zitat von mkinzler
Form.FindComponent('<komponame>');

Dies funktioniert nur, wenn ich auch der Komponente auch ein Name zugewiesen wird, was nicht zwingend der Fall sein muss (gerade weil sie dynamisch erstellt wird ;) )

Vielleicht löst es durch:
Delphi-Quellcode:
Form.FindComponent(MyKomponent.Name)

Oehm, das is ja genau der Punkt: Ich weiss ja nicht, obs MyComponent noch gibt, also kann ich mir nicht sichersein, dass das funktioniert ;)
(ich weiss jetzt nicht genau, was bei TComponent(nil).Name passiert, aber ich kann mir vorstellen, dasses nix gutes is ;) )
weiters is mir bei der Methode noch eingefallen: In der Situation muss die Komponente das Formular als Owner eingetragen haben. Wenn die Komponente bspw. auf einem anderen Formular oder einem Frame liegt, ist das nicht der Fall. Natuerlich koennte man das dann mit MyComponent.Owner.FindComponent(MyComponent.Name) <> nil ueberpruefen, fuer eine nutzbare Methode halte ich das allerdings nicht, denn: Ich weiss nicht, ob die Komponente existiert, aber ich verwend ihre Eigenschaften und Methoden ums rauszufinden... ;)

Wie gesagt: IMO ist es die sauberste Loesung, die Instanz mit Delphi-Referenz durchsuchenFreeAndNil freizugeben und bei der Ueberpruefung mit nil zu vergleichen.

greetz
Mike

Jelly 20. Apr 2006 21:05

Re: Nicht erstellle Komponente abfragen?
 
Wie wärs mal mit

Delphi-Quellcode:
if assigned(MyComponent) then ...

markusj 20. Apr 2006 21:30

Re: Nicht erstellle Komponente abfragen?
 
Dürft nix bringen, weil Assigned meines Wissens nach nur kontrolliert, ob der Zeiger auf einen Speicherbereich zeigt,
also im Ende nix anderes als (Zeiger<> nil)

mfG

Markus


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