AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Prüfen ob Form bereits existiert.

Ein Thema von youuu · begonnen am 22. Jan 2011 · letzter Beitrag vom 22. Jan 2011
Antwort Antwort
youuu

Registriert seit: 2. Sep 2008
Ort: Kleve
822 Beiträge
 
Delphi 2010 Professional
 
#1

Prüfen ob Form bereits existiert.

  Alt 22. Jan 2011, 01:32
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.
Steven
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#2

AW: Prüfen ob Form bereits existiert.

  Alt 22. Jan 2011, 02:01
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 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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (22. Jan 2011 um 02:04 Uhr)
  Mit Zitat antworten Zitat
youuu

Registriert seit: 2. Sep 2008
Ort: Kleve
822 Beiträge
 
Delphi 2010 Professional
 
#3

AW: Prüfen ob Form bereits existiert.

  Alt 22. Jan 2011, 02:12
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?
Steven

Geändert von youuu (22. Jan 2011 um 02:22 Uhr)
  Mit Zitat antworten Zitat
pixfreak

Registriert seit: 6. Jul 2007
112 Beiträge
 
Delphi XE3 Professional
 
#4

AW: Prüfen ob Form bereits existiert.

  Alt 22. Jan 2011, 08:00
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 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
... und noch nen C++ Builder XE2
  Mit Zitat antworten Zitat
paritycheck

Registriert seit: 8. Feb 2005
51 Beiträge
 
Delphi 2009 Professional
 
#5

AW: Prüfen ob Form bereits existiert.

  Alt 22. Jan 2011, 08:10
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Prüfen ob Form bereits existiert.

  Alt 22. Jan 2011, 11:55
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Prüfen ob Form bereits existiert.

  Alt 22. Jan 2011, 12:01
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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (22. Jan 2011 um 14:58 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:39 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