Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   ShowModal mit Programmablauf und selbst schließen? (https://www.delphipraxis.net/158991-showmodal-mit-programmablauf-und-selbst-schliessen.html)

Chemiker 11. Mär 2011 06:38

AW: ShowModal mit Programmablauf und selbst schließen?
 
Hallo HJay,

meiner Meinung nach, ist es auch ungeschickt jedes Mal den Datenbank-Zugriff zu unterbrechen um die Anzeige zu aktualisieren. Ein Mehrwert hat der Benutzer dadurch nicht, im Gegenteil das ganze dauert nur unnötig lange weil man erst feststellen muss wie viel Datensätze verarbeitet werden sollen. Eine einfache Massagebox mit den Hinweis, dass der PC arbeitet würde dann reichen.

Bis bald Chemiker

hoika 11. Mär 2011 07:07

AW: ShowModal mit Programmablauf und selbst schließen?
 
Hallo,

ich mache das so.

ins FormActivate kommt der Code, etwa so

Delphi-Quellcode:
Application.ProcessMessages
// der Code
Zitat:

Etwa so: Wenn ich fertig bin schick mir ne message das ich mich beenden kann, weil close im onActivate nicht geht!
Close nicht, aber

Delphi-Quellcode:
PostMessage(Handle, WM_CLOSE, 0, 0);

Heiko

dataspider 11. Mär 2011 07:14

AW: ShowModal mit Programmablauf und selbst schließen?
 
Hi,

Himitsu hat das Beispiel zwar schon im Ansatz geschrieben,
ich komplettiere mal:

Code:

Interface
Uses
   ...
Const
  FM_STARTED = WM_USER + 1; // Formular komplett erzeugt
...
  protected
    procedure FmStarted(var Message: TMessage); message FM_STARTED; // MethodenName frei, Konstante für MessageId wichtig
implementation
...
procedure TfrmModal.FmStarted(var Message: TMessage);
begin
  // Verarbeitung
  ModalResult := mrOK; // oder Close
end;
// und ntürlich der Aufruf von PostMessage wie bei Himitsu
Ich habe hier allerdings Bedenken.
Falls in der Verarbeitung z.B. wegen ScrollBar ain Application.ProcessMessages kommt, funktioniert es wieder nicht.

Aber, Probieren geht über ...

Frank

alfold 11. Mär 2011 10:02

AW: ShowModal mit Programmablauf und selbst schließen?
 
Und nun? Wenn er beim einlesen der Daten evtl noch ein Try except block drin hat(?) oder es generell zur Unterbrechung kommt steht seine TFormProgress da und er kann nur noch eins machen strg+alt+del um sein Prog abzuschiessen. Oder mann macht nun noch zusätzliches rein um auch noch dieses abzufangen damit er wieder an seine MainForm kommt!
Das mag bei Ihm ja alles gehen. Wenn es dann aber auf eine anderen Maschine kommt ......

Es ist und bleibt ne unsaubere Lösung!

Ich schreibe dies nicht weil ich mich wichtig tun will, sondern aus eigener Erfahrung!

Ich kann nur nicht verstehen warum man von einem falschen Ansatz her nach Lösungen sucht um diesen evtl noch zu verschlimmern :?:

Gruss alfold

dataspider 11. Mär 2011 10:51

AW: ShowModal mit Programmablauf und selbst schließen?
 
Zitat:

Zitat von alfold (Beitrag 1087628)
Es ist und bleibt ne unsaubere Lösung!

Was ist die saubere Lösung? Der Timer?

Ich finde es sehr vermessen, alles, was nicht den eigenen Vorlieben entspricht, als unsauber zu deklarieren.

Auszug aus der Forms:
Code:
Show;
try
  SendMessage(Handle, CM_ACTIVATE, 0, 0);
  ModalResult := 0;
  repeat
    Application.HandleMessage;
    if Application.Terminated then ModalResult := mrCancel else
      if ModalResult <> 0 then CloseModal;
  until ModalResult <> 0;
Wie man sieht, wird nach allen Ereignissen (Show, Activate etc.) ModalResult auf 0 gesetzt.
Schliessen hier nicht möglich.
Das nächste ist HandleMessage - ProcessMessage und Idle.

Was ist nun unsauber daran, genau hier einzusteigen?

Sowohl Timer als auch PostMessage als auch Application.OnIdle kann man verwenden.

Ich persönlich bevorzuge weiterhin OnIdle, bezeichne die anderen Lösungen aber nicht gleich als unsauber.

Ich habe früher dafür auch einen Timer benutzt.
Aber man muss doch die Zeit gut wählen, damit er wirklich fertig ist (auch ProcessMessages braucht Zeit).

Den Fragesteller zu verunsichern, kann ja nicht das Ziel sein.

Frank

alfold 11. Mär 2011 11:29

AW: ShowModal mit Programmablauf und selbst schließen?
 
Ne der Timer nicht!
Daten da holen wo ich sie brauche in Main! TFormprogress nur als Anzeige!
fertig!
Schon spare ich mir das ganze konstrukt ein!

Gruss alfold

dataspider 11. Mär 2011 11:40

AW: ShowModal mit Programmablauf und selbst schließen?
 
Zitat:

Zitat von HJay (Beitrag 1087255)
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

alfold 11. Mär 2011 12:05

AW: ShowModal mit Programmablauf und selbst schließen?
 
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

HJay 11. Mär 2011 12:09

AW: ShowModal mit Programmablauf und selbst schließen?
 
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...

alfold 11. Mär 2011 12:20

AW: ShowModal mit Programmablauf und selbst schließen?
 
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 :wink:
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:36 Uhr.
Seite 4 von 5   « Erste     234 5      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz