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 close in onShow (https://www.delphipraxis.net/73269-close-onshow.html)

mikelpahl 14. Jul 2006 21:51


close in onShow
 
Beim Aufruf von Formularen möchte ich einige Dinge erledigen wie z.B. Datenquellen öffenen und diverse Sachen prüfen, die man für eine einwandfreie Funktion des Formulars benötigt.

Das erledige ich überlicherweise im Ereignis onShow des Forms, da die Formulare von verschiedenen Stellen aufgerufen werden. Wenn ich dabei dann feststelle, dass irgendwas nicht passt möchte ich das Formlar gleich im inshow wieder schliessen. Dazu verwende ich self.close;
Scheinbar führt der Aufruf von close im onShow aber nicht dazu, dass das Formular sich schliesst.
Ansonsten klappt das mit dem self.close ganz gut wenn nicht im onShow steht.

Um dem Problem näher zu kommen habe ich folgendes einfaches Beispiel getestet:
Auch hier bleibt das Form EinstellungForm offen:

Delphi-Quellcode:
procedure TEinstellungForm.FormShow(Sender: TObject);
begin
  exitok:=false;
  EinstellungForm.close;
end;
Beim Ergeigniss onActivate gehts auch nicht.

SirThornberry 14. Jul 2006 21:55

Re: close in onShow
 
ich würde das ganze anders lösen. Anstelle des Formular mit ".Show" anzuzeigen, bau einfach eine eigene funktion.
Delphi-Quellcode:
procedure TEinstellungForm.Execute;
begin
  if (Bedingung) then
    Show
  else
    exitok := false;
end;
somit sparst du dir zum Beispiel das schließen wenn etwas nicht klappt.

Christian Seehase 14. Jul 2006 22:32

Re: close in onShow
 
Moin Zusammen,

bzw. das Ganze nicht als Prozedure, sondern Funktion:

Delphi-Quellcode:
function TEinstellungsForm.Initialize : boolean;
begin
  Result := // Ergebnis der Initialisierung
end;


procedure TIrgendeineAndereForm.WasAuchImmer;
begin
  FEinstellungForm := EinstellungForm.Initialize;
  if FEinstellungForm then begin
    FEinstellungForm.Show;
  end else begin
    // Auf den Fehler reagieren
  end;
end;
Wobei FEinstellungForm ein Feld in der Klasse TIrgendeineAndereForm ist.
Dann hättest Du auch an anderen Stellen direkt zugriff darauf, ob das aufzurufende Formular im gewünschten Zusammenhang da ist.
Wenn Du statt eines boolschen Wertes, z.B., einen integer als Rückgabewert nimmst, könntest Du Dir auch einen Fehlercode zurückgeben und entscheiden warum die Initialsierung fehlgeschlagen ist, um das Problem anschliessend besser beheben zu können.

mikelpahl 16. Jul 2006 19:40

Re: close in onShow
 
Vielen Dank für die Antworten. Diese Lösung hatte ich mir vorher auch schon überlegt.

Nur wollte ich sicher gehen ob man im onshow Ereignis nicht das Form schliessen kann. Schneinbar nicht, oder weiss da jemand definitiv. Es wäre die elegantere Methode gewesen.

Ich gebe bei der Lösung dann noch eine Schritt weiter und bastel für das Form eine Funktion start, die die Initialisierung übernimmt und bei Erfolg das Fromular modal aufruft. Leider muss man bei der Lösung immer dran denken das Form mit start aufzurufen und nich mit showmodal.

Delphi-Quellcode:
procedure TMainForm.BtnAdminClick(Sender: TObject);
begin
  Application.CreateForm(TEinstellungForm, EinstellungForm);
  EinstellungForm.Start;
  EinstellungForm.Release;
  EinstellungForm:=nil;
end;

Function TEinstellungForm.Start : boolean;
begin
  result:=true;
  exitok:=false;
  // bei fehler
  result:=false;
  if result then
    self.showmodal;
end;

SirThornberry 16. Jul 2006 20:15

Re: close in onShow
 
es geht definitiv nicht. Grund: Es wird erst das Ereignis ausgelöst und danach wird das Form angezeigt. Wenn du also im OnShow das Form schließt wird es trotzdem danach angezeigt weil das anzeigen eben erst nach dem auslösen des Events passiert.

Bernhard Geyer 16. Jul 2006 20:31

Re: close in onShow
 
Es geht über einen Trick indem du dir eine WM_CLOSE-Message schickst. Ist zwar keine sofortiges schließen aber ein schließen bevor der User irgendwas anderes machen kann.


Delphi-Quellcode:
PostMessage(self.Handle, WM_CLOSE, 0, 0);

Lasse2002 16. Jul 2006 22:24

Re: close in onShow
 
Wie wäre es mit PostQuitMessage?
Delphi-Quellcode:
  PostQuitMessage(0);

Luckie 17. Jul 2006 01:10

Re: close in onShow
 
PsotQuitMessage beendet die Nachrichten Schliefe des Fensters. Ginge zwar auch, aber ich tendiere zu der Lösung von Christian.


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