Eigene Messagebox auf zusätzlichem Form

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von areiland.

    Eigene Messagebox auf zusätzlichem Form

    Ich habe mit Interesse den Thread: Dialoge: Instanziierung von Forms und Aufruf von Dialogen gelesen und mir mit dieser Unterstützung ein Form mit einem Label und drei Buttons erstellt, das ich anstatt der Standard Messagebox gerne nutzen möchte, um bei Auswahlen immer entsprechend beschriftete Buttons und natürlich einen passenden Text zur Verfügung zu haben.

    Soweit funktioniert das auch, ich kann diese selbst erstellte Box nutzen und bekomme die Events ausgewertet. Aber leider bisher nur statisch.

    Ich scheitere also bisher, vermutlich wegen eines reinen Denkfehlers, daran diese Box in einer beliebigen Select Case Anweisung zu nutzen, so dass der Klick auf die einzelnen Buttons zu den entsprechenden Auswahlen führt. Hier scheitere ich etwas, vielleicht kann mir da jemand etwas auf die Sprünge helfen und mir mit einfachen Worten und etwas Milde den ungefähren Weg dazu aufzeigen.
    Gruss Alex
    @areiland Setze in Deinen Button-Eventhandlern das DialogResult.
    Dies bekommst Du bei .ShowDialog() als ReturnValue zurück.
    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!

    RodFromGermany schrieb:

    Eventhandlern

    Danke für den Hinweis!
    Typischer Fall von Tomaten auf den Augen :)

    Unschön ist jetzt bloss, dass der Klick auf jeden der Buttons zweifach ausgeführt werden muss damit er ausgeführt wird.
    Ok hat sich auch erledigt, das "Frm4.ShowDialog()" musste weg, weil "Select Case Frm4.ShowDialog" Form4 ebenfalls öffnet und ich das übersehen hatte.

    Also ist jetzt alles so, wie ich es wollte!
    Gruss Alex

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

    Jetzt passt alles exakt so, wie es mir vorgestellt hatte!

    So siehts im Code aus:

    Form4:

    VB.NET-Quellcode

    1. Public Class Form4
    2. Public Event MyEvent1(sender As Object, e As EventArgs)
    3. Public Event MyEvent2(sender As Object, e As EventArgs)
    4. Public Event MyEvent3(sender As Object, e As EventArgs)
    5. .
    6. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    7. RaiseEvent MyEvent1(Me, EventArgs.Empty)
    8. End Sub
    9. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    10. RaiseEvent MyEvent2(Me, EventArgs.Empty)
    11. End Sub
    12. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    13. RaiseEvent MyEvent3(Me, EventArgs.Empty)
    14. End Sub
    15. End Class


    In Form1:

    VB.NET-Quellcode

    1. Public Class WinSet10
    2. Private WithEvents Frm4 As Form4
    3. .
    4. Public Sub Frm4_Button1_Click(sender As Object, e As EventArgs) Handles Frm4.MyEvent1
    5. End Sub
    6. Public Sub Frm4_Button2_Click(sender As Object, e As EventArgs) Handles Frm4.MyEvent2
    7. End Sub
    8. Public Sub Frm4_Button3_Click(sender As Object, e As EventArgs) Handles Frm4.MyEvent3
    9. End Sub


    Dann weiter mit der Prozedur, in der ich die Events benötige:

    VB.NET-Quellcode

    1. Private Sub Button149_Click(sender As Object, e As EventArgs) Handles Button149.Click
    2. Frm4 = New Form4
    3. Frm4.Text = "OEM-Treiber extrahieren"
    4. Frm4.Label1.Text = "Bitte auswählen, ob die extrahierten OEM-Treiber kopiert oder gepackt werden sollen!"
    5. Frm4.Button1.Text = "Ordner kopieren"
    6. Frm4.Button2.Text = "Zip File erstellen"
    7. Frm4.Button3.Text = "Vorgang abbrechen"
    8. WindowState = FormWindowState.Minimized
    9. Form3.Label1.Text = "Bitte warten ... die OEM Treiber werden extrahiert!"
    10. Form3.Show()
    11. Dim OemDriv As New Process
    12. Directory.CreateDirectory(Tmp & "\OemTreiber")
    13. Dim OemTrSrc = Tmp & "\OemTreiber"
    14. OemDriv.StartInfo.FileName = "Dism.exe"
    15. OemDriv.StartInfo.Arguments = "-online -export-driver -destination:" & OemTrSrc
    16. OemDriv.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
    17. OemDriv.Start()
    18. OemDriv.WaitForExit()
    19. Form3.Close()
    20. Select Case Frm4.ShowDialog
    21. Case DialogResult.Yes
    22. Form3.Label1.Text = "Bitte warten ... der Ordner ""OEM-Treiber-" & ADateG & """ wird am gewählten Ort erstellt!"
    23. Form3.Show()
    24. Dim FBD As New FolderBrowserDialog With {
    25. .Description = "Bitte wähle den Ablageordner",
    26. .RootFolder = Environment.SpecialFolder.Desktop,
    27. .ShowNewFolderButton = True
    28. }
    29. If FBD.ShowDialog() = DialogResult.OK Then
    30. My.Computer.FileSystem.CreateDirectory(FBD.SelectedPath & "\OEM-Treiber-" & ADateG)
    31. My.Computer.FileSystem.CopyDirectory(OemTrSrc, FBD.SelectedPath & "\OEM-Treiber-" & ADateG, True)
    32. Else
    33. Exit Select
    34. End If
    35. Case DialogResult.No
    36. Dim SFD As New SaveFileDialog With {
    37. .Title = "Bitte wähle den Ablageordner des anzulegenden Zip-Archivs!",
    38. .FileName = "Oemtreiber-Sicherung-" & ADateG & ".zip",
    39. .InitialDirectory = Desk,
    40. .DefaultExt = ".zip",
    41. .Filter = "Zip Archiv|*.zip"
    42. }
    43. Form3.Label1.Text = "Bitte warten ... das Archiv Oemtreiber-Sicherung-" & ADateG & ".zip wird erstellt!"
    44. Form3.Show()
    45. SFD.ShowDialog()
    46. ZipFile.CreateFromDirectory(OemTrSrc, SFD.FileName, CompressionLevel.Optimal, True)
    47. Case DialogResult.Cancel
    48. End Select
    49. Form3.Close()
    50. Directory.Delete(OemTrSrc, True)
    51. WindowState = FormWindowState.Normal
    52. FormBorderStyle = FormBorderStyle.Sizable
    53. End Sub


    Tut jetzt auch genau das, was ich erwartete!

    Für Hinweise, wie ich das noch etwas verkürzen kann, wäre ich auch dankbar!
    Gruss Alex

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

    areiland schrieb:

    VB.NET-Quellcode

    1. Form3.Show()
    Gugst Du Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    Die Texte der Label und Buttons in einer Form4 setztr Du bitte in der Form4 selbst, nicht im aufrufenden Kontext.
    Das Erstellen der Verzeichnisse kannst Du auch in die Form4 auslagern.
    Welche Funktion hat Form3?
    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!
    Mein Form3 stellt mir nur ein Label zur Verfügung, das eben dann eingeblendet wird, wenn eine Akton stattfindet und diese dokumentiert.

    VB.NET-Quellcode

    1. Class Form3
    2. Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. End Sub


    Ansonsten hat Form3 keine eigene Funktion. Das Form3 ist bei mir derzeit der Ersatz für eine Progressbar, die ich auch noch gerne durch einen Backgroundworker oder Threads ersetzen möchte.

    Was meinen Optimierungsbedarf angeht, das kann ich ja hier über die Suche nachlesen, wenn mir was unklar ist. Hat ja bisher wunderbar funktioniert, wenn mir was nicht klar war.
    Gruss Alex

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „areiland“ ()

    areiland schrieb:

    Für Hinweise, wie ich das noch etwas verkürzen kann, wäre ich auch dankbar!
    Wenn ich recht gesehen habe, benötigst du die MyEvent-Geschichten an keiner Stelle.
    Das ist sehr gut, denn dann können sie gelöscht werden, und alles was damit zu tun hat.
    Weil deren Benamung... unter aller Sau.
    Bleibt noch die Benamung deiner anneren Buttons - ein OkButton muss OkButton[tt][/tt] heissen, keinesfalls: Button1!
    Usw.
    @ErfinderDesRades, @RodFromGermany
    Die gezeigte Prozedur ist nur eine von etlichen dieses Programms, das auch noch ausgebaut wird. Von daher kann es durchaus sein, dass ich die Events an anderer Stelle noch benötigen könnte. Die Buttons bekommen auch jedesmal einen entsprechenden, zum Kontext passenden, Namen. Das war ja der Hintergrund dafür, dass ich so vorgegangen bin und die Standard-Messagebox ersetzt habe. Ich dachte, das wäre schon aus meiner ursprünglichen Fragestellung und meinem Snippet hervorgegangen.

    Dies trifft auch auf sämtliche anderen Beschriftungen und Funktionen von Form4 zu, die werden von Sub zu Sub wechseln. Deshalb wäre es aus meiner Sicht auch nicht sinnvoll, bei den Buttons Routinen zu hinterlegen, die Verzeichnisse erstellen oder Kopieraktionen durchführen. Woanders werden diese nämlich nicht benötigt.

    An einer anderen Stelle hat Button 1 den Text "Neustart" weil er nach einer Updateinstallation einen Neustart auslöst. Woanders wird Button 1 den Text "Fehler" und Button 2 den Text "Warnungen" tragen, weil sie jeweils Funktionen auslösen, die eben die Fehlermeldungen oder Warnungen des Systemlogs in einer Textbox ausgeben, die sich auf Form 2 befindet. Auf diesem Form sind die entsprechenden Routinen CopyToClipboard und der SaveFileDialog direkt hinterlegt, weil Form 2 nur dafür da ist, die Ausgaben von verschiedenen Routinen entgegen zu nehmen und eben in die Zwischenablage zu kopieren oder als Textdatei zu speichern.

    An wieder anderen Stellen werden noch andere Beschriftungen nötig werden.

    Genauso wie eben Form3.Label1, das seine Beschriftungen je nach Kontext eben in der jeweiligen Prozedur erhält und dort teilweise mehrere Male den Text wechselt. Da Form3 ansonsten keine weitere Funktionalität besitzt, hab ich es auch bisher nicht instanziert.

    Dieses Tool ist auch nur meine rein persönliche "Hello World" Adaption, mit der ich zum ersten Mal VB .NET ergründe :)

    Mit anderen Worten, alles was ich in den bisherigen etwa 2800 Zeilen Anweisungscode geschrieben hab, ist für mich alles Neuland und nur einer gewissen Neugierde geschuldet. Das Forum hier und ein paar bestimmte Personen, die ich jetzt nicht nennen möchte, haben mir dabei immer die besten Hinweise für die Umsetzung geliefert. Von daher habt Geduld mit mir, wenn ich nicht gleich den professionellsten Code abliefere. Ich bin eigentlich nur ein kleiner Handwerker, der sich aus reiner Freude an diese Materie gewagt hat - nach mehr als zwanzig Jahren Pause, nachdem ich es mal zwei oder drei Wochen mit Delphi probiert hatte :)
    Gruss Alex
    Alles schön und gut, aber wenn du eine eigene Messagebox schreibst, und die hat einen Ok-Button, dann soll der nicht Button1 heissen, sondern btOk (oder so ähnlich).
    Und ein Cancel-Button heisst nicht Button2, sondern heisst btCancel.
    Das hat mit deine anneren 2800 Zeilen ja garnix zu tun.
    Weiters braucht eine eigene Messagebox keine Events.
    Bei einer Messagebox wird der vom User geklickste Button dem Aufrufer durch den MyMessagebox.ShowDialog() - Rückgabewert mitgeteilt. Der Rückgabetyp ist vom Typ DialogResult - schau dir diese Enumeration mal an - du wirst feststellen, da ist alles abgedeckt, und du brauchst keine zusätzlichen Events.
    Ok, nachdem ich das Tutorial zur Instanziierung nochmal aufmerksamer gelesen hab, hab sogar ich jetzt kapiert, dass erst die eindeutige Benennung der Buttons für deren korrekte Funktionalität sorgt :(
    Ist jetzt auch korrigiert, die Events sind auch weg.

    Wahrscheinlich war dann die nicht korrekte Benennung der Buttons dann auch der Grund, warum VS beim Markieren der Buttons im Designer die Fehlerliste einblendete. Hätte mir eigentlich Hinweis genug sein müssen.

    Mit dem Hinweis auf den Umfang meines Tools wollte ich nur verdeutlichen, dass ich nicht wegen jedem Murks nachfragen muss - sondern mir das über die meist schon reichlich vorhandenen Informationen in der Regel selbst aneigne. Nur stosse ich halt manchmal an Verständnisgrenzen und dann muss ich eben nachhaken, damit es klickt. Ich muss aber gestehen, dass ich Deine Hinweise im Tutorial einfach nur hätte aufmerksamer lesen müssen. Denn dort hattest Du das ja schon ausreichend erklärt.
    Gruss Alex

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „areiland“ ()

    areiland schrieb:

    Wahrscheinlich war die nicht korrekte Benennung der Buttons dann auch der Grund, warum VS beim Markieren der Buttons im Designer die Fehlerliste einblendete.
    Denke ich nicht, denn Namen sind Schall und Rauch.
    Nur wenn Du Deinen Controls korrekte Namen gibst, kannst Du die Funktionalität Deines Programms besser intuitiv erfassen, und wenn Du den Buttons DialogResults zuweist, ist die Zuordnung der Werte zu einem vernünftigen Namen einfacher und weniger fehleranfällig.
    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!
    Na dann verstehe ich noch weniger, warum VS beim Markieren von Button 1 im Designer immer mal wieder die leere Fehlerliste einblendet. Was übrigens alleine auf Form 4 passiert, während ich dies bisher sonst noch nirgends beobachten konnte.

    Aber nun, ist jetzt auch nicht wichtig. Wenn mich VS zu arg nervt, schreibe ich den Code im Texteditor und kopiere ihn an die entsprechende Stelle im Form :)
    Gruss Alex

    areiland schrieb:

    die leere Fehlerliste einblendet.
    Du kannst da umschalten zwischen Nix, Fehlern, Warnungen und Fehlern und Warnungen.
    Sieh mal nach, ob da iwo was steht und wenn, dann poste mal die Meldung(en).
    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!