Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Prüfen, ob Formular existiert (https://www.delphipraxis.net/204053-pruefen-ob-formular-existiert.html)

MLurie 19. Apr 2020 19:15

Prüfen, ob Formular existiert
 
Hi an alle

Eine Frage zu meiner Android app. Ich habe folgende Funktion:

procedure TMainFreeF.MenuEgoF1EEditClick(Sender: TObject);
var
Profil: TProfilF;
begin
if not Assigned(Profil) then
Profil := TProfilF.Create(self);
Profil.Show;
end;

Ich garantiere jedem, dass Profil nicht existiert. Dennoch gibt Assigned(Profil) true zurück, überspringt das Create und wirft nen Fehler beim Show aus. Hab ich was übersehen ?
Der Objekt-Inspector zeigt übrigens auch "kein zugewiesener Wert" bei Profil an.

Danke im voraus
Michael

jaenicke 19. Apr 2020 19:35

AW: Prüfen, ob Formular existiert
 
Es sollte eine Warnung kommen, dass die Variable Profil nicht initialisiert ist. Darum steht da ein quasi zufälliger Wert drin und der ist eben nicht unbedingt 0.

Weise in der ersten Zeile einmal nil zu (also vor dem if assigned). ;-)

Redeemer 19. Apr 2020 20:12

AW: Prüfen, ob Formular existiert
 
Es gibt in Delphi nur wenige Fälle, in der nicht initialisierte Variablen einen bestimmten Wert haben, z.B. zusammengesetzte lokale Variablen (z.B. Strings; Result bzw. der Funktionsname ist keine lokale Variable sondern ein impliziter out-Parameter und immer „zufällig“) sowie alle Klassenfelder.
himitsu wird uns sicher eine ausführliche Liste liefern können.

jaenicke 19. Apr 2020 21:56

AW: Prüfen, ob Formular existiert
 
Zitat:

Zitat von Redeemer (Beitrag 1462468)
himitsu wird uns sicher eine ausführliche Liste liefern können.

Das ist ja auch dokumentiert, z.B. hier:
http://docwiki.embarcadero.com/RADSt...ables_(Delphi)
Zitat:

If you do not explicitly initialize a global variable, the compiler initializes it to 0. Object instance data (fields) are also initialized to 0. On the Wiin32 platform, the contents of a local variable are undefined until a value is assigned to them.

Ralf Kaiser 20. Apr 2020 05:36

AW: Prüfen, ob Formular existiert
 
Zitat:

Zitat von jaenicke (Beitrag 1462465)
Weise in der ersten Zeile einmal nil zu (also vor dem if assigned). ;-)

Wobei dann die Abfrage auf Assigned auch keinen Sinn mehr macht. Insgesamt macht das ganze Konstrukt nicht viel Sinn, da es sich um eine lokale Variable handelt.

Am besten wäre es wenn man die lokale Variable in eine Feldvariable umwandelt, dann ergibt die Vorgehensweise auch wieder Sinn. Es soll ja scheinbar verhindert werden, dass das Formular mehrmals mit ".Show" angezeigt wird.

MLurie 20. Apr 2020 05:56

AW: Prüfen, ob Formular existiert
 
Herzlichen Dank für den Input.

Was bitte ist eine Feldvariable ?

Ich habe eine Android Anwendung mit ziemlich vielen Formularen. Irgendwo stand, dass es keinen Sinn mach diese zu .free'en. Dazu scheint nicht klar zu sein, ob man OnClose (cafree), DisposeOf, Free oder FreeAndNil der korrekte Weg ist.

Also muss ich prüfen, ob das Formular bereits existiert. nil setzen macht tatsächlich keinen Sinn, da kenne ich ja den Status im voraus.

Wenn jemand den "korrekten" Weg mir aufzeigen könnte ? Mir ist es Wurscht, ob ich die Formulare jeweils erstelle und dan leere oder ob ich auf bereits erstellte Formulare prüfen muss.

Danke im voraus
Michael

hoika 20. Apr 2020 06:09

AW: Prüfen, ob Formular existiert
 
Hallo,
Ist es denn pro Formular immer nur eine Instanz, die offen ist?
Dann könntest du eine globale Formularvariable nutzen, und nicht wie in deinem Bsp eine lokale Variable.

Redeemer 20. Apr 2020 08:27

AW: Prüfen, ob Formular existiert
 
Zitat:

Zitat von MLurie (Beitrag 1462480)
Herzlichen Dank für den Input.

Was bitte ist eine Feldvariable ?

Ein Feld ist eine in einer Klasse deklarierte Variable. Achtung, eine in einer Klasse deklarierte class var ist kein Feld.

Delphi erstellt automatisch für jedes Formular eine globale Variable. Die sollte man für Formulare (und kaum was anderes!) auch nutzen, so wie hoika schrieb. Globalen Variablen kann man bei der Deklaration bereits initialisieren.

himitsu 20. Apr 2020 10:48

AW: Prüfen, ob Formular existiert
 
Zitat:

Zitat von Redeemer (Beitrag 1462488)
Delphi erstellt automatisch für jedes Formular eine globale Variable.

Nur für die automatisch erstellten Fenster wird sie automatisch gefüllt. (und man kann diese Variable auch wegmachen)
Aber da in Screens auch eine Liste aller Delphi-Forms existiert, kann man dort auch problemlos nach einer bestimmten Form (Name oder Typ) suchen.

MLurie 20. Apr 2020 11:29

AW: Prüfen, ob Formular existiert
 
Danke an alle für den wertvollen Input. Ich habe es nun dahin gelöst, dass ich die Variablen im Hauptformular deklariere und nil setze. Ist ein wenig umständlich, weil ich jetzt überall die Formular via das Mainform referenzieren muss, aber es läuft.

In diesem Sinne, schliesse ich den Thread und nochmals Dank an alle.

Michael


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