-
Forum: GUI-Design mit VCL / FireMonkey / Common Controls
by HJay,
11. Mär 2011
Das muss die modale Form auch nicht -- jenachdem, welche Daten wie bearbeitet werden. Diese Vorteil ist nicht-existent.
Wo genau ist der Vorteil? Ich finde das Verfahren eher komplizierter. In der aufrufenden Form ist das doch übersichtlich und logisch:
// irgendwas davor
if FormGetData.ShowModal = mrOK then ... else ...
// danach sicher sein, dass alles fertig und weiter geht's
-
Forum: GUI-Design mit VCL / FireMonkey / Common Controls
by HJay,
11. Mär 2011
Vorab vielen Dank üfr die interessanten Diskussionen zum Thema.
1. Ich halte ein modales Fenster für notwendig, damit auf der FormMain nicht herumgeclickt werden kann, während die Routine läuft. Genau dazu sind modale Fenster gedacht und als Meldungsfenster (was passiert und wie der Fortschritt ist), ist es auch ideal. Wenn jemand einen besseren Vorschlag hat, nur raus damit, aber ich finde...
-
Forum: GUI-Design mit VCL / FireMonkey / Common Controls
by HJay,
10. Mär 2011
Sicher, wenn Application.OnIdle auch anderweitig verwendet wird, muss man auf der Hut sein. Die Gefahr besteht derzeit bei mir nicht, glaube ich. Aber dennoch, danke für die Warnung.
Kann mal jemand einen kurzen Code-Vorschlag machen, wie man das statt Application.OnIdle mit einer eindeutigen Message an die eigene Form machen würde? Ich kenne mich mit Messages nicht so aus.
Wir wird die...
-
Forum: GUI-Design mit VCL / FireMonkey / Common Controls
by HJay,
10. Mär 2011
Mir gefällt Franks Lösung mit Application.OnIdle jetzt sehr gut. Geradlinig und dennoch simpel.
Allerdings bleibt die Frage, ob man das auch irgendwie ebenso geradlinig auf Formular-Ebene hätte lösen können. Also eine Routine definieren, die nach allen anderen genannten Ereignissen dann aufgerufen wird.
Die Idee mit der Message an sich selbst ist auch nicht so schlecht, vorausgesetzt, die...
-
Forum: GUI-Design mit VCL / FireMonkey / Common Controls
by HJay,
10. Mär 2011
Hallo Frank, ja, das war die Lösung. Vielen Dank. Ich hatte sie nicht gleich verstanden, weil das globale Application-Objekt so eigenartig hier aussah, aber es ist logisch: In der modalen Form geht auch die gesamte Application in idle, wenn die Form fertig ist, sich zu zeichnen und nichts weiter passiert. Hoffentlich passt das wirklich exakt im strengen Sinne, also dass OnIdle niemals vorher...
-
Forum: GUI-Design mit VCL / FireMonkey / Common Controls
by HJay,
10. Mär 2011
Minimaler Fortschrtt: Wenn ich OnShow leer lasse und die Rechenroutine in OnActivate ausführe, dann ist das Formular wenigstens schon zu sehen und stellt den Fortschritt richtig da.
Allerdings schließt es sich immer noch nicht von alleine. Sowohl Close als auch ModalResult := mrOK in OnActiviate werden ignoriert, es bleibt einfach offen.
OnActivate ist also immer noch zu früh, um...
-
Forum: GUI-Design mit VCL / FireMonkey / Common Controls
by HJay,
10. Mär 2011
SirThornberry: Danke, das beruhigt mich etwas. Du hast das Problem exakt richtig dargestellt. Ich vermute einfach, dass ich nur zu blöde bin und es dafür eine einfache Standardlösung geben muss, weil dieses Problem doch sehr oft auftreten muss.
Meine Datenbanzugriffe benötigen etliche Sekunden, teilweise gar Minuten. Beim ersten Mal kann der User auch nichts anderes sinnvolles machen, als eben...
-
Forum: GUI-Design mit VCL / FireMonkey / Common Controls
by HJay,
10. Mär 2011
Sorry, diesen Tipp verstehe ich nicht. Was soll ich dann in der neuen ShowModal-Prozedur machen?
Ich möchte
* die TFormProgress modal öffnen und sichtbar machen
* dann erst den Programmablauf starten
* nach Fertigstellung dann die modale Form wieder programmgesteuert schließen
-
Forum: GUI-Design mit VCL / FireMonkey / Common Controls
by HJay,
10. Mär 2011
Ich komme mir selbst blöde vor, aber wie löst man folgende Aufgabe geradlinig:
Ich möchte eine TForm modal öffnen, dann dort SOFORT bestimmte Operationen (Datanbankzugriffe) ausführen, währenddessen den Fortschritt anzeigen und DANACH das modale Fenster auch gleich wieder selbst schließen.
TFormProgress.Show(Sender: TObject);
begin
ShowMessage('start');
// here some time-consiming...