Form als Dialog öffnen

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von T1g0r.

    Form als Dialog öffnen

    Hi,

    ich habe ein "Problem" mit dem Öffnen einer Form.

    Ich arbeite mit einem Backgroundworker, welcher Daten verarbeitet. Während dieser Verarbeitung möchte ich ein neues Fenster anzeigen, auf dem "Warten Sie..." steht. Außerdem soll eine Progressbar aktualisiert werden.

    Nun möchte ich das Warte-Fenster vor dem Backgroundworker-Start aufrufen.
    Grund: Rufe ich das Fenster nach dem Start auf, kann es, je nach Auslastung, vorkommen dass das Fenster erst angezeigt wird, wenn die Progressbar schon bei 10-20...% ist.

    Das Fenster soll natürlich alle anderen Blockieren, daher würde es sich ja anbieten, das Fenster als Dialog zu öffnen.

    Mein Problem ist jetzt, das wenn ich das Fenster vor dem Backgroundworker als Dialog öffne, aktualisiert sich das Fenster nicht.
    Mit TopMost ist das Fenster zwar im Vordergrund allerdings weis ich nicht wie ich die anderen Formen blockieren soll.

    Wie kann ich das Fenster so öffnen, dass die anderen Fenster blockiert sind und sich die Progressbar aktualisiert.

    MfG
    wintoolz.de
    • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
    • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
    • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

    Benutze auch du Ecosia
    Hey,

    also wenn ich eine neue Form mit

    Quellcode

    1. Info.ShowDialog()

    öffne, ist diese im Vordergrund und blockiert alle anderen Fenster meiner Applikation. Oder habe ich da bei dir jetzt etwas falsch verstanden?

    Edit: :D Jetzt habe ich dein Problem verstanden....

    Gruß, Manschula

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Manschula“ ()

    Richtig.
    Öffne ich die Form als Dialog VOR dem BGW-Start, wird die Progressbar nicht aktualisiert.
    Öffne ich die Form als Dialog NACH dem BGW-Start, wird diese unter umständen nicht sofort angezeigt.
    wintoolz.de
    • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
    • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
    • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

    Benutze auch du Ecosia
    Ich merke gerade, dass der BGW erst startet, wenn ich das Warte-Fenster schliese.
    Durch das Dialog eben...
    wintoolz.de
    • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
    • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
    • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

    Benutze auch du Ecosia
    Hallo Tig0r,

    keine Doppelposts bitte - Editieren Funktion verwenden !

    Durch das Dialog eben...

    Der Dialog macht das was man von ihm erwartet.
    Die verarbeitung Stoppt solange bis der Dialog beendet wurde, wenn du das nicht willst darfst du kein ShowDialog ausführen.

    Gruss

    mikeb69
    Hallo xaser2k,

    ein doEvents nach dem ShowDialog Aufruf wird genauso spät abgearbeitet wie alle anderen Befehle.

    Wenn schon, dann sollte sich Tig0r sein Konzept nochmal durch den Kopf gehen lassen.

    Nochwas am Rande:
    Wer sinnvoll Programmiert muss gar nicht erst über DoEvents ja oder nein nachdenken.
    Denn er braucht es nicht !

    Gruss

    mikeb69
    Sry wegen Doppelpost, habe ich danach auch gemerkt.
    Ich weis das es an dem Dialog liegt. Wie kann ich es ohne Dialog realisieren, dass die anderen Formen nicht auswählbar sind?
    Mit TopMost bring ich die Form immer in den Vordergrund. Aber das Auswählen verbieten? Was gibts da für Möglichkeiten?
    wintoolz.de
    • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
    • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
    • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

    Benutze auch du Ecosia
    Hi.

    Ich habe mich mal damit beschäftigt. War eigentlich gar nicht so schwer. Wenn man schon zwei Threads hat und der Mainthread sowieso vom Dialog blockiert wird, kann dieser sich doch auch nützlich machen und den Dialog gleich anzeigen, oder? Der Clou liegt allerdings darin, dass der BackgroundWorker im RunWorkerCompleted-Ereignis den Dialog schließt, der eigentlich vom Mainthread offen gehalten wird. Das geht ganz einfach durch setzen eines DialogResult-Wertes. Positiv fällt auf, dass die Threadsicherheit automatisch gewährleistet ist.

    Projekt folgt:
    Dateien
    Gruß
    hal2000
    Danke für die Mphe. Das bringt mich jetzt aber nicht wirklich weiter.
    Du öffnest die Form nach dem Backgroundworker-Start.

    VB.NET-Quellcode

    1. bgw.RunWorkerAsync()
    2. frm2.ShowDialog() 'Mainthread zeigt den Dialog an

    Wie ich oben schon gesagt habe:
    Grund: Rufe ich das Fenster nach dem Start auf, kann es, je nach Auslastung, vorkommen dass das Fenster erst angezeigt wird, wenn die Progressbar schon bei 10-20...% ist.
    wintoolz.de
    • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
    • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
    • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

    Benutze auch du Ecosia
    Diese beiden Zeilen

    VB.NET-Quellcode

    1. bgw.RunWorkerAsync()
    2. frm2.ShowDialog() 'Mainthread zeigt den Dialog an

    werden ziemlich schnell ausgeführt. Wenn dein Hintergrundvorgang in dieser Zeit schon 20% erreicht hat, kann er nicht allzu lange dauern. Ich schätze mal 100ms, da das Starten eines Threads nicht allzu lange dauert. Das soll sagen, dass deine ganze Mühe mit dem BackgroundWorker unnötig ist.
    Es kann natürlich sein, dass der Hintergrundvorgang bei 20% einfach stehen bleibt / langsamer wird - das würde bedeuten, dass du diesen Code nochmal überdenken solltest (weil er nicht flüssig läuft).
    Gruß
    hal2000
    Das die Zeilen schnell ausgeführt werden, da diese untereinander liegen, ist klar.
    Allerdings dauert es vielleicht 3-4 Sekunden bis die Form2 angezeigt wird. Und dann steht die Progressbar unter umständen schon bei einigen Prozenten.
    Ich denke mal nicht das der Backgroundworker unnötig ist, da ich Datensätze von einer Datenbank in eine andere Kopiere. Und das können mehrere Hundert sein.
    Es kann natürlich sein, dass der Hintergrundvorgang bei 20% einfach stehen bleibt / langsamer wird - das würde bedeuten, dass du diesen Code nochmal überdenken solltest (weil er nicht flüssig läuft).
    Der Vorgang läuft flüssig, wenn die Form mal geladen ist.
    Bin gerade auf der Suche, wie man die anderen Formen blockieren kann. Dann würde ich die Form normal aufrufen.
    wintoolz.de
    • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
    • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
    • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

    Benutze auch du Ecosia
    a) Wieso läuft der Code in der einen form, statt von der "Bitte warten" form ausgeführt zu werden?

    b) Wieso übergibst du dem BG nicht einfach eine Referenz auf "FrmWait". FrmWait könnte dann eine Public Eigenschaft haben (zb IsReady), die vom BG abgefragt wird und erst wenn die gesetzt ist (zb im Shown event), macht der BG seinen eigentlichen Job.
    a) Wieso läuft der Code in der einen form, statt von der "Bitte warten" form ausgeführt zu werden?
    Ja, logisch :pinch:
    Wenn man vor lauter Bäumen den Wald nichtmehr sieht....
    So funktioniert es natürlich :thumbup:
    Danke
    wintoolz.de
    • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
    • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
    • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

    Benutze auch du Ecosia