![]() |
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:
Beim Ergeigniss onActivate gehts auch nicht.
procedure TEinstellungForm.FormShow(Sender: TObject);
begin exitok:=false; EinstellungForm.close; end; |
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:
somit sparst du dir zum Beispiel das schließen wenn etwas nicht klappt.
procedure TEinstellungForm.Execute;
begin if (Bedingung) then Show else exitok := false; end; |
Re: close in onShow
Moin Zusammen,
bzw. das Ganze nicht als Prozedure, sondern Funktion:
Delphi-Quellcode:
Wobei FEinstellungForm ein Feld in der Klasse TIrgendeineAndereForm ist.
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; 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. |
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; |
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.
|
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);
|
Re: close in onShow
Wie wäre es mit PostQuitMessage?
Delphi-Quellcode:
PostQuitMessage(0);
|
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 12:38 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 by Thomas Breitkreuz