mehrteiliger Dialog mit MessageBox funktional genug?

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    mehrteiliger Dialog mit MessageBox funktional genug?

    Hallo,

    ich habe hier ein kleines Dialog Pattern, das nach Auffinden einer Datei den User darauf hinweist, wo die Datei herkommt. Dies würde in seiner Entscheidung eine Rolle spielen, sie zu verwenden

    pseudo

    VB.NET-Quellcode

    1. Dim DiaResult as DialogResult
    2. ...
    3. If File.Exists("pfad") then DiaResult = MessageBox.Show(Me, "Die Datei wurde in Ordner1 gefunden. Verwenden?", "Alternativ-Ordner", MessageBoxButtons.YesNo)
    4. If DiaResult = DialogResult.Yes Then
    5. ...
    6. ElseIf DiaResult = DialogResult.No
    7. DiaResult = Nothing
    8. If File.Exists("pfad2") then DiaResult = MessageBox.Show(Me, "Die Datei wurde in Ordner2 gefunden. Verwenden?", "Alternativ-Ordner", MessageBoxButtons.YesNo)
    9. If DiaResult = DialogResult.Yes Then
    10. ...
    11. ElseIf DiaResult = DialogResult.No Then
    12. DiaResult = Nothing
    13. ...
    14. End If
    15. ...
    16. End If


    Die Dateien können in mehreren Ordnern vorkommen vom Namen her, stimmen vom Inhalt aber nicht überein, dieser hängt auch vom Ordner-Fundort ab.
    (So ein Browser-Menü und der User soll selber suchen, könntet ihr sagen macht mehr Sinn, aber das geht in diesem Fall nicht.)

    Ich muss die Abfrage noch in den Vordergrund bringen, aber MessageBox hat keine TopMost Eigenschaft. Muss ich den Dialog also selber basteln?

    Viele Grüße
    Ich würd das etwas anders machen:

    VB.NET-Quellcode

    1. Dim GewählterDateipfad = String.Empty
    2. Dim MöglicheSpeicherorte = {Ordner1, Ordner2, Ordner3}
    3. For Each Speicherort In MöglicheSpeicherorte
    4. If File.Exists(IO.Path.Combine(Speicherort, Dateiname)) AndAlso MessageBox.Show(Me, $"Die Datei wurde in {Speicherort} gefunden. Verwenden?", "Alternativ-Ordner", MessageBoxButtons.YesNo) = MessageBoxResult.Yes Then GewählterDateipfad = IO.Path.Combine(Speicherort, Dateiname): Exit For
    5. Next
    6. If String.IsNullOrEmpty(GewählterDateipfad) Then MessageBox.Show("kein Speicherort gefunden"): Return
    7. '… ab hier mit dem gewählten Speicherort weitermachen

    Noch schöner natürlich mit IO.DirectoryInfo und IO.FileInfo
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Man kann aber auch tricksen:
    MessageBox.Show(New Form With {.TopMost = True}, "Text")
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed
    Haha, das macht es mir natürlich deutlich einfacher, hab da ganz schön mit If und Else hin und her gewurstelt

    Dann schau ich mal das ich den Dialog noch dazu hinkrieg.

    Edit: Oder das versuch ich mal

    VaporiZed schrieb:

    Man kann aber auch tricksen: MessageBox.Show(New Form With {.TopMost = True}, "Text")
    Aber wozu einen Dialog basteln, wenn Du die MessageBox indirekt TopMost machen kannst, siehe oben?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Selbst wenn halte ich das nicht für schlimm, selbst wenn ein bissl Müll im RAM ist, ich glaube nicht das du so den RAM mit Forms voll fluten kannst. Aber du kannst das auch so machen, so ist sicher das der GC sich drum kümmert.

    VB.NET-Quellcode

    1. Using f As New Form
    2. f.TopMost = True
    3. MessageBox.Show(f, "Text")
    4. End Using

    Dieser Test sagt: Nö, wird sofort entsorgt:

    VB.NET-Quellcode

    1. Dim FormCountBefore = Application.OpenForms.Count 'z.B. 1
    2. MessageBox.Show(New Form With {.TopMost = True}, "Text")
    3. Dim FormCountAfter = Application.OpenForms.Count 'immer noch bzw. wieder 1
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Dieser Test sagt: Nö, wird sofort entsorgt:


    Dieser sagt, sie ist garnet offen:

    VB.NET-Quellcode

    1. Dim FormCountBefore = Application.OpenForms.Count 'z.B. 1
    2. Debug.WriteLine(FormCountBefore)
    3. Using f As New Form
    4. f.TopMost = True
    5. Dim FormCountWhile = Application.OpenForms.Count 'z.B. 1
    6. Debug.WriteLine(FormCountWhile)
    7. MessageBox.Show(f, "Text")
    8. End Using


    Edit @VaporiZed
    Und dieser sagt: Dein Test sagt dazu nichts aus, ich weiss nicht wie das FW intern damit umgeht, daher kann es durchaus sein das der GC das Form kassiert, aber sicher sagen können wir das nicht . Auch wenn die MB offen ist, das Form nicht.

    VB.NET-Quellcode

    1. Private t As Thread
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Shown
    3. Using f As New Form
    4. f.TopMost = True
    5. t = New Thread(AddressOf endless)
    6. t.Start()
    7. MessageBox.Show(f, "Text")
    8. End Using
    9. End Sub
    10. Private Sub endless()
    11. While True
    12. Debug.WriteLine(Application.OpenForms.Count)
    13. End While
    14. End Sub



    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Takafusa“ ()

    OpenForms zählt offensichtlich nur sichtbare Forms.
    Es existiert wohl im Hintergrund auch über das Methodenende hinaus:

    VB.NET-Quellcode

    1. Private Sub Foo()
    2. Bar()
    3. Dim afterAfter = Application.OpenForms.Count '2
    4. End Sub
    5. Private Sub Bar()
    6. Dim before = Application.OpenForms.Count '1
    7. MessageBox.Show(New Form With {.TopMost = True, .Visible = True}, "Text")
    8. Dim after = Application.OpenForms.Count '2
    9. End Sub

    Dann wohl doch mit nem Using-Block …
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Haudruferzappeltnoch schrieb:

    aber MessageBox hat keine TopMost Eigenschaft.
    Doch:

    VB.NET-Quellcode

    1. MessageBox.Show("Text", "Titel", MessageBoxButtons.OK, MessageBoxIcon.Stop, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification)

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!