AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ShowModal mit Programmablauf und selbst schließen?

Ein Thema von HJay · begonnen am 10. Mär 2011 · letzter Beitrag vom 11. Mär 2011
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.361 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: ShowModal mit Programmablauf und selbst schließen?

  Alt 11. Mär 2011, 11:40
Ich hätte wirklich gerne ein modales Fenster, damit die Fertigstellung abgewartet werden muss.
OK, darüber kann man diskutieren.
Aber es ist mit der o.g. Anforderung auch nicht so einfach zu realisieren.

Frank
Frank Reim
  Mit Zitat antworten Zitat
alfold

Registriert seit: 29. Jun 2010
Ort: Neustrelitz
393 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: ShowModal mit Programmablauf und selbst schließen?

  Alt 11. Mär 2011, 12:05
Da das Daten holen sicherlich in einer schleife läuft bis alle Daten da sind, hilft auch bringtofront um TformProgess ständig oben zu haben!
Da brauche ich kein ShowModal.

Gruss alfold
  Mit Zitat antworten Zitat
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#3

AW: ShowModal mit Programmablauf und selbst schließen?

  Alt 11. Mär 2011, 12:09
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 ein modales Fenster dafür perfekt geeignet.

2. Die Idee mit dem Timer habe ich auch mal testweise umgesetzt und zwar in der Form, dass der Timer nach FormActivate gestartet wird und auf dem TimerEvent dann die Routine liegt. Dies geht, aber man muss den Timer natürlich großzügig dimensionieren, damit die Form auch wirklich fertig ist. Letztlich ein Timer ja aber für mich gefühlt nur ein Workaround um das eigentliche Problem, nämlich exakt nach Fertigstellung der Form auch mit der Routine zu beginnen.

3. @alfold: Du hast zahlreiche kritische Bemerkungen abgegeben, die meines Erachtens größtenteils am Ziel vorbeigehen:

3a: "Close" ist hier gar nicht das Problem, außer dass es leider nicht von einem Activate- oder Show-Event aus passieren kann. Sowohl Timer als auch Application.OnIdle lösen mein Close-Problem. Das Hauptanliegen meiner Frage ist doch, wie ich in einer modalen Form automatisch mit einer Routine beginnen kann, NACHDEM das Fenster sichtbar ist und so, dass es refreshed werden kann.

3b: Daten holen wo gebraucht", ja, klingt erst einmal eingängig, ist es aber nicht. Die Aufgabe wäre dann, ein Fortschrittsfenster zu haben, das modal ist und weitere Nuttzinteraktion unterbindet... Ha, genau darum geht es doch. Wo nun die Daten geholt werden, ist schnuppe. In diesem Falle wird sogar eine Routine aus einer anderen Unit aufgerufen, die eben nur den Datenimport macht. Wo das passiert, ist doch für meine Frage völlig schnuppe.

3c: BringToFront und ähnliche Konstrukte sind doch auch nur Workarounds und verhindern nicht, dass der Nutzer auf der Form woanders herumclicken kann.

4. @Dataspider und Himitsu: Danke für den PostMessage-Code und den Code zur Implementierung. Das ist interessant und sicherlich für vieles zu gebrauchen. Muss ich mal üben. Für dieses Problem hilft es mir aber leider doch nichts, da ich meiner Fortschrittsanzeige sowohl Repaint als auch Application.ProcessMessages verwenden muss, damit die Form auf Zack bleibt.

5. @Chemiker: Das ist nicht wirklich richtig. Die Form-Refreshs dauern zusammen nur einige Millisekunden, während mein Datenzugriff Dutzende Sekunden dauern kann. Der Mehrwert des Nutzers ist also sehr hoch, der Zeitverlust kaum messbar. Ich persönlich finde es immer toll, wenn man abschätzen kann, wielange es noch dauern wird und nicht nur eine stupide Box kommt, dass der Rechner angeblich was tut.

Zusammenfassend stelle ich für mich fest, dass Dataspiders Application.OnIdle bisher die einzige gangbare Lösung ist. Zugleich sehe ich auch die möglichen Gefahren und Einschränkungen.

Ich gebe zu, dass eine noch bessere Lösung wünschenswert wäre. Timer und Message sind es jedoch nicht, aus obengenannten Gründen.

Ganz ehrlich kam ich mir anfangs selten blöde vor, dass sich dieses einfache Problem, das doch jeder Programmierer mal öfter haben muss, nicht lösen konnte. Inzwischen wundere ich mich, dass es dafür offensichtlich keine wirklich geradlinige Lösung gibt.

Ein Statusfenster mit Fortschrittsanzeige, das abgewartet werden muss, ist doch nichts seltenes...

Geändert von HJay (11. Mär 2011 um 12:13 Uhr)
  Mit Zitat antworten Zitat
alfold

Registriert seit: 29. Jun 2010
Ort: Neustrelitz
393 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: ShowModal mit Programmablauf und selbst schließen?

  Alt 11. Mär 2011, 12:20
Ich sehe hier aber nur den Vorteil!
Ich bleibe in Main habe dort die ganze kontrolle und muss mich nicht damit rumärgern wenn im Showmodal evtl noch was passiert
Auch wenn es nur einfache Bordmittel sind, sind diese manchmal efficienter als konstrukte die bei mir zu hause super funcen, aber wehe ich komm auf einer anderen Maschine und ein anderer benutzt dieses Prog.

Ich rede also nicht an Deinem Problem vorbei, sondern ich zeige nur auf was die Folgen sein können!

Solange Du in der ladeschleife bist kann mann zwar auf Main klicken aber viel dürfte da nicht passieren da Dein Progress oben bleibt, wenn man es vernünftig ansetzt!

