Eine Form nach dem Anzeigen auf Modal setzen
-
Gibt es eine Möglichkeit ein Formular erstmals aus eine Funktion mit Show() anzuzeigen, anschliessend noch irgendwelche Sachen abzuarbeiten, und erst anschliessend das Formular modal machen?
Ein Beispiel:
... ... Form2->Label1->Caption = "PrüfeDiesUndDas"; Form2->Show(); PrüfeDiesUndDas(); PrüfeDasUndDies(); Form2->Label1->Caption = "...Done"; Form2->ShowModal();
Der Zweck ist klar: Nach Show() läuft die Funktion noch weiter; nach ShowModal() nicht mehr; Allerdings geht das so nicht, weil eine angezeigte Form im Nachhinein nich mehr Modal angezeigt werden kann, so die VCL-Exception. Geht es trotzdem irgendwie? - Was ich nicht möchte ist zuerst Hide() und dann ShowModal() (wegen flackern; wäre doch zu billig)
Besten Dank für allfällige Tipps. Vielleich muss das Posting auch nach WinAPI verschoben werden wenns mit VCL nicht geht...
- Adrian
-
Alternativen wären:
1. ShowModal() überschreiben
2. Code in der Ereignisbehandlung zu OnShow abarbeitenWas spricht gegen diese Lösungen?
Gruß,
Alexander
-
Ja, das wären Möglichkeiten. Allerdings geht es bei meinem Klassendesign nicht... Naja, muss das ganze vielleicht etwas umplanen.
Vielleicht gibt es aber eine API-Funktion, die nachträglich draus Modal macht. Ich gehe nochmals über die Bücher. Aber wenn es BCB nicht kann, hat das wahrscheinlich schon einen Grund.Danke trotzdem.
- Adrian
-
Könnte nicht eher ein Mangel im Konzept vorliegen?
Form2->Show();
PrüfeDiesUndDas();
PrüfeDasUndDies();Da wird die Form geöffnet und gleich soll etwas geprüft werden? Es war doch u.U. noch überhaupt keine Zeit da, dass irgendwelche Ereignisse an die Form gelangten? Solche Prüfungen sollten am Feld der jeweiligen Form erfolgen, oder dann, wenn die Daten tatsächlich benötigt werden.
Das die Eigenschaften modal/ nicht modal Eingenschaften des Fensters sind, die bei der Erzeugung angegeben werden, wird das Ändern ohne eine neues Fenster wohl nicht möglich sein.
-
ABader schrieb:
Allerdings geht es bei meinem Klassendesign nicht... Naja, muss das ganze vielleicht etwas umplanen.
Vielleicht gibt es aber eine API-Funktion, die nachträglich draus Modal macht. Ich gehe nochmals über die Bücher. Aber wenn es BCB nicht kann, hat das wahrscheinlich schon einen Grund.Wenn's bei Deinem Klassendesign nicht geht, dann hat Christian211 wohl recht damit, dass ein Fehler im Konzept vor-
liegt - aber sowas kann man ja ändern.
Ein Formular erst nicht modal anzuzeigen und nachträglich modal zu machen, kommt mir etwas merkwürdig vor.Gruß,
Alexander
-
Ihr habt in meinem Fall recht. Ich habe das jetzt geändert; Habe eine Ereignisroutine OnActivate des Modal anzuzeigenden Formulars in die Klasse umgebogen, welche das Formular anzeigt. So ists sicher sauber.
Allerdings gäbe es schon Anwendungen, wo das obige auch sinnvoll und sauber sein könnte. Aber auf diese Weise (wie oben) ist es sicher besser und schöner.
Besten Dank!
- Adrian
-
Ich hoffe, dass ich in meinem ersten Beitrag nicht zu viel Blödsinn verzapfe.
Wenn ich das richtig verstanden habe, hast die Routine zur OnActivate-Ereignisbehandlung des modalen Form's dort rausgenommen und in die rufende Routine des "MainForm" mit reingepackt?
Ich wäre genau den umgekehrten Weg gegangen. Ich hätte PrüfeDiesUndDas() & PrüfeDasUndDies() in die OnCreate oder (je nach Inhalt) in die OnActivate Ereignis-Behandlung des modalen Form's geschoben.
"Innerhalb" des modalen Forms läuft ja alles. Nur die rufende Routine wartet.Falls Du die Ergebnisse der Prüfungen brauchst, wäre eine Abarbeitung vor ShowModal eh sinnvoll. Notfalls könntest Du die aber auch aus dem modalen Form zurückgeben. :xmas2:
-
Ich hoffe, dass ich in meinem ersten Beitrag nicht zu viel Blödsinn verzapfe.
Willkommen im Forum!
Danke für Deinen Beitrag. Klar hast Du recht. Aber je nach Design ist es natürlich nicht ohne weiteres Möglich. Wenn man quasi die hier modal angezeigte Form eigentlich gar nicht im Object-Design haben will, das heisst mit der gar nichts zu tun haben will und auch nichts an ihr umprogrammieren will, muss man eben andere Wege nehmen. Klar, man kann immer darüber diskutieren, ob es andersrum nicht schlauer gewesen wäre... Schlussendlich habe ich es jetzt so gelöst, wie oben bereits beschrieben...
Aber danke trotzdem!
- Adrian