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 655

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...
 

Commentaires et avis

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



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,281 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.