Erkennen, ob bei Form2.showdialog ausserhalb des Forms gedrückt wird

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von HerrFrie.

    Erkennen, ob bei Form2.showdialog ausserhalb des Forms gedrückt wird

    Hallo Leute,

    ich lasse mir zur Datumswahl ein Form per .ShowDialog anzeigen. Es wäre schön, wenn sich das Form schließen würde, wenn man ausserhalb des Forms klicken würde.

    Ist das irgendwie möglich ?


    Gruß
    HerrFrie
    Falls das nicht geht, im MouseClick-Event die Position überprüfen:

    VB.NET-Quellcode

    1. If e.Location.X < 0 OrElse e.Location.Y < 0 OrElse e.Location.X > Me.Size.Width OrElse e.Location.Y > Me.Size.Height Then
    2. Me.Close()
    3. End If
    ich glaub, haut beides nicht hin: LostFocus geht glaub wg. ShowDialog() nicht, und ein Mouse_Click-Event wir logischerweise nicht gefeuert, wenn man daneben klickst ;)

    Also v.a. .ShowDialog geht nicht - nimm .Show.

    Und dann hatte ich gelegentlich das Form_Deactivated - Event für sowas in anspruch genommen - aber .LostFocus könnte auch gehn - k.A..

    Hoho - jetz getestet: .Deactivate geht sogar mit .ShowDialog :)

    nochmal getestet: .LostFocus auch.

    und nochmehr getestet: beides ist unzureichend, weil geht nicht, wenn ins HauptFenster geklickst wird, eben wg. .ShowDialog.

    Lösung: .Show statt .ShowDialog

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Hmm,

    mehrere Probleme.
    Das mit anstelle von .ShowDialog . Show zu verwenden hört sich logisch an.
    Allerdings wird meine Form die ich mit .Show aufrufe nur leer angezeigt. Ich muss ein Form2.Refresh hinterher schicken, damit in der Form etwas angezeigt wird.
    Da mein Code aber auch in Form1 nicht fortgesetzt werden soll, solange Form2 angezeigt wird, habe ich mir eine Do Loop Schleife gebastelt.
    Dafür dachte ich, nehme ich eine Hilfsvariable, Datum_angezeigt as Bollean und schreibe in die Schleife :

    VB.NET-Quellcode

    1. Do Until Datum_angezeigt = False
    2. Loop


    Im Code des Form2 habe ich dann in das .Deactivate Event noch ein Datum_angezeigt = True vor dem Me.Close eingetragen.
    Leider bleibt das Programm aber irgendwie hängen, ich denke in der Schleife. Datum_angezeigt wurde als Friend deklariert.
    Es kreist aber die Eieruhr, wenn ich ausserhalb von Form2 klicke und egal was ich in die Schleife rein schreibe wird nicht ausgeführt.
    Hat da vielleicht jemand eine Idee warum das nicht funktioniert ?

    Probiere ich das ganze mit .LostFocus als Event, reagiert das Programm da nicht drauf. Warum auch immer.

    Wenn ich .Deactivate mit .ShowDialog versuche, funktioniert das bei mir ebenfalls nicht.

    NACHTRAG: Das Form2 lasse ich mir ohne Text und CONTROLLBOX anzeigen, damit es ohne Rahmen angezeigt wird.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „HerrFrie“ ()

    Bastel mal was, was dein Prob reproduziert. Bei mir geht das nämlich:

    VB.NET-Quellcode

    1. WithEvents frm As Form
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. frm = New Form With {.ControlBox = False}
    4. frm.Show()
    5. End Sub
    6. Private Sub frm_Deactivate(ByVal sender As Object, ByVal e As System.EventArgs) Handles frm.Deactivate
    7. frm.Close()
    8. End Sub
    Hallo Erfinder,

    ich habe deinen Code bei mir eingefügt und kann bestätigen, dass er auch bei mir funktioniert. Allerdings nur mit .Show.
    Bei .ShowDialog reagiert das Programm nicht auf das Event Deactivated oder LostFocus.

    Ich hatte bei mir vorher in Form1 nur

    VB.NET-Quellcode

    1. Form2.Show()

    zum Aufruf des Forms stehen und in Form2 eine Sub mit Event Deactivated oder LostFocus probiert. Da wurde auf gar nichts reagiert.

    Mit .Show kann ich leben, wobei dort nicht auf die Position reagiert wird, wo sich das Fenster öffnen soll (CenterParent). Das klappt irgendwie nur bei .ShowDialog.

    EDIT: Wenn ich das nochmal mit ins With eintrage klappt es auch mit der CenterScreen Position. Bei CenterParent ist es wild verstreut.

    Gruß
    HerrFrie

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „HerrFrie“ ()

    Ich habe einfach deinen With-Eintrag zwischen den { } ausgetauscht und

    VB.NET-Quellcode

    1. .StartPosition = FormStartPosition.CenterScreen


    rein geschrieben. Wenn ich da .CenterParent benutze blätter er bei jedem Button-Klick seine default-Positionen in der Nähe der Maus durch.
    Ich will heute Nachmittag mal schauen, ob ich den über .Manuell nicht überreden kann immer an der aktuellen Mausposition zu öffen/zeigen.