Newsgroup: it.comp.lang.visual-basic
Titolo: Commondialog e selezione cartelle

Ciao a tutti,
    se non erro con la commondialod standard di vb6 non si possono prendere
i percorsi delle cartelle ma solo in filename avere il link del file
selezionato.
Se io volessi prendere il link a una cartella devo usare un ocx "privato"
fatto da qualcuno o auto creato. Sapete di qualche commondialog che sia
buona x l'uso mio? Il fatto è che quella standard è fatta bene permettendo
anche la selezione via rete.
Grazie!

 Sapete di qualche commondialog che sia
massì, autocitiamoci...
http://www.google.it/groups?hl=it&lr=&selm=2h19fdF650vaU1%40uni-berlin.de
non ho verificato se il link presente in questo link è ancora valido, ma
può essere comunque uno spunto.
-- 
Salutoni
Sergio
Per rispondere... togli il group dall'indirizzo
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 puň essere comunque uno spunto.
Si beh č stupendo... ma non posso decidere a priori se un utente stia per
scegliere una directory o un file. Mi dai una manina in +? :)
Grazie ancora...

 scegliere una directory o un file.
questo particolare non era chiarissimo nel tuo post iniziale.
personalmente non sono a conoscenza di uno strumento che ti consenta di
fare quello che chiedi, quindi, nella mia beata ignoranza, se dovessi
affrontare un problema del genere farei dichiarare a priori all'utente che
cosa vuole scegliere, e poi mi regolerei di conseguenza.
mi rendo conto che č poco piů di un accrocchio, ma se non trovi di meglio
puň tornare utile.


 selezionato.
Provare a cercare su Google no, eh?
http://www.codeguru.com/vb/controls/vb_shell/article.php/c3051/
Bye by SixaM 8-]
-- 


E leggere le risposte già date da altri no è?
Mi ha già gentilmente risposto Melchiade Bedrosian Baol ed devo precisare
che è anche stato + cortese visto che tu sai cosa cercare... io ho cercato
sotto common, commondialog, selezionare cartelle, commondialog only folder e
altre 2 prove simili dandomi liste giganti di cose che poco avevano a che
fare con il mio uso...
Cmq grazie anche del tuo aiuto... ma come ho già scritto mi servirebbe
qualcosa di + elaborato visto che a priori non posso sapere se un utente
selezionerà un file o una directory.
Ciao

Il giorno Wed, 23 Feb 2005 15:31:39 +0100, "aaa" <a...@aaa.aa> ha
scritto:

Forse ho capito male, ma non ti basta selezionare il file con la
AdvBrowseFolder e  successivamente  determini cosa ha selezionato con
la funzione GetFileAttributes 
Declare Function GetFileAttributes Lib "kernel32.dll" Alias
"GetFileAttributesA" (ByVal lpFileName As String) As Long 
ti restituisce:
FILE_ATTRIBUTE_ARCHIVE = &H20 Un file di archivio (la maggior parte
dei files). 
FILE_ATTRIBUTE_COMPRESSED = &H800 Un file in un drive o in una
directori compressa. 
FILE_ATTRIBUTE_DIRECTORY = &H10 Una directory invece di un file. 
FILE_ATTRIBUTE_HIDDEN = &H2 File nascosto. 
FILE_ATTRIBUTE_NORMAL = &H80 File senza attributi. 
FILE_ATTRIBUTE_READONLY = &H1 File di sola lettura. 
FILE_ATTRIBUTE_SYSTEM = &H4 File di sistema (lo usa solo il sistema
operativo 
ciao
  Stefano

 la funzione GetFileAttributes
Perdonami ma non ho capito cosa intendi.
Cos'è AdvBrowseFolder ?
L'utente può selezionare un singolo file oppure copiare un intero cd sul pc
e fare il collegamento alla cartella invece che selezionare tutti i file del
cd ed eventuali file in sottocartelle in cascata. Come mi hanno detto potrei
far scegliere a priori se si sta x inserire una dir o un file ma è +
"macchinoso". Speravo che esistesse un sistema + rapido.
Grazie.

"macchinoso". Speravo che esistesse un sistema + rapido.
Una volta che l'utente ha scelto qualcosa, con la funzione
GetFileAttributes  puoi sapere se è un file o una directory.
FILE_ATTRIBUTE_DIRECTORY = &H10 Una directory invece di un file. 
Meglio usare qualche api che un OCX, no?
ciao
  Stefano


Io continuo ad aver problemi... nel senso che nell'esempio che mi fai
scaricare ho un form sul quale se clicco su sfoglia posso cmq solo
selezionare una directory e non i files.

selezionare una directory e non i files.
Ci sono 2 checkbox sotto a sinistra
la 1° dice:  Aprire da questa cartella     ed è checked
la 2° dice: Mostrare anche i files           ed è UNchecked
se clicchi sulla 2° checkbox vedrai anche i files, abbi fede
ciao
  Stefano


ha scritto:

Scusa ho controllato e ho visto che Rossi ha cambiato il codice e non
ci sono più la checkbox.
Se mi dai una mail valida ti mando quello vecchio che andava
ciao
  Stefano


ha scritto:
Basta usare la costante BIF_BROWSEINCLUDEFILES
Public Const BIF_BROWSEINCLUDEFILES = &H4000&  '// Browsing for
Everything
Comunque ti posto tutto il vecchio codice:
__________________________________________
;form principale   "Form1.frm"
VERSION 5.00
Begin VB.Form Form1 
   BorderStyle     =   3  'Fixed Dialog
   Caption         =   "Utilizzo avanzato di BrowseForFolder"
   ClientHeight    =   1200
   ClientLeft      =   45
   ClientTop       =   330
   ClientWidth     =   6045
   Icon            =   "Form1.frx":0000
   LinkTopic       =   "Form1"
   MaxButton       =   0   'False
   MinButton       =   0   'False
   ScaleHeight     =   1200
   ScaleWidth      =   6045
   ShowInTaskbar   =   0   'False
   StartUpPosition =   2  'CenterScreen
   Begin VB.CheckBox chkIncludeFiles 
      Caption         =   "Mostrare anche i files"
      Height          =   285
      Left            =   105
      TabIndex        =   3
      Top             =   810
      Width           =   2025
   End
   Begin VB.CheckBox Check1 
      Caption         =   "Aprire da questa cartella"
      Height          =   285
      Left            =   105
      TabIndex        =   2
      Top             =   435
      Value           =   1  'Checked
      Width           =   2475
   End
   Begin VB.TextBox Text1 
      Height          =   285
      Left            =   105
      TabIndex        =   1
      Top             =   105
      Width           =   5730
   End
   Begin VB.CommandButton cmdSelDir 
      Caption         =   "&Seleziona cartella"
      Height          =   360
      Left            =   4410
      TabIndex        =   0
      Top             =   465
      Width           =   1440
   End
   Begin VB.Label Label1 
      AutoSize        =   -1  'True
      BackStyle       =   0  'Transparent
      Caption         =   "Mauro Rossi © 1999"
      ForeColor       =   &H000000FF&
      Height          =   195
      Left            =   4380
      TabIndex        =   4
      Top             =   915
      Width           =   1470
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Private Sub cmdSelDir_Click()
    Dim sDir As String
    Dim lFlags As Long
 
    lFlags = BIF_RETURNONLYFSDIRS
    If chkIncludeFiles Then
        lFlags = lFlags Or BIF_BROWSEINCLUDEFILES
    End If
    Err = 0
    If Check1 Then
        sDir = BrowseForFolder(Me.hWnd, "Selezionare la cartella
partendo da " & Text1, Text1, lFlags)
    Else
        sDir = BrowseForFolder(Me.hWnd, "Selezionare la cartella", ,
lFlags)
    End If
    If Err = 0 Then
        Text1 = sDir
    Else
        MsgBox "Si è selezionato annulla, l'errore è:" & vbCrLf & _
               "Origine: " & Err.Source & vbCrLf & "Descrizione: " &
Err.Description
    End If
    Err = 0
End Sub
Private Sub Form_Load()
    Text1 = CurDir$
End Sub
__________________________________________
'MODULO   "AdvBrowseFolder.bas"
Attribute VB_Name = "AdvBFF"
Option Explicit
'//////////////////////////////////////////////////////////////////////////////
' Variabili, costanti e funzioni per utilizzare BrowseForFolder
'//////////////////////////////////////////////////////////////////////////////
Private sFolderIni As String
Private Const WM_USER = &H400&
Public Const MAX_PATH = 260&
Private Type BrowseInfo
    hWndOwner               As Long             ' hWnd del form
    pIDLRoot                As Long             ' Specifica il pID
della cartella iniziale
    pszDisplayName          As String           ' Nome dell'item
selezionato
    lpszTitle               As String           ' Titolo della
finestra
    ulFlags                 As Long             '
    lpfnCallback            As Long             ' Funzione CallBack
    lParam                  As Long             ' Informazioni
aggiuntive da passare alla funzione Callback
    iImage                  As Long             '
End Type
'// Browsing for directory.
Public Const BIF_RETURNONLYFSDIRS = &H1&       '// For finding a
folder to start document searching
Public Const BIF_DONTGOBELOWDOMAIN = &H2&      '// For starting the
Find Computer
Public Const BIF_STATUSTEXT = &H4&
Public Const BIF_RETURNFSANCESTORS = &H8&
Public Const BIF_EDITBOX = &H10&
Public Const BIF_VALIDATE = &H20&              '// insist on valid
result (or CANCEL)
'
Public Const BIF_BROWSEFORCOMPUTER = &H1000&   '// Browsing for
Computers.
Public Const BIF_BROWSEFORPRINTER = &H2000&    '// Browsing for
Printers
Public Const BIF_BROWSEINCLUDEFILES = &H4000&  '// Browsing for
Everything
'
'// message from browser
Public Const BFFM_INITIALIZED = 1
Public Const BFFM_SELCHANGED = 2
Public Const BFFM_VALIDATEFAILED = 3          '// lParam:szPath
ret:1(cont),0(EndDialog)
'Public Const BFFM_VALIDATEFAILEDW = 4&         '// lParam:wzPath
ret:1(cont),0(EndDialog)
'
'// messages to browser
Public Const BFFM_SETSTATUSTEXT = (WM_USER + 100)
Public Const BFFM_ENABLEOK = (WM_USER + 101)
Public Const BFFM_SETSELECTION = (WM_USER + 102)
'Public Const BFFM_SETSELECTIONW = (WM_USER + 103&)
'Public Const BFFM_SETSTATUSTEXTW = (WM_USER + 104&)
'
Private Declare Function SHBrowseForFolder Lib "shell32.dll" _
        (lpbi As BrowseInfo) As Long
Private Declare Sub CoTaskMemFree Lib "OLE32.DLL" _
        (ByVal hMem As Long)
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" _
        (ByVal pidList As Long, ByVal lpBuffer As String) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias
"SendMessageA" _
    (ByVal hWnd As Long, ByVal wMsg As Long, _
    ByVal wParam As Long, lParam As Any) As Long
Public Function BrowseFolderCallbackProc(ByVal hWndOwner As Long, _
                                        ByVal uMSG As Long, _
                                        ByVal lParam As Long, _
                                        ByVal pData As Long) As Long
    ' Chiamata CallBack da usare con la funzione BrowseForFolder
    Dim szDir As String
 
    On Local Error Resume Next
    Select Case uMSG
'--------------------------------------------------------------------------
    ' Messaggio inviato quando si inizializza il dialogo,
    ' per indicare la cartella dove partire
    Case BFFM_INITIALIZED
        If Len(sFolderIni) Then
            szDir = sFolderIni & Chr$(0)
        Else
            szDir = CurDir$ & Chr$(0)
        End If
        ' WParam  sarà TRUE  se si specifica un path.
        '         sarà FALSE se si specifica un pIDL.
        Call SendMessage(hWndOwner, BFFM_SETSELECTION, 1&, ByVal
szDir)
'--------------------------------------------------------------------------
    ' Questo messaggio si ha quando si cambia cartella
    ' Se si effettua un subclassing si può
    ' può intervìcettare il messaggio BFFM_SETSTATUSTEXT
    ' per visyualizzare la cartella che è selezionata.
    Case BFFM_SELCHANGED
        szDir = String$(MAX_PATH, 0)
        If SHGetPathFromIDList(lParam, szDir) Then
            Call SendMessage(hWndOwner, BFFM_SETSTATUSTEXT, 0&, ByVal
szDir)
        End If
        Call CoTaskMemFree(lParam)
    End Select
 
    Err = 0
    BrowseFolderCallbackProc = 0
 
'------------------------------------------------------------------------------
End Function
Public Function rtnAddressOf(lngProc As Long) As Long
    rtnAddressOf = lngProc
End Function
Public Function BrowseForFolder(ByVal hWndOwner As Long, ByVal sPrompt
As String, _
                Optional sInitDir As String = "", _
                Optional ByVal lFlags As Long = BIF_RETURNONLYFSDIRS)
As String
    ' Visualizza la finestra di dialogo delle cartelle di Windows
    ' Parametri iniziali:
    '   hWnd del form
    '   Titolo della finestra
    '   Opzionalmente la cartella di inizio
    '   Con lFlags si può specificare quello che si potrà selezionare:
    '       BIF_BROWSEINCLUDEFILES, etc.
    '       BIF_RETURNONLYFSDIRS
    '
    Dim iNull As Integer
    Dim lpIDList As Long
    Dim lResult As Long
    Dim sPath As String
    Dim udtBI As BrowseInfo
 
    On Local Error Resume Next
 
    With udtBI
        .hWndOwner = hWndOwner
        .lpszTitle = sPrompt & vbNullChar
        .ulFlags = lFlags
        '.ulFlags = lFlags Or BIF_RETURNONLYFSDIRS
        ' Se si specifica la cartella da cui iniziare
        If Len(sInitDir) Then
            ' Assegna la variable que conterrà la directory di inizio
            sFolderIni = sInitDir
            ' Indica la funzione Callback da usare.
            .lpfnCallback = rtnAddressOf(AddressOf
BrowseFolderCallbackProc)
        End If
    End With
    Err = 0
    On Local Error GoTo 0
    ' Visualizza la finestra di dialogo
    lpIDList = SHBrowseForFolder(udtBI)
    If lpIDList Then
        ' Se si è selezionata una cartella...
        sPath = String$(MAX_PATH, 0)
        lResult = SHGetPathFromIDList(lpIDList, sPath)
        Call CoTaskMemFree(lpIDList)
        ' Elimina il carattere nullo finale
        iNull = InStr(sPath, vbNullChar)
        If iNull Then
            sPath = Left$(sPath, iNull - 1)
        End If
    Else
        ' Se si è premuto annulla...
        sPath = ""
        With Err
            .Source = "MBrowseFolder::BrowseForFolder"
            .Number = 32755
            .Description = "Annullata l'operazione di BrowseForFolder"
        End With
    End If
    BrowseForFolder = sPath
End Function
____________________________________________________
ciao
  Stefano

GRAZIE!!!

Ti ringrazio... ho provato il codice ed è veramente quello che mi serve.
Mi spieghi solo la differenza nella gestione dell'errore tra:
    On Local Error Resume Next
e
    On Error Resume Next
Grazie!

    On Error Resume Next
Credo si riferisca al fatto che l'errore viene gestito solo
all'interno della routine
ciao
  Stefano