Aber ich gebe dir durchaus recht, entscheiden musst Du, wie Du es umsetzten willst.

Gruss alfold

Geändert von alfold (11. Mär 2011 um 12:39 Uhr)
  Mit Zitat antworten Zitat
angos

Registriert seit: 26. Mai 2004
Ort: Rheine
553 Beiträge
 
Delphi 12 Athens
 
#5

AW: ShowModal mit Programmablauf und selbst schließen?

  Alt 11. Mär 2011, 13:13
Man könnte das ganze doch, wie von alfold vorgeschlagen lösen, und das Problem mit dem Klicken auf der Mainform umgehen, indem man die Mainform Disabled, oder sehe ich das falsch?
Ansgar
  Mit Zitat antworten Zitat
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#6

AW: ShowModal mit Programmablauf und selbst schließen?

  Alt 11. Mär 2011, 13:14
Du brauchst ein Formular, das dein anderes überblendet, und kein modales Fenster!!! Ansonsten müsste dein Splash Formular die Arbeit machen.
Das mit dem Überblenden sollte ohne große Probleme mit TOPMOST möglich sein! modal heißt warte bis das Formular etwas zurückliefert.

Das mit dem OnIdle funktioniert, ob es schön ist ist eine andere Frage.
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
637 Beiträge
 
Delphi XE6 Enterprise
 
#7

AW: ShowModal mit Programmablauf und selbst schließen?

  Alt 11. Mär 2011, 13:39
Ich würde das so machen:

1. In TForm1 eine Variable "FirstActivation" anlegen
2. Im OnCreate() diese auf true setzen
3. Im OnActivate() dann:
Code:
if FirstActivation then begin
  FirstActivation := false;
  (lange dauernde Aktionen mit Fortschrittsbalken);
  PostMessage(Self.Handle, WM_CLOSE, 0, 0);
end
Wenn Dir OnActivate zu "früh" ist, nimm halt OnResize. Ich habe allerdings noch kein Formular gehabt, das im OnActivate noch nicht fertig gezeichnet gewesen wäre (und ich habe hier Forms mit dutzenden von Controls).
  Mit Zitat antworten Zitat
alfold

Registriert seit: 29. Jun 2010
Ort: Neustrelitz
393 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: ShowModal mit Programmablauf und selbst schließen?

  Alt 11. Mär 2011, 14:31
Ok, sehr simples Beispiel. (nicht getetstet kein Delphi zur Hand)

Delphi-Quellcode:
procedure TForm1.HoleDaten1Click(Sender: TObject);
var
   i: Integer;
begin
   if connect then//DBConnect
   begin
       try
          form2:= TForm2.Create(self);
          form2.show;
          //hole daten
          for i:= 0 to 100 do
          begin
              //ix Daten einlesen oder wie auch immer!
              form2.ProgressBar1.Position:= i;
          end;
       except
           Form2.Close;
           raise//wenn was passiert
       end;
       Form2.Close;
   end
   else
   begin
       //no connect
   end;
end;
Solange er in dieser Schleife(Procedure) ist kann er weder Form2 bewegen noch Main anklicken!

1. Vorteil, Form2 brauch nicht mal zu wissen das es Form1 gibt(uses).
2. Vorteil, Es bleibt alles in Main einschliesslich der gesamten Kontrolle.
3. Vorteil, Die Variablen bleiben Privat müssen nicht Public oder sogar Global gesetzt werden( je nach dem wie ich die units einbinde).
4. Vorteil, Ich habe nicht '2' getrennte Anordnungen um sicher zustellen das alles in der Form2, wenn sie Showmodal ist, auch richtig funktioniert und muss mir keinen Kopf machen die Daten nun noch zur MainForm zu schicken!

Wenn das nicht Save ist?

Was will man mehr

Gruss alfold

Geändert von alfold (11. Mär 2011 um 15:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#9

AW: ShowModal mit Programmablauf und selbst schließen?

  Alt 11. Mär 2011, 14:37
ich würde mich WM_Close in #42 anschließen und habe immer noch nicht verstanden was bei #21 nicht passen soll...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#10

AW: ShowModal mit Programmablauf und selbst schließen?

  Alt 11. Mär 2011, 17:10
1. Vorteil, Form2 brauch nicht mal zu wissen das es Form1 gibt(uses).
Das muss die modale Form auch nicht -- jenachdem, welche Daten wie bearbeitet werden. Diese Vorteil ist nicht-existent.

2. Vorteil, Es bleibt alles in Main einschliesslich der gesamten Kontrolle.
Wo genau ist der Vorteil? Ich finde das Verfahren eher komplizierter. In der aufrufenden Form ist das doch übersichtlich und logisch:
Code:
// irgendwas davor
 if FormGetData.ShowModal = mrOK then ... else ...
// danach sicher sein, dass alles fertig und weiter geht's
3. Vorteil, Die Variablen bleiben Privat müssen nicht Public oder sogar Global gesetzt werden( je nach dem wie ich die units einbinde).
Na ja, die Daten müssen ja sowieso verwendet werden -- wo auch immer. Dieser Vorteil wäre höchstens für ganz kleine Programme gegeben, die nur aus FormMain und FormProgress bestünden.

4. Vorteil, Ich habe nicht '2' getrennte Anordnungen um sicher zustellen das alles in der Form2, wenn sie Showmodal ist, auch richtig funktioniert und muss mir keinen Kopf machen die Daten nun noch zur MainForm zu schicken!
He?! WENN es funktioniert (oder wenn es eine gute Lösung gäbe), dann müsste man sich auch keinen Kopf machen.

@Angos: Dein Vorschlag mit Form.Diabled ist richtig und wäre das mindeste, was man machen müsste. Eine modale Form löst genau das einfach so.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:27 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-2025 by Thomas Breitkreuz