begin process at 2008 08 29 22:35:51
1 233 930 membres
450 nouveaux aujourd'hui
14 294 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

SÉLECTIONNER UN RÉPERTOIRE (BOITE DE DIALOGUE PARCOURIR... DE WINDOWS)


Information sur la source

Catégorie :API Niveau : Débutant Date de création : 18/10/2002 Date de mise à jour : 18/10/2002 16:21:28 Vu : 4 160

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

Description

Affiche la Boite de Dialogue Windows "Sélectionner un repertoire" quand on clique sur un bouton Parcourir...
Utilise 2 fonctions API.

Source

  • (**---------- Déclaration des API Functions ----------**)
  • Function SHGetPathFromIDList (pidl : Integer; pszPath : String) : Integer;
  • stdcall;external 'shell32.dll' name 'SHGetPathFromIDListA';
  • Function SHBrowseForFolder (lpBrowseInfo : BROWSEINFO) : Integer;
  • pascal;external 'shell32.dll' name 'SHBrowseForFolderA';
  • //Affiche l'arborescence des repertoires afin de choisir un Path
  • Procedure DisplayExplorer();
  • var
  • x : BROWSEINFO;
  • Chemin : String;
  • pidl : Integer;
  • RetVal : Integer;
  • p : Integer;
  • begin
  • FillChar(x, SizeOf(x), 0);
  • x.hOwner := frmPreferences.Handle; //Handle de l'objet de votre fiche
  • x.pidlRoot := 0;
  • x.lpszTitle := 'Sélectionnez un répertoire';
  • x.ulFlags := 1;
  • pidl := SHBrowseForFolder(x);
  • Chemin := StringOfChar(Chr(0),512);
  • RetVal := SHGetPathFromIDList(pidl, Chemin);
  • If RetVal <> 0 Then
  • begin
  • p := Pos(Chr(0),Chemin);
  • txtRepertoire.Text := Copy(Chemin,1,p); //txtRepertoire est un TEdit
  • end;
  • end;
(**---------- Déclaration des API Functions ----------**)
Function SHGetPathFromIDList (pidl : Integer; pszPath : String) : Integer;
        stdcall;external 'shell32.dll' name 'SHGetPathFromIDListA';

Function SHBrowseForFolder (lpBrowseInfo : BROWSEINFO) : Integer;
        pascal;external 'shell32.dll' name 'SHBrowseForFolderA';


//Affiche l'arborescence des repertoires afin de choisir un Path
Procedure DisplayExplorer();
var
    x : BROWSEINFO;
    Chemin : String;
    pidl : Integer;
    RetVal : Integer;
    p : Integer;

begin
    FillChar(x, SizeOf(x), 0);
    x.hOwner := frmPreferences.Handle; //Handle de l'objet de votre fiche
    x.pidlRoot := 0;
    x.lpszTitle := 'Sélectionnez un répertoire';
    x.ulFlags := 1;

    pidl := SHBrowseForFolder(x);

    Chemin := StringOfChar(Chr(0),512);

    RetVal := SHGetPathFromIDList(pidl, Chemin);
    
    If RetVal <> 0 Then
      begin
        p := Pos(Chr(0),Chemin);
        txtRepertoire.Text := Copy(Chemin,1,p); //txtRepertoire est un TEdit 
    end;
end;

Conclusion

Pas besoin d'importer ShellApi, puisque j'importe seulement les routines API qui m'interresse avec la clause External.
Notez les clauses "stdcall" et "pascal" pour la méthode d'utilisation des paramètres de ces fonctions API... c'est ce qui m'a le plus fait galérer dans ce code...
  • signaler à un administrateur
    Commentaire de Yoann le 19/10/2002 11:12:32

    On peut faire ceci :

    Uses Filectrl;
    Var
    Dossier: String; //Recupere le chemin du dossier
    begin
    SelectDirectory('Choisir un dossier :', '',Dossier);
    end;

  • signaler à un administrateur
    Commentaire de woom le 21/04/2003 10:48:11

    N'étant pas expert dans les APIs, quelle est la structure de BROWSEINFO. Delphi me refuse le code.

  • signaler à un administrateur
    Commentaire de cedkat le 26/09/2003 10:32:32

    bonjour

    Delphi beug sur BROWSINFO et ne compile pas
    As- tu une solution qui marche ?

    Merci

  • signaler à un administrateur
    Commentaire de jockos le 26/09/2003 10:48:35

    C'est normal, il faut défnir la structure (Type) BROWSINFO pour que ça marche.

    En visual Basic 6 ,ça donne :

    Private Type BROWSEINFO
        hOwner As Long
        pidlRoot As Long
        pszDisplayName As String
        lpszTitle As String
        ulFlags As Long
        lpfn As Long
        lParam As Long
        iImage As Long
    End Type

    (désolé, mais ça fait plus de 6 mois que j'ai pas fait de Delphi et je ne me rappelle plus trop des syntaxes de déclaration de structure de données).

  • signaler à un administrateur
    Commentaire de cedkat le 26/09/2003 14:01:18

    re
    Merci beaucoup, voila ce qui nous manquer

    pour info sous delphi cela donne ca :
        Type
            BROWSEINFO = record
                hOwner : integer ;
                pidlRoot : integer ;
                pszDisplayName : String ;
                lpszTitle : String ;
                ulFlags : integer ;
                lpfn : integer ;
                lParam : integer ;
                iImage : integer ;
            end ;

    Volia et merci encore

  • signaler à un administrateur
    Commentaire de pl_concept le 25/08/2004 21:58:45

    Bonjour.

    Merci pour ces infos, mais je vois que ce code est adressé aux débutant...

    Mais étant un 'Vrai' débutant, je n'ai pas réussi à utiliser ce code :(

    Y aurait-il possibilité d'avoir un projet pour concrétiser ce code ??

    Merci

  • signaler à un administrateur
    Commentaire de FemAeroBen le 07/02/2006 12:11:41

    En effet il est préférable d'utiliser SelectDirectory.
    Cependant il y a un petit bug dans ce code ligne 34:
    il ne faut pas ecrire
    txtRepertoire.Text := Copy(Chemin,1,p); //txtRepertoire est un TEdit
    mais
    txtRepertoire.Text := Copy(Chemin,1,p-1); //txtRepertoire est un TEdit
    car sinon il reste un caractère #0 dans la chaine

Ajouter un commentaire

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Boutique

Boutique de goodies CodeS-SourceS