![]() |
Prüfen ob Form bereits existiert.
Hi,
irgendwie habe ich gerade ein Verständnis Problem, normal habe ich das immer mit Showmodal geregelt, möchte dies aber diesmal nicht tun.
Delphi-Quellcode:
und
var
frm_Email : Tfrm_Email; begin frm_Email := Tfrm_Email.create(nil); if not frm_Email.Visible then frm_Email.Show;
Delphi-Quellcode:
funktionieren beide leider nicht.
var
frm_Email : Tfrm_Email; begin if not Assigned(frm_Email) then begin frm_Email := Tfrm_Email.create(nil); frm_Email.Show; end; Beim 1. wird die Form jedes mal Created, obwohl sie schon existiert. Beim 2. wird die Form gar nicht Created, obwohl sie nicht existiert. |
AW: Prüfen ob Form bereits existiert.
Zitat:
Delphi-Quellcode:
.
frm_Email := nil;
Beim Freigeben mußt due es sowieso immer manuell auf NIL zurücksetzen oder einfach ![]() PS: automatisch wird von Delphi nur Folgendes automatisch initialisiert: - immer Strings, dynamische Arrays und Interfaces (1) - Felder von Klassen - globale Variablen > lokale Variablen innerhalb von Funktionen/Prozeduren/Methoden werden nicht immer innitialisiert (außer siehe Punkt 1) > auch der ShortString wird nicht immer initialisert, sowie statische Arrays und Record-Felder (außer da ist wieder der Punkt 1 drin enthalten, aber dann auch nur dieser Teil) |
AW: Prüfen ob Form bereits existiert.
Delphi-Quellcode:
Öffnet aber ebenfalls jedesmal das Fenster neu, auch wenn es schon geöffnet ist, da es so ja jedesmal auf nil gesetzt wird.
frm_Email := nil;
if not Assigned(frm_Email) then begin frm_Email := Tfrm_Email.create(nil); Normal würde ich nun eine Interne Variable setzen und diese dann immer prüfen, dachte aber das geht wesentlich besser? Wie macht Ihr das denn? |
AW: Prüfen ob Form bereits existiert.
Moin,
vielleicht gehts ja so:
Delphi-Quellcode:
Wichtig ist halt nur, dass Du in Deinem Hauptfenster in einer Methode wie Create durch
if Assigned(frm_Email) then
from_Email.Show() else frm_Email := TFrmEmail.Create(...);
Delphi-Quellcode:
dem Zeiger einen definierten Startwert gibst. Wenn Du den Zeiger immer vorher auf nil setzt, dann ist die Bedingung ja immer so gegeben.
frm_Email := nil
Ach ja, bitte lass Dein Programm beim schließen des Fensters den Zeiger wieder auf nil setzen... VG Pixfreak |
AW: Prüfen ob Form bereits existiert.
Ich habe irgendwie die Vermutung dass die Variable frm_Email eine lokale Variable in irgend einer Funktion ist. Wenn diese Funktion abgearbeitet ist wird die lokale Variablen verworfen und dein frm_Email hinfällig. Beim nächsten Aufruf der Funktion prüfst Du also gegen eine "neue" leere Variable.... versuch mal frm_Email global zu definieren.
|
AW: Prüfen ob Form bereits existiert.
Zitat:
|
AW: Prüfen ob Form bereits existiert.
Jede Form bekommt ja von Haus aus eine globale Variable zugewiesen.
Wenn man die verwendet (man kann aber auch selber noch ein paar einführen) dann kann man diese per OnDestroy auch gleich auf nil setzen:
Delphi-Quellcode:
Um die Form dann anzuzeigen nimmt man folgende Sequenz:
type
TFEmail = class( TForm ) ... procedure FormDestroy(Sender: TObject); ... end; var FEmail : TFEmail; procedure TFEmail.FormDestroy(Sender: TObject); begin if FEmail = Self then FEmail := nil; end;
Delphi-Quellcode:
if not Assigned( FEmail ) then
FEmail := TFEmail.Create( Application ); // Als Owner Application, dann gibt es garantiert keine Speicherlecks if not FEmail.Visible then FEmail.Show; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:22 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-2025 by Thomas Breitkreuz