Dialoge benutzen ist einfach

    • VB.NET

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

      Dialoge benutzen ist einfach

      Der Titel ist die Botschaft: Dialoge benutzen ist einfach.

      In der Toolbox des FormDesigners ein Doppelklick auf einen Dialog erstellt son Ding im Systray des Forms, und schon kann man's benutzen:

      VB.NET-Quellcode

      1. Private Sub btColor_Click(sender As Object, e As EventArgs) Handles btColor.Click
      2. If ColorDialog1.ShowDialog(Me) <> Windows.Forms.DialogResult.OK Then Return
      3. FlowLayoutPanel2.BackColor = ColorDialog1.Color
      4. End Sub
      Mehr Aufwand braucht es nicht, und wäre auch nicht mal gut.
      Beachte, dass hier alles abgedeckt ist, was ein Dialog zu tun hat: Der User kann ihn öffnen und kann was auswählen.
      Er kann aber auch canceln - also darauf verzichten, etwas auszuwählen - und dann passiert auch nichts weiter.

      Ausserdem bleibt die Auswahl erhalten - zB hier die Color verschwindet nicht, sondern ist jederzeit und ohne ihn erneut zu öffnen abrufbar - etwaige Merk-Variablen wären also unnütze Redundanzen.
      Guck - ein 2. Button ruft die oben gewählte Color nochmal ab:

      VB.NET-Quellcode

      1. Private Sub btColorRemind_Click(sender As Object, e As EventArgs) Handles btColorRemind.Click
      2. MessageBox.Show("The Color you see is: " & Lf & ColorDialog1.Color.ToString())
      3. End Sub
      Weiters wird der Dialog bei erneuter Betätigung auch wieder genau mit dieser Color öffnen - sowas ist ja manchmal ärgerlich, zB bei FolderBrowsern, wenn man sich da immer erneut durchs Dateisystem hangeln muss - statt dasser einfach da wieder öffnet, wo er auch geschlossen wurde.

      Kurzngut: Das gezeigte Vorgehen ist ein Pattern, ein "Entwurfsmuster".
      Das bedeutet: Mit jedem anderen Dialog - sei es FileOpenDialog, FileSaveDialog, FolderBrowserDialog, PrintDialog, FontDialog, ... ist's dieselbe Vorgehensweise.



      Zum Abschluss noch ein Snippet mit OpenFile-Dialog, mit dem man Dateien starten könnte (also entweder die Exe direkt oder Dateien im vorgesehenen Programm öffnen - etwa .doc in Word etc.):

      VB.NET-Quellcode

      1. Private Sub btOpenFile_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btOpenFile.Click
      2. If OpenFileDialog1.ShowDialog(Me) <> Windows.Forms.DialogResult.OK Then Return
      3. System.Diagnostics.Process.Start(OpenFileDialog1.FileName)
      4. End Sub
      Wie man sieht: Es ist wirklich absolut dasselbe, wie auch im ersten Snippet vorgegangen wurde, nur statt einer Color gehts hier um eine Datei.

      Weitere Samples im Anhang.
      Dateien
      • DialogUsage.zip

        (12,57 kB, 206 mal heruntergeladen, zuletzt: )

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

      Was ist der Unterschied beim Aufruf von ShowDialog mit oder ohne den "me"-Parameter?

      Erstmal ein Dankeschön an den ErfinderDesRades für den Beitrag.

      Was ich aber nicht verstehe, ist die Bedeutung des Parameters "me" bzw. die Wirkung desselben.
      Ob ich den Dialog mit dem Parameter aufrufe oder ohne - das scheint keinen Unterschied zu machen.

      Die Erläuterungen im Objektkatalog verstehe ich so, dass ohne den Parameter das aktive Fenster als Besitzer festgelegt wird und mit dem Parameter, der auch ein anderer als "me" sein kann, wird das übergebene Objekt als Besitzer festgelegt wird.

      Aber das hilft mir auch nicht wirklich weiter. Was macht es für einen Unterschied, wer der Besitzer ist? :?:

      Kann mir das jemand erklären?

      Schon mal vielen Dank, für Eure Mühe.

      torf160

      torf160 schrieb:

      Was macht es für einen Unterschied, wer der Besitzer ist?
      Teste diesen Code. Form 1 mit 2 Button, Form2:

      VB.NET-Quellcode

      1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
      2. Dim dlg = New Form2
      3. dlg.Show()
      4. End Sub
      5. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
      6. Dim dlg = New Form2
      7. dlg.Show(Me)
      8. End Sub
      Nachdem Du auf beide Button in Form1 geklickt hast, erscheinen zwei Instanzen von Form2. Klick nun auf das Hauptfenster (Form1) und beobachte dabei die beiden Instanzen von Form2.
      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!
      das sind dann aber keine Dialoge, die mit .ShowDialog() geöffnet worden wären.
      Ich hab damit rumprobiert, und finde tatsächlich keinen Unterschied im Verhalten von Dialogen, ob sie nun mit .ShowDialog(me) oder nur mit .ShowDialog() geöffnet worden wären.

      Klar, bei Forms, die mit .Show(me) oder .Show() geöffnet werden, macht das einen Unterschied.
      Ich bin mit ILSpy durch den Framework-Code gegangen und habe folgendes festgestellt:
      ShowDialog() ruft einfach ShowDialog(null) auf (gibt also Nothing als Owner an).
      Und es sieht so aus, als würde dann temporär als Owner für den Dialog das aktuell aktive Fenster verwendet werden, also das, was von dieser Funktion zurückkommt:

      C#-Quellcode

      1. [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
      2. public static extern IntPtr GetActiveWindow();

      Ein kleiner Test hat das bestätigt:
      WinForms-Anwendung mit 3 Forms erstellen, auf Form1 3 Buttons ziehen und diesen Code einfügen:

      VB.NET-Quellcode

      1. Dim Form2Instance As New Form2
      2. Dim Form3Instance As New Form3
      3. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
      4. Form2Instance.Show()
      5. End Sub
      6. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
      7. Form3Instance.ShowDialog()
      8. End Sub
      9. Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
      10. Form3Instance.ShowDialog(Form2Instance)
      11. End Sub

      Dann zuerst Form2 öffnen und an eine passende Stelle platzieren.
      Wenn man Form3 mit ShowDialog ohne Parameter öffnet, wird Form1 zum Owner, da Form1 zu dem Zeitpunkt aktiv war. Form2 (nicht Owner) kann nicht angeklickt werden und auch nicht in den Vordergrund geholt werden, wenn ein anderes Fenster darüber liegt. Bei einem Klick auf Form1 (Owner) wird jedoch Form1 und Form3 in den Vordergrund geholt.
      Gibt man Form2 als Parameter an, dann wird Form2 zum Owner und das Spiel dreht sich um: Form1 kann nicht in den Vordergrund geholt werden. Der Screenshot zeigt diesen Fall:
      "Luckily luh... luckily it wasn't poi-"
      -- Brady in Wonderland, 23. Februar 2015, 1:56
      Desktop Pinner | ApplicationSettings | OnUtils

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

      ErfinderDesRades schrieb:

      Unterschied im Verhalten
      besteht auch dann, wenn beim aufrufenden Fenster .TopMost = True gesetzt ist, dann verschwindet der aufgerufene Dialog hinter dem aufrufenden Dialog.
      Gugst Du auch hier.
      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!

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