mehrere openfiledialoge - Vordergrund

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Dodo.

    mehrere openfiledialoge - Vordergrund

    Hallo vb-paradise,

    ich möchte beim Start meines Programms zwei OpenFileDialoge nacheinander anzeigen lassen.
    Problem bei der Sache ist, dass der zweite Dialog nicht in den Vordergrund kommt sondern mit alt+tab gesucht werden muss.

    Vereinfacht sieht der Code so aus:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public Sub New
    3. initializeComponent()
    4. OpenFileDialog1.ShowDialog()
    5. OpenFileDialog2.ShowDialog()
    6. End Sub
    7. End Class


    Wichtig, zu diesem Zeitpunkt ist die Form1 noch nicht sichtbar.

    Denn werden die zwei Dialoge in einer Form, die sichtbar ist, nacheinander aufgerufen sind beide im Vordergrund.

    Hat hier jemand ein Tipp, wie ich dieses Problem lösen könnte?

    Gruß
    urgle
    wie man das lösen kann weiß ich nicht aber umgehen ist da doch mit sicher viel besser?
    du könntest einen eigenen dialog erstellen indem zwei dateipfade angeben werden müssen. (und dabei wird dann auf einen OFD zurückgegriffen)
    oder hat es einen besonderen grund den user gleich zwei auf einmal unter die nase zu halten?
    da ich mir grade angeschaut habe wie man sowas mittels drag&drop machen kann will ich mein ergebnis nicht vorenthalten:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. TextBox1.AllowDrop = True
    3. End Sub
    4. Private Sub TextBox1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.DoubleClick
    5. Using OFD As New OpenFileDialog
    6. With OFD
    7. .FileName = TextBox1.Text
    8. If .ShowDialog = Windows.Forms.DialogResult.OK Then
    9. TextBox1.Text = .FileName
    10. End If
    11. End With
    12. End Using
    13. End Sub
    14. Private Sub TextBox1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragDrop
    15. Dim Files() As String = DirectCast(e.Data.GetData(DataFormats.FileDrop), String())
    16. If Files.Count > 1 Then
    17. MsgBox("Nur eine Datei!")
    18. ElseIf Files.Count = 1 Then
    19. TextBox1.Text = Files.First
    20. End If
    21. End Sub
    22. Private Sub TextBox1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragEnter
    23. If e.Data.GetDataPresent(DataFormats.FileDrop) Then
    24. e.Effect = DragDropEffects.Copy
    25. End If
    26. End Sub



    einfach EINE datei auf die Textbox ziehen (eine textbox1 muss auf der form sein!) und der pfad steht drin. alternativ doppelklick auf die textbox um den openfiledialog anzuzeigen
    @FreakJNS:
    Ohne ShowDialog() läuft nix.
    @urgle:
    ShowDialog() ruft einen modalen Dialog auf, d.h., das aufrufende Programm wartet, bis der Dialog geschlossen wurde.
    Wenn mehrere Dialoge gleichzeitig zu sehen sein sollen, must Du sie nicht modal aufrufen:
    dlg.Show() oder dlg.Show(Me), letzterer kann nicht hinter das Hauprprogramm geklickt werden.
    Diese Aufrufe sind aber für einen OpenFileDialog nicht möglich.
    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!
    Um sowieso zwei gleichzeitig anzeigen zu lassen brauchst du wohl auch das "New".

    So könnte es auch aussehen:

    VB.NET-Quellcode

    1. Dim ofd As OpenFileDialog
    2. Private Sub TextBox1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Click
    3. ofd = New OpenfileDialog
    4. ofd.ShowDialog
    5. End Sub

    urgle schrieb:

    Hallo vb-paradise,

    ich möchte beim Start meines Programms zwei OpenFileDialoge nacheinander anzeigen lassen.
    Problem bei der Sache ist, dass der zweite Dialog nicht in den Vordergrund kommt sondern mit alt+tab gesucht werden muss.

    Vereinfacht sieht der Code so aus:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public Sub New
    3. initializeComponent()
    4. OpenFileDialog1.ShowDialog()
    5. OpenFileDialog2.ShowDialog()
    6. End Sub
    7. End Class


    Wichtig, zu diesem Zeitpunkt ist die Form1 noch nicht sichtbar.

    Denn werden die zwei Dialoge in einer Form, die sichtbar ist, nacheinander aufgerufen sind beide im Vordergrund.

    Hat hier jemand ein Tipp, wie ich dieses Problem lösen könnte?


    VB.NET-Quellcode

    1. Public Class Form1
    2. Public Sub New
    3. initializeComponent()
    4. OpenFileDialog1.ShowDialog(Me)
    5. OpenFileDialog2.ShowDialog(Me)
    6. End Sub
    7. End Class
    du könntest einen eigenen dialog erstellen indem zwei dateipfade angeben werden müssen. (und dabei wird dann auf einen OFD zurückgegriffen)
    so werde ich es dann wohl machen.

    Nochmal zur Verdeutlichung @ Mr. VB 2008 Man :
    Die OpenFileDialoge sollen nicht gleichzeitig sondern nacheinander erscheinen.
    Und mit dem Code den ich im ersten Post geschrieben habe geht das auch, nur leider ist der zweite Dialog nicht im Vordergrund.

    @ ErfinderDesRades

    VB.NET-Quellcode

    1. OpenFileDialog1.ShowDialog(Me)
    2. OpenFileDialog2.ShowDialog(Me)

    habe ich auch schon versucht, bringt aber keine Änderung.
    hört sich nach einem quatsch an, ein opfenfiledialog reicht völlig aus.
    ja mag sein. Meine erste Version war auch nur mit einem OpenFileDialog.
    Rufe ich aber zwei mal hintereinander .ShowDialog() auf, ist auch in dem Fall der zweite Dialog nicht im Vordergrund.

    RodFromGermany schrieb:

    ShowDialog() ruft einen modalen Dialog auf, d.h., das aufrufende Programm wartet, bis der Dialog geschlossen wurde.
    Wenn mehrere Dialoge gleichzeitig zu sehen sein sollen, must Du sie nicht modal aufrufen:
    dlg.Show() oder dlg.Show(Me), letzterer kann nicht hinter das Hauprprogramm geklickt werden.
    Diese Aufrufe sind aber für einen OpenFileDialog nicht möglich.

    urgle schrieb:

    Rufe ich aber zwei mal hintereinander .ShowDialog() auf, ist auch in dem Fall der zweite Dialog nicht im Vordergrund.

    Der 2. Dialog ist nicht im Hintergrund, er wurde noch gar nicht angezeigt.
    Erst wenn Du beim 1. Dialog OK oder Cancel drückst, kommt das Programm zurück und ruft den 2. Dialog, welchen auch immer, auf.
    Setze einen Haltepunkt (F9) auf den 1. Aufruf und lass das Programm laufen.
    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

    genau soweit richtig und so mache ich es auch. Der erste Dialog kommt wähle Datei aus drücke OK.
    Dann kommt der nächste Dialog, er wird auch generiert und angezeigt, nur leider nicht vorne sondern irgendwo ganz hinten.
    Man kann ihn dann mit alt+tab dann nach vorne holen. Aber das muss ja nicht sein ;)
    Mach es doch mal so. Das geht, wie es gehen soll.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Using dlg As New OpenFileDialog
    3. dlg.ShowDialog()
    4. End Using
    5. Using dlg As New OpenFileDialog
    6. dlg.ShowDialog()
    7. End Using
    8. End Sub
    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!
    Da du die beiden Dialoge über den Button1 auslöst, vermute ich mal, dass die Form sichtbar ist. Ist dies der Fall, gebe ich dir recht, funktioniert es einwandfrei.

    Schreibst du den Code aber in die new der Form, so wird der Fehler wieder auftreten, der zweite Dialog bleibt hinten.
    Das ist echt merkwürdig, ich würde es quick'n dirty über API realisieren

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. <DllImport("user32.dll", EntryPoint:="FindWindow", SetLastError:=True, CharSet:=CharSet.Auto)> _
    4. Private Shared Function FindWindowByClass(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    5. End Function
    6. <DllImport("user32.dll")> _
    7. Private Shared Function SetForegroundWindow(ByVal hWnd As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
    8. End Function
    9. Private WithEvents t As New Timers.Timer(100)
    10. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    11. Using ofd1 As New OpenFileDialog
    12. If ofd1.ShowDialog = Windows.Forms.DialogResult.OK Then
    13. Using ofd2 As New OpenFileDialog
    14. ofd2.Title = "Datei öffnen"
    15. t.Start()
    16. If ofd2.ShowDialog = Windows.Forms.DialogResult.OK Then
    17. MessageBox.Show(ofd1.FileName & Environment.NewLine & ofd2.FileName)
    18. End If
    19. End Using
    20. End If
    21. End Using
    22. End Sub
    23. Private Sub t_Tick() Handles t.Elapsed
    24. Dim p As IntPtr = FindWindowByClass("#32770", "Datei öffnen")
    25. If Not p.Equals(IntPtr.Zero) Then
    26. t.Stop()
    27. SetForegroundWindow(p)
    28. End If
    29. End Sub
    30. End Class


    Wichtig dabei ist, das der Titel der DialogBox der selbe ist wie bei der API Funktion FindWindow()

    urgle schrieb:

    Schreibst du den Code aber in die new der Form, so wird der Fehler wieder auftreten, der zweite Dialog bleibt hinten.

    Bei mir funktioniert das. VS 2010, W7-64.
    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!
    Windows 7 32 Bit Visual Basic 2010 Express.

    VB.NET-Quellcode

    1. Using OFD As New OpenFileDialog
    2. OFD.ShowDialog()
    3. End Using
    4. Using OFD As New OpenFileDialog
    5. OFD.ShowDialog()
    6. End Using

    VB.NET-Quellcode

    1. Using OFD As New OpenFileDialog
    2. OFD.ShowDialog()
    3. OFD.ShowDialog()
    4. End Using


    Bei beiden Varianten wird der OpenFileDialog in den Vordergrund geholt.

    Nebenbei:
    VB2k8

    VB2800 ?

    Bei Widerständen: 2k2 = 2200Ohm.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils