IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

[VB]récupérer le dernier chemin ouvert avec commondialog


Sujet :

VB 6 et antérieur

  1. #1
    Membre habitué
    Inscrit en
    Mai 2002
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 163
    Points : 173
    Points
    173
    Par défaut [VB]récupérer le dernier chemin ouvert avec commondialog
    Losqu'il lance mon appli, l'utilisateur clique sur un bouton "ouvrir", puis va chercher un fichier quelconque (le fichier pouvant être sur réseau)
    Le control commondialog que j'utilise garde automatiquement le dernier chemin utilisé (même lorsque l'on vient de lancé l'application, il récupère le chemin de la dernière fois ou l'appli a servi)

    Cette fonctionnalité (que je pense gérer par le système) n'est pas forcément un mal, mais le problème vient du fait que parfois, le chemin pointe sur un poste réseau déconnecté ou supprimé ... et là, figeage ... (ou plutot attente).

    Je voudrais pouvoior récupérer le chemin avant le
    CommonDialog.ShowOpen
    afin de tester si il est correct ...

    Ps : le CommonDialog.InitDir ne contient rien avant le ShowOpen

    Est-ce que quelqu'un sait comment faire ?

  2. #2
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    regarde ca, si ca marche chez toi ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    Private Const HKEY_CLASSES_ROOT = &H80000000
    Private Const HKEY_CURRENT_USER = &H80000001
    Private Const HKEY_LOCAL_MACHINE = &H80000002
    Private Const HKEY_USERS = &H80000003
    Private Const HKEY_PERFORMANCE_DATA = &H80000004
     
    Const REG_SZ = 1 ' Unicode nul terminated string
    Const REG_BINARY = 3 ' Free form binary
     
     
    Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
    Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
    Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
     
    Private Function ExtractFilePath(ByVal f As String, Optional ByVal EndSlash As Boolean = True) As String
        Dim Splitf() As String, i As Integer
        If InStr(f, "\") = 0 Then
            ExtractFilePath = ""
            Exit Function
        End If
        Splitf = Split(f, "\")
        For i = 0 To UBound(Splitf) - 1
            ExtractFilePath = ExtractFilePath & Splitf(i) & "\"
        Next i
        If Not EndSlash Then ExtractFilePath = Left(ExtractFilePath, Len(ExtractFilePath) - 1)
    End Function
     
    Private Sub Form_Load()
     
        Dim Objset
        Dim Obj
        Dim SID As String
     
        Set Objset = GetObject("winmgmts:{impersonationLevel=impersonate}"). _
                InstancesOf("Win32_Account")
        On Local Error Resume Next
     
        For Each Obj In Objset
            If Obj.Name = Environ("UserName") Then
                SID = Obj.SID
                Exit For
            End If
        Next
     
        Dim lResult As Long, lValueType As Long, lDataBufSize As Long, Ret As Long
        Dim strBuf As String, strBuf2 As String
     
        lResult = RegOpenKey(HKEY_USERS, SID & "\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\OpenSaveMRU\*", Ret)
        lResult = RegQueryValueEx(Ret, "MRUList", 0, REG_SZ, ByVal 0, lDataBufSize)
        If lResult = 0 Then
            strBuf = String(lDataBufSize, Chr$(0))
            lResult = RegQueryValueEx(Ret, "MRUList", 0, 0, ByVal strBuf, lDataBufSize)
            If lResult = 0 Then
                lResult = RegQueryValueEx(Ret, Left$(strBuf, 1), 0, REG_SZ, ByVal 0, lDataBufSize)
                strBuf2 = String(lDataBufSize, Chr$(0))
                lResult = RegQueryValueEx(Ret, Left$(strBuf, 1), 0, 0, ByVal strBuf2, lDataBufSize)
            End If
        End If
        MsgBox ExtractFilePath(strBuf2)
     
    End Sub

  3. #3
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Command2_Click()
    CommonDialog1.filename = ""
       Dim toto As String
        CommonDialog1.ShowOpen
        toto = CommonDialog1.filename
        MsgBox toto
    End Sub
    utilise aussi, si tu veux, la propriété initdir


    AH ! croisés !
    ce que j'ai écrit va avec l'utilisation de commondialog

  4. #4
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut Re: [VB]récupérer le dernier chemin ouvert avec commondialog
    Citation Envoyé par bhaal76
    Ps : le CommonDialog.InitDir ne contient rien avant le ShowOpen
    et il a raison
    Les chemins précédement ouverts par la boite de dialogue sont stockés dans le registre !!!

  5. #5
    Membre habitué
    Inscrit en
    Mai 2002
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 163
    Points : 173
    Points
    173
    Par défaut
    merci

    j'essai ça cette après-midi, sur ce, bonne appétit ...

  6. #6
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Les chemins précédement ouverts par la boite de dialogue sont stockés dans le registre !!!
    C'est bien vrai...
    Mais il est également vrai que l'enregistrement se fait aussi dans les propriétés et qu'au runtime, ces propriétés vont avoir la préséance.
    essaye celà avec un commondialog et 2 boutons de commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     
    Private Sub Command1_Click()
       Dim toto As String
        CommonDialog1.ShowOpen
        toto = CommonDialog1.filename
        MsgBox toto
    End Sub
     
    Private Sub Command2_Click()
       CommonDialog1.InitDir = "mon_nouveau_répertoire"
       CommonDialog1.filename = ""
       Dim toto As String
        CommonDialog1.ShowOpen
        toto = CommonDialog1.filename
        MsgBox toto
    End Sub
    lance command1 et vois, puis lance commande2 et vois.
    relance command2 autant de fois que tu veux et vois.
    si, maintenant, tu changes mon_nouveau_répertoire par un autre chemin, (fais le avec une variable modifiable) tu verras...

  7. #7
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    tout à fait d'accord
    mais le problème est à la première ouverture du commondialog

  8. #8
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Dès la 1ère ouverture aussi :
    c'est exactement comme si tu n'utilisais que command2, directement....(supprime donc command1.. et vois.)

    On s'est peut-être mal compris :
    le demandeur ne souhaite pas avoir d'office le dernier ouvert :
    Cette fonctionnalité (que je pense gérer par le système) n'est pas forcément un mal, mais le problème vient du fait que parfois, le chemin pointe sur un poste réseau déconnecté ou supprimé ... et là, figeage ... (ou plutot attente).
    C'est le titre de son sujet qui est trompeur....

  9. #9
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    Citation Envoyé par jmfmarques
    C'est le titre de son sujet qui est trompeur....
    NON

    Connecte un lecteur réseau, ouvre un fichier sur ce lecteur, puis supprime le lecteur, et ouvre à nouveau le commondialog, et vois ce qui se passe

    et accessoirement, lis les questions posées

  10. #10
    Membre habitué
    Inscrit en
    Mai 2002
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 163
    Points : 173
    Points
    173
    Par défaut
    mais ... mais ... mais ... ça MARCHE

    nickel, j'ai testé, j'ai pas tout compris, mais ça marche

    J'avais déjà trouvé le dossier dans la base de registre, mais je n'ai pas compris l'arborescence ...

    par contre, je trouve que ta procédure pour récupéré le chemin correct est un peu compliqué !!!

    j'ai remplacé çà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Function ExtractFilePath(ByVal f As String, Optional ByVal EndSlash As Boolean = True) As String
        Dim Splitf() As String, i As Integer
        If InStr(f, "\") = 0 Then
            ExtractFilePath = ""
            Exit Function
        End If
        Splitf = Split(f, "\")
        For i = 0 To UBound(Splitf) - 1
            ExtractFilePath = ExtractFilePath & Splitf(i) & "\"
        Next i
        If Not EndSlash Then ExtractFilePath = Left(ExtractFilePath, Len(ExtractFilePath) - 1)
    End Function
    par çà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Function ExtractFilePath(ByVal f As String, Optional ByVal EndSlash As Boolean = True) As String
        ExtractFilePath = Mid(f, 1, InStrRev(f, "\", -1, vbBinaryCompare))
        If Not EndSlash Then ExtractFilePath = Left(ExtractFilePath, Len(ExtractFilePath) - 1)
    End Function
    encore merci, il me reste a comprendre la première partie ...


    PS : c'est bien lorsque le commondialog cherche a accéder a un poste réseau inexistant au lancement que le problème survient.

  11. #11
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    d'accord, ma fonction ExtractFilePath n'est pas de la première jeunesse (elle doit dater de l'époque ou je ne connaissais pas encore InstrRev et jamais modifiée)

    Citation Envoyé par bhaal76
    PS : c'est bien lorsque le commondialog cherche a accéder a un poste réseau inexistant au lancement que le problème survient
    ca j'avais compris

    les chemins sont sauvegardés dans l'arborescence \software\.... sous la racine HKEY_USERS\Utilisateur loggué\

    La première partie permet de récupérer le SID de l'utilisateur loggué pour reconstituer le chemin complet de l'arborescence

  12. #12
    Membre habitué
    Inscrit en
    Mai 2002
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 163
    Points : 173
    Points
    173
    Par défaut
    ok, maintenant j'ai compris ...

    Merci encore !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Python 2.X] récupérer chemin d'un fichier ouvert avec askopenfile
    Par nekcorp dans le forum Tkinter
    Réponses: 4
    Dernier message: 08/06/2015, 00h10
  2. Réponses: 2
    Dernier message: 18/09/2008, 11h50
  3. Réponses: 1
    Dernier message: 15/09/2008, 10h21
  4. Réponses: 3
    Dernier message: 25/06/2008, 15h21
  5. Récupérer extension d'un fichier ouvert avec opendialog
    Par avogadro dans le forum C++Builder
    Réponses: 4
    Dernier message: 04/06/2007, 09h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo