"Bitte Warten..." - Box, wie realisier ich sowas?



  • 'nabend zusammen.

    Folgendes Problem:

    Hab hier eine Funktion, die relativ zeitintensiv ist.
    Während diese arbeitet, soll ein neues Fenster erscheinen, so etwas z.B:

    "Bitte warten... Daten werden ausgewertet."

    Währenddessen soll die Funktion weiterlaufen, und am Ende der Funktion soll dies Fenster automatisch geschlossen werden.

    Wer kann mir sagen, wie ich das am einfachsten realisieren kann?

    Mit nonmodalen Dialogformen - das hab ich als Möglichkeit gegoogelt - kenne ich mich leider (noch) nicht aus.

    Danke!



  • Wenn es dich nicht stört dass das Programm sonst auf nixmehr reagiert während die "bitte warten" box zu sehen ist geht das mit einem nicht modalen Dialog ("modeless"). Mit MFC ist das auch relativ einfach, gucks dir einfach mal an. Du musst nen anderen Konstruktor verwenden, und CDialog::Create statt CDialog::DoModal.

    Wenn das Programm aber noch auf irgendwas reagieren soll (z.B. wenn in dem Dialog ein "Abbrechen" Button drin sein soll, oder das Programmfenster neu gezeichnet werden soll falls es zwischenzeitlich verdeckt war) musst du wohl entweder einen Thread rausstarten oder die Funktion so implementieren dass du eine "mach ein bissi was" Funktion hast, die du immer wieder aufrufst bis sie fertig ist (und zwischen den Aufrufen eben immer Messages verarbeitest).



  • hustbaer schrieb:

    Wenn es dich nicht stört dass das Programm sonst auf nixmehr reagiert während die "bitte warten" box zu sehen ist geht das mit einem nicht modalen Dialog ("modeless").

    Verwechselst Du jetzt nicht Modal mit NichtModal.
    Die Idee von Nichtmodal ist doch, dass man im Elternfenster weiterhin arbeiten kann! (vgl. den Suchendialog in Word)


  • Mod

    Nein! hustbaer hat schon recht.
    Er meint einen nicht modalen Dialog. Denn der Aufruf DoModal kehrt ja nicht zurück und man kann nicht weiterarbeiten. Außer man verlagert die ganze Aktion in den Code des modalen Dialoges und terminiert den modalten Dialog gleich wieder in OnInitDialog.

    Der nicht modale Dialog wird erzeugt. Es wird UpdateWindow aufgerufen und damit hats sichs. Der Dialog wird entsorgt wenn der Vorgang beendet ist.
    Zwischendrin kann man sogar noch mit SetWIndowText/SetDlgItemText ein bischen Fortschritt signalisiern und UpdateWindow noch mal aufrufen um den Dialog evtl. noch mal neu zeichnen zu lassen, falls der User mal Alt+Tab gemacht hat in der Zwischenzeit.



  • Martin Richter schrieb:

    Nein! hustbaer hat schon recht.
    Er meint einen nicht modalen Dialog. Denn der Aufruf DoModal kehrt ja nicht zurück und man kann nicht weiterarbeiten. Außer man verlagert die ganze Aktion in den Code des modalen Dialoges und terminiert den modalten Dialog gleich wieder in OnInitDialog.

    Der nicht modale Dialog wird erzeugt. Es wird UpdateWindow aufgerufen und damit hats sichs. Der Dialog wird entsorgt wenn der Vorgang beendet ist.
    Zwischendrin kann man sogar noch mit SetWIndowText/SetDlgItemText ein bischen Fortschritt signalisiern und UpdateWindow noch mal aufrufen um den Dialog evtl. noch mal neu zeichnen zu lassen, falls der User mal Alt+Tab gemacht hat in der Zwischenzeit.

    Kapier ich jetzt nicht 😕

    Modaler Dialog : Wird mit DoModal erstellt. Die Kontrolle des Threads geht vom Parentfenster in den Dialog über, solange bis der Dialog terminiert (wird)
    (daher heisst der aufruf auch DoModal 😉 )

    Nicht modaler Dialog: Dialog wird mittels CDialog::Create erstellt und läuft quasi "parallel" zum Parentfenster..



  • khrl01 schrieb:

    Martin Richter schrieb:

    Nein! hustbaer hat schon recht.
    Er meint einen nicht modalen Dialog. Denn der Aufruf DoModal kehrt ja nicht zurück und man kann nicht weiterarbeiten. Außer man verlagert die ganze Aktion in den Code des modalen Dialoges und terminiert den modalten Dialog gleich wieder in OnInitDialog.

    Der nicht modale Dialog wird erzeugt. Es wird UpdateWindow aufgerufen und damit hats sichs. Der Dialog wird entsorgt wenn der Vorgang beendet ist.
    Zwischendrin kann man sogar noch mit SetWIndowText/SetDlgItemText ein bischen Fortschritt signalisiern und UpdateWindow noch mal aufrufen um den Dialog evtl. noch mal neu zeichnen zu lassen, falls der User mal Alt+Tab gemacht hat in der Zwischenzeit.

    Kapier ich jetzt nicht 😕

    Modaler Dialog : Wird mit DoModal erstellt. Die Kontrolle des Threads geht vom Parentfenster in den Dialog über, solange bis der Dialog terminiert (wird)
    (daher heisst der aufruf auch DoModal 😉 )

    Genau. Wenn man nun aber woanders die zeitintensive Rechenarbeit macht, dann wird diese er durchgezogen, wenn der modale Dialog beendet wird. Das soll ja aber nicht sein. Der Threadersteller will ja, dass der Dialog gezeigt wird und gleichzeitig die Arbeit verrichtet wird. Das würde mit doModal() nur gehen, wenn man die zeitintensive Aktion direkt im Dialog implementiert.

    chrische

    Nicht modaler Dialog: Dialog wird mittels CDialog::Create erstellt und läuft quasi "parallel" zum Parentfenster..[/quote]


Anmelden zum Antworten