Formular im Konstruktor schliessen
-
Hallo,
wie kann ich ein Formular beim Anzeigen sofort wieder schliessen? Ich habe ein Formular, das Details eines bestimmten Datensatzes anzeigen soll und im Konstruktor des Formulars prüfe ich, ob dieser Datensatz existiert. Wenn er es nicht tut möchte ich eine Meldung anzeigen und das Formular schliessen, bevor es angezeigt wird. Leider hilft weder eine ModalResult Zuweisung noch ein expliziter Close() Aufruf.
TDetailForm::TDetailForm( TComponent* Owner ) : Frame( Owner ) { if( false == is_valid() ) { // hilft alles nicht... ModalResult = mrCancel; Close(); Visible = false; ::SendMessage( Handle, WM_QUIT, 0, 0 ); ::PostMessage( Handle, WM_QUIT, 0, 0 ); } }
Fällt jemandem was ein, was ich noch machen kann?
-
Du hast zwei Optionen.
- Entweder betrachtest du das Nichtvorhandensein des Datensatzes als Ausnahmefehler; entsprechend müßtest du im Konstruktor eine Exception werfen.
- Falls es sich nicht um eine Ausnahmesituation handelt, sondern damit gerechnet werden muß, ist es bereits ein Fehler, den Konstruktor überhaupt aufzurufen. Besser wäre dann also:
class TFrmMain : public TForm { ... bool doesCurrentDatasetExist (void) { ... } void displayDatasetIfExisting (void) { if (doesCurrentDatasetExist ()) new TDetailForm (Application)->ShowModal (); // angenommen, daß im Event-Handler für TDetailForm::OnClose Action auf caFree gesetzt wird }
Edit: Das heißt natürlich nicht, daß man nicht auch im Konstruktor noch das Sichtbarwerden des Fensters unterbinden könnte. Aber sauber wäre das nicht.
-
Hallo
Wenn der Konstruktor eines Forms aufgerufen wird, dann wird das Form doch noch gar nicht angezeigt, deshalb kannst du es auch nicht schließen. Angezeigt wird es erst wenn Show oder ShowModal aufgerufen wird, siehe auch den OnShow-Event.
Allerdings ist das schlechter Stil. Die Reihenfolge sollte andersrum sein. Zuerst überprüfen ob der Datensatz vorhanden ist, dann und nur dann das Form erstellen und/oder anzeigen. Notfalls beim Anzeigen nochmal überprüfen, aber dann bei fehlenden Datensatz nicht einfach schließen, sondern mit einer Exception das Programm beenden! Denn dieser Fall darf dann bei einer ordentlichen Programmlogik nicht auftreten.
bis bald
akari
-
Hi, probiers dochmal mit:
_exit(1);
mfg
-
Hallo
_exit verursacht das Beenden des gesamten Programms, und zwar meines Wissens ohne irgendwelche Aufräumarbeiten. Also ganz bestimmt nicht das richtige.
bis bald
akari
-
Danke für die Antworten, ich habe mich bereits für akaris Vorschlag entschieden. Ich wollte dir Überprüfung in den Konstruktor des Formulars verschieben, damit ich das Formular von verschiedenen Stelln meiner Anwendung aufrufen kann, ohne jedes Mal eine Gültigkeitsüberprüfung zu machen (das sollte das Formular dann erledigen). Die jetztige Lösung ist folgende (und vermutlich auch die Sauberste):
void show_detail( TWinControl* Parent, unsigned int uiDataID, const TSomeType& Container ) { if( Container.size() < uiDataID ) { scoped_ptr<TDetailForm> Form( Parent, uiDataID, Container ); Form->ShowModal(); } else { MessageDlg( ... ); } }
-
Close schrieb:
Hi, probiers dochmal mit:
_exit(1);
mfg
Ähm.... ja. Also streng genommen schliesst dieser Aufruf das Formular im Konstruktor Aufruf. Und er schliesst so ziemlich alles andere auch. Ich bin mal so verwegen zu behaupten, dass man die _exit Funktion in modernen Win32 Anwendungen überhaupt nicht mehr braucht, da gibt es Eleganteres. Aber trotzdem Danke für deine Mühe.