Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Prüfen ob Form bereits existiert. (https://www.delphipraxis.net/157714-pruefen-ob-form-bereits-existiert.html)

youuu 22. Jan 2011 00:32

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:
var
  frm_Email : Tfrm_Email;
begin
  frm_Email := Tfrm_Email.create(nil);
  if not frm_Email.Visible then
    frm_Email.Show;
und

Delphi-Quellcode:
var
  frm_Email : Tfrm_Email;
begin
  if not Assigned(frm_Email) then begin
    frm_Email := Tfrm_Email.create(nil);
    frm_Email.Show;
  end;
funktionieren beide leider nicht.
Beim 1. wird die Form jedes mal Created, obwohl sie schon existiert.
Beim 2. wird die Form gar nicht Created, obwohl sie nicht existiert.

himitsu 22. Jan 2011 01:01

AW: Prüfen ob Form bereits existiert.
 
Zitat:

Beim 2. wird die Form gar nicht Created, obwohl sie nicht existiert.
Wenn Delphi die Variable frm_Email nicht automatisch initialisiert, dann mußt du das machen. Also in diesem Fall bei Programmstart
Delphi-Quellcode:
frm_Email := nil;
.

Beim Freigeben mußt due es sowieso immer manuell auf NIL zurücksetzen oder einfach Delphi-Referenz durchsuchenFreeAndNil verwenden, wenn du die Form ausblendest/löschst.


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)

youuu 22. Jan 2011 01:12

AW: Prüfen ob Form bereits existiert.
 
Delphi-Quellcode:
frm_Email := nil;
if not Assigned(frm_Email) then begin
  frm_Email := Tfrm_Email.create(nil);
Öffnet aber ebenfalls jedesmal das Fenster neu, auch wenn es schon geöffnet ist, da es so ja jedesmal auf nil gesetzt wird.

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?

pixfreak 22. Jan 2011 07:00

AW: Prüfen ob Form bereits existiert.
 
Moin,

vielleicht gehts ja so:

Delphi-Quellcode:
if Assigned(frm_Email) then
  from_Email.Show()
else
  frm_Email := TFrmEmail.Create(...);
Wichtig ist halt nur, dass Du in Deinem Hauptfenster in einer Methode wie Create durch
Delphi-Quellcode:
frm_Email := nil
dem Zeiger einen definierten Startwert gibst. Wenn Du den Zeiger immer vorher auf nil setzt, dann ist die Bedingung ja immer so gegeben.

Ach ja, bitte lass Dein Programm beim schließen des Fensters den Zeiger wieder auf nil setzen...


VG Pixfreak

paritycheck 22. Jan 2011 07:10

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.

mkinzler 22. Jan 2011 10:55

AW: Prüfen ob Form bereits existiert.
 
Zitat:

Ich habe irgendwie die Vermutung dass die Variable frm_Email eine lokale Variable in irgend einer Funktion ist.
Ist sie, wie man im 1. Beitrag sehen kann.

Sir Rufo 22. Jan 2011 11:01

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:
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;
Um die Form dann anzuzeigen nimmt man folgende Sequenz:
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