E3en file en folderdialog

Status
Niet open voor verdere reacties.

bonnowagt

Gebruiker
Lid geworden
7 dec 2006
Berichten
445
Hallo,

Ik zocht een mogelijkheid om in 1 handeling zowel files dan wel een folder te kunnen laden. Dus een file en folderdialog in 1. Op google kwam ik een code hiervoor tegen en in C, hetgeen ik heb geconverteerd naar VBnet, zie onderstaande code. Nu is de vraag van mij.
Hoe zet ik dit in een VB programma, wat zet ik in een form, wat in een clas of module of wat dan ook. Dus eigenlijk hoe maak ik van de code een programma

Code:
Namespace dnGREP
   Public Class FileFolderDialog
            Inherits CommonDialog
            Private m_dialog As New OpenFileDialog()

        Public Property Dialog() As OpenFileDialog
            Get
                Return m_dialog
            End Get
            Set(ByVal value As OpenFileDialog)
                m_dialog = value
            End Set
        End Property

        Public Shadows Function ShowDialog() As DialogResult
            Return Me.ShowDialog(Nothing)
        End Function

        Public Shadows Function ShowDialog(ByVal owner As IWin32Window) As DialogResult
            ' Set validate names to false otherwise windows will not let you select "Folder Selection."
            m_dialog.ValidateNames = False
            m_dialog.CheckFileExists = False
            m_dialog.CheckPathExists = True

            Try
                ' Set initial directory (used when dialog.FileName is set from outside)
                If m_dialog.FileName IsNot Nothing AndAlso m_dialog.FileName <> "" Then
                    If Directory.Exists(m_dialog.FileName) Then
                        m_dialog.InitialDirectory = m_dialog.FileName
                    Else
                        m_dialog.InitialDirectory = Path.GetDirectoryName(m_dialog.FileName)
                    End If
                End If
                ' Do nothing
            Catch ex As Exception
            End Try

            ' Always default to Folder Selection.
            m_dialog.FileName = "Folder Selection."

            If owner Is Nothing Then
                Return m_dialog.ShowDialog()
            Else
                Return m_dialog.ShowDialog(owner)
            End If
        End Function

        ''' <summary>
        ' Helper property. Parses FilePath into either folder path (if Folder Selection. is set)
        ' or returns file path
        ''' </summary>
        Public Property SelectedPath() As String
            Get
                Try
                    If m_dialog.FileName IsNot Nothing AndAlso (m_dialog.FileName.EndsWith("Folder Selection.") OrElse Not File.Exists(m_dialog.FileName)) AndAlso Not Directory.Exists(m_dialog.FileName) Then
                        Return Path.GetDirectoryName(m_dialog.FileName)
                    Else
                        Return m_dialog.FileName
                    End If
                Catch ex As Exception
                    Return m_dialog.FileName
                End Try
            End Get
            Set(ByVal value As String)
                If value IsNot Nothing AndAlso value <> "" Then
                    m_dialog.FileName = value
                End If
            End Set
        End Property

        ''' <summary>
        ''' When multiple files are selected returns them as semi-colon seprated string
        ''' </summary>
        Public ReadOnly Property SelectedPaths() As String
            Get
                If m_dialog.FileNames IsNot Nothing AndAlso m_dialog.FileNames.Length > 1 Then
                    Dim sb As New StringBuilder()
                    For Each fileName As String In m_dialog.FileNames
                        Try
                            If File.Exists(fileName) Then
                                sb.Append(fileName & ";")
                            End If
                            ' Go to next
                        Catch ex As Exception
                        End Try
                    Next
                    Return sb.ToString()
                Else
                    Return Nothing
                End If
            End Get
        End Property

        Public Overrides Sub Reset()
            m_dialog.Reset()
        End Sub

        Protected Overrides Function RunDialog(ByVal hwndOwner As IntPtr) As Boolean
            Return True
        End Function
    End Class
End Namespace
    End Sub
 
Wat voor bestanden probeer je te laden? En wat wil je ermee doen?
Of wil je gewoon dat de gebruiker een bestand/map kan selecteren en dat je programma het pad krijgt?
 
Gewoon gebruiken net als een openfile dialog. Gebruiker opent en vervolgens kan hij bestand kiezen dan wel een complete folder. Gebruik bijvoorbeeld om txt bestanden te laden in een listbox of mp3 enz.
 
Je kunt de MultiSelect-property van een OpenFileDialog op True zetten.
 
Ja dank je dat heb ik ook wel maar ik wilde gewoon dat je zowel een map als bestand in kunt lezen zonder twee verschillende dialog dus gecombineerd en uiteraard moetdit kunnen het kian zelfs dat je twee mappen selecteerd en inleest.
 
Je kan in je project een nieuw Component toevoegen (net zoals je extra forms of classes toevoegt) en daar al je FileFolderDialog class in doen. Dan is deze beschikbaar in je project. Hij zal denk ik niet beschikbaar zijn in je Toolbox want daarvoor ontbreekt er code.

Maar als je van plan bent de FileFolderDialog class ook in andere projecten te gebruiken, is het een beetje omslachtig om voor elke project een Component toe te voegen en die code erin te plakken. Wat je beter kan doen is een bibliotheek (library, dll bestand) project te maken en daar je FileFolderDialog class in verwerken. In je andere projecten hoef je dan alleen nog maar een reference te maken naar je bibliotheek en je FileFolderDialog class is direct bruikbaar. :)
 
Hoi

Ik heb inmiddels hiervan een dll bestand gemaakt en deze staat nu in de toolbox. Vervolgens heb ik deze filefolderdialog geplaatst in form1. Maar hoe roep ik nu vanuit de form deze filefoilderdialog aan?
 
Net zoals je elk ander control of component aanroept, dmv zijn naam, standaard zou dat FileFolderDialog1 moeten zijn.
 
Hallo,

Ik heb inmiddels de oplossing gevonden. Een eigen gemaakte filefolderbrowser. Mocht iemand hiervoor interesse hebben dan plaats ik deze graag op dit forum

Vriendelijke groet
 
Voorbeeld File en Folder dialog in 1 met een vraag

Nou op verzoek van Pim,

Maak een class als volgt aan:
Code:
Imports System
Imports System.Text
Imports System.Windows.Forms
Imports System.Runtime.InteropServices

Public Class DirectoryDialog
    Public Structure BROWSEINFO
        Public hWndOwner As IntPtr
        Public pIDLRoot As Integer
        Public pszDisplayName As String
        Public lpszTitle As String
        Public ulFlags As Integer
        Public lpfnCallback As Integer
        Public lParam As Integer
        Public iImage As Integer
    End Structure

    Const MAX_PATH As Integer = 260

    Public Enum BrowseForTypes As Integer
        Computers = 4096
        Directories = 1
        FilesAndDirectories = 16384
        FileSystemAncestors = 8
    End Enum

    Declare Function CoTaskMemFree Lib "ole32" Alias "CoTaskMemFree" (ByVal hMem As IntPtr) As Integer
    Declare Function lstrcat Lib "kernel32" Alias "lstrcat" (ByVal lpString1 As String, ByVal lpString2 As String) As IntPtr
    Declare Function SHBrowseForFolder Lib "shell32" Alias "SHBrowseForFolder" (ByRef lpbi As BROWSEINFO) As IntPtr
    Declare Function SHGetPathFromIDList Lib "shell32" Alias "SHGetPathFromIDList" (ByVal pidList As IntPtr, ByVal lpBuffer As StringBuilder) As Integer

    Protected Function RunDialog(ByVal hWndOwner As IntPtr) As Boolean

        Dim udtBI As BROWSEINFO = New BROWSEINFO()
        Dim lpIDList As IntPtr
        Dim hTitle As GCHandle = GCHandle.Alloc(Title, GCHandleType.Pinned)
        udtBI.hWndOwner = hWndOwner
        udtBI.lpszTitle = Title
        udtBI.ulFlags = BrowseFor
        Dim buffer As StringBuilder = New StringBuilder(MAX_PATH)
        buffer.Length = MAX_PATH
        udtBI.pszDisplayName = buffer.ToString()
        lpIDList = SHBrowseForFolder(udtBI)
        hTitle.Free()
        If lpIDList.ToInt64() <> 0 Then
            If BrowseFor = BrowseForTypes.Computers Then
                m_Selected = udtBI.pszDisplayName.Trim()
            Else
                Dim path As StringBuilder = New StringBuilder(MAX_PATH)
                SHGetPathFromIDList(lpIDList, path)
                m_Selected = path.ToString()
            End If
            CoTaskMemFree(lpIDList)
        Else
            Return False
        End If
        Return True
    End Function

    Public Function ShowDialog() As DialogResult
        Return ShowDialog(Nothing)
    End Function

    Public Function ShowDialog(ByVal owner As IWin32Window) As DialogResult
        Dim handle As IntPtr
        If Not owner Is Nothing Then
            handle = owner.Handle
        Else
            handle = IntPtr.Zero
        End If
        If RunDialog(handle) Then
            Return DialogResult.OK
        Else
            Return DialogResult.Cancel
        End If
    End Function

    Public Property Title() As String
        Get
            Return m_Title
        End Get
        Set(ByVal Value As String)
            If Value Is DBNull.Value Then
                Throw New ArgumentNullException()
            End If
            m_Title = Value
        End Set
    End Property

    Public ReadOnly Property Selected() As String
        Get
            Return m_Selected
        End Get
    End Property

    Public Property BrowseFor() As BrowseForTypes
        Get
            Return m_BrowseFor
        End Get
        Set(ByVal Value As BrowseForTypes)
            m_BrowseFor = Value
        End Set
    End Property
    
    Private m_BrowseFor As BrowseForTypes = BrowseForTypes.Directories
    Private m_Title As String = ""
    Private m_Selected As String = ""


    Public Sub New()
    End Sub
End Class

Aanroepen vanuit een formulier bijvoorbeeld als volgt:
Code:
  Dim frmd As DirectoryDialog = New DirectoryDialog()          
            frmd.BrowseFor = DirectoryDialog.BrowseForTypes.FilesAndDirectories
            frmd.Title = "Kies een bestand of een map"
            If frmd.ShowDialog(Me) = DialogResult.OK Then
               textbox1.text = frmd.Selected

Vervolgens heb ik deze gfebruikt om een listbox te laden, nou dat is dezelfde wijze als bij een file of folder.
Alleen de vraag die ik er nog bij heb is hoe ik zorg dat de dialog files multiselect kan. Daar kom ik niet uit en zie graag een antwoord nog tegemoet

Hopelijk hebben jullie eriets aan.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan