Progress Dialog modal anzeigen
-
Hi Leute,
ich habe folgendes Problem:
Ich möchte während mein Programm rappelt einen Progress Dialog anzeigen. Während
das Programm arbeitet soll es jedoch nicht möglich sein mit anderen Fenstern der
Anwendung zu arbeiten d.h. es ist das Verhalten wie bei modalen Dialogen gewünscht.Nun das ist jetzt aber das Problem. Eine Anwendung kann mit der Verarbeitung des
Programmes erst fortfahren wenn das modale Fenster vom Benutzer geschlossen wurde.Aus diesen Grund mußte ich jetzt übergangsweise ein nicht-modales Fenster
verwenden. Jedes Mal wenn das Fenster aktualisiert werden soll wird jetzt
ein Application->ProcessMessages() ausgeführt, welches es auch ermöglicht
das auf die Aktion "Abbrechen" reagiert werden kann.Die Nebenwirkung ist aber das in den anderen Fenstern der Anwendung all möglicher
Schund getrieben werdenn kann.Weiß jemand wie ich ein modales Verhalten erreiche und mein Programm dennoch
weiterverarbeitet wird?Vielleicht kennt jemand Palm-Desktop oder InstallShield Express. Dort ist
es genauso umgesetzt wie ich es haben will. Während die Kiste rappelt sind
die anderen Fenster vorbidden.Thanks
Brainchild
-
So was habe ich mal schon gemach. hier ist Code aus meinem Prog. Kurz gesagt: Timer schickt eine Nachricht, die ein Process startet und danach wird die Form Modal geöffnet (Wichtig mit PostMessage)
*.h //--------------------------------------------------------------------------- #ifndef Main_formH #define Main_formH //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> .... // messages !!! #define WMU_DATAREFRESH WM_USER+1001 ... //--------------------------------------------------------------------------- class TRES_VentanaMain : public TForm { __published: // Von der IDE verwaltete Komponenten ... private: // Anwender-Deklarationen ... // !!! void __fastcall DataRefresh(TMessage &Message); // aktuallieiert daten public: // Anwender-Deklarationen ... // !!! BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WMU_DATAREFRESH, TMessage, DataRefresh); END_MESSAGE_MAP(TControl) }; //--------------------------------------------------------------------------- extern PACKAGE TRES_VentanaMain *RES_VentanaMain; //--------------------------------------------------------------------------- #endif *.cpp //------------------------------- ------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Main_form.h" .... #include "activity_form.h" TRES_VentanaMain *RES_VentanaMain; //--------------------------------------------------------------------------- __fastcall TRES_VentanaMain::TRES_VentanaMain(TComponent* Owner) : TForm(Owner) { ... } //--------------------------------------------------------------------------- ... //--------------------------------------------------------------------------- void __fastcall TRES_VentanaMain::Timer1Timer(TObject *Sender) { Timer1->Enabled = false; PostMessage(Handle, WMU_DATAREFRESH, 0, 0); // !!! FrmActivity->ShowModal(); // !!! if (AutoRefresh) Timer1->Enabled = true; } //--------------------------------------------------------------------------- .... //--------------------------------------------------------------------------- void __fastcall TRES_VentanaMain::DataRefresh(TMessage &Message) { // TO DO // ... FrmActivity->Close(); } //---------------------------------------------------------------------------
-
Verstehe ich das richtig, dein Timer soll dafür sorgen das nach dem Öffnen
des Dialogs das Programm trotzdem weiterausgeführt wird?
-
Timer ist nur bei mir.
nimm einfach ein Button. mit Button1 wird wir Process angestoßen.
1. PostMessage sendet eine Nachricht an die Botschaftsbehandlungsroutine fder Form. Die Nachricht wird abgefangen (BEGIN_MESSAGE_MAP...END_MESSAGE_MAP) und entsprechende Routine gestartet. in meinem Fall DataRefresh();.
da PostMessage nicht auf Abarbeitung der Routine wartet, wird FrmActivity->ShowModal(); sofort danach aufgerufen.
DataRefresh() und FrmActivity laufen dann parallel.void __fastcall TRES_VentanaMain::Button1Click(TObject *Sender) { PostMessage(Handle, WMU_DATAREFRESH, 0, 0); // !!! FrmActivity->ShowModal(); // !!! } //---------------------------------------------------------------------------
-
Das klingt vernüftig.
Ich muss zu meiner Schande gestehen das ich in Sachen WinAPI noch deutlichen
Nachholbedarf habe.Kannst Du mir erläutern was die einzelnen Zeilen machen?
Ich nehme an das folgende Zeile die Funktion DataRefresh der WinAPI bekannt
macht und ihr die Parameterliste (TMessage) sowie einen Funktionspointer auf
DataRefresh übergibt.MESSAGE_HANDLER(WMU_DATAREFRESH, TMessage, DataRefresh);
Was bedeutet aber das TControl hier?
END_MESSAGE_MAP(TControl)
PostMessage veranlaßt dann die Funktion von der WinAPI direkt aufzurufen.
Richtig? Zu welchem Zeitpunkt ruft PostMessage dann die Funktion auf?
-
Ich kann vom modalen Dialog aus Aufträge an die Hauptanwendung geben, die auch abgearbeitet werden - eben noch mal explizit ausgecheckt. - Also arbeitet die App im Hintergrund nur nicht, wenn/weil sie keine Aufträge hat.
Du könntest also die Funtionen zur Abarbeitung vom modalen Dialog aus aufrufen und nach dem Arbeitsende den Dialog schließen/(wechseln) lassen, wie im InstallShield.
-
BEGIN_MESSAGE_MAP eintippen und F1 drucken
-
der Vorschlag von Omega-X funktioniert natürlich auch.
ict aber für einfache Vortschrit Anzeige nicht besonders geeignet. wenn die Form von mehreren Stellen im Programm für verschidene Aufgaben benutzt wird.
-
warum so kompliziert. die form einfach mit show anzeigen und mit einer hilfsvariable das schliessen (OnClose oder OnCloseQuery) verhindern, solange diese nicht den gültigen wert hat. oder bei focusverlust (OnDeactivate)!
-
es geht darum, dass so lange process nicht abgearbeitet ist, darf man in der hauptanwendung nix machen. und mit ShowModal() kann man das einfach erreichen
-
das kann ich auch! und wesentlich einfacher!
-
Da muss ich Xqgene beipflichten. Es ist schon wesentlich eleganter wenn der Dialog
nicht direkt den Prozess startet. Aber der Vorschlag von Sunday wäre auch eine
Möglichkeit, die ich bisher außer Acht gelassen habe.In meinem Fall werde ich jedoch Xqgene's Variante bevorzugen, da mein Dialog auf
Fortschritts-Events meines Vorgangs reagieren soll.