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

Composants VCL Delphi Discussion :

Conserver l'arborescence avec SelectDirectory


Sujet :

Composants VCL Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 9
    Points
    9
    Par défaut Conserver l'arborescence avec SelectDirectory
    Bonjour à tous,

    J'utilise la fonction 'selectdirectory' pour permettre à l'utilisateur de choisir un dossier où seront enregistrés des fichiers de résultats. Voici l'instruction que je mets:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SelectDirectory('Choose the directory in which you want to save the results', '', selectedDirectory);
    Avec cela, l'utilisateur peut choisir n'importe quel dossier (existant) puisque l'arborescence s'ouvre dans le bureau.
    Il serait intéressant de garder en mémoire le dossier choisi par l'utilisateur. C'est ce que j'ai fait en utilisant un fichier d'initialisation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    homedirectory:=FileIni.ReadString('Record','Directory','');
    SelectDirectory('Choose the directory in which you want to save the results', homedirectory, selectedDirectory);
    Mais alors, le problème c'est que l'utilisateur n'a plus accès à l'arborescence entière mais seulement aux dossiers filles. Il est donc, par exemple, impossible de changer de disque.

    Je sais qu'il existe deux version de la fonction selectdirectory. Peut-être que l'autre serait plus indiquée?

    Si quelqu'un peut me débloquer, merci d'avance.

  2. #2
    rbh
    rbh est déconnecté
    Membre confirmé Avatar de rbh
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    384
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 384
    Points : 473
    Points
    473
    Par défaut
    Salut
    moi j'utilise un code trouvé je ne sais plus où sur le net :
    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
     
    var
      lg_StartFolder: String;
     
    implementation
     
    uses
      ShlObj;
     
     
    function BrowseForFolderCallBack(Wnd: HWND; uMsg: UINT;
            lParam, lpData: LPARAM): Integer stdcall;
    begin
      if uMsg = BFFM_INITIALIZED then
        SendMessage(Wnd,BFFM_SETSELECTION,1,Integer(@lg_StartFolder[1]));
      result := 0;
    end;
     
    function BrowseForFolder(const browseTitle: String; const initialFolder: String =''): String;
    var
      browse_info: TBrowseInfo;
      folder: array[0..MAX_PATH] of char;
      find_context: PItemIDList;
    begin
      FillChar(browse_info,SizeOf(browse_info),#0);
      lg_StartFolder := initialFolder;
      browse_info.pszDisplayName := @folder[0];
      browse_info.lpszTitle := PChar(browseTitle);
      browse_info.ulFlags := BIF_RETURNONLYFSDIRS;
      browse_info.hwndOwner := Application.Handle;
      if initialFolder <> '' then
        browse_info.lpfn := BrowseForFolderCallBack;
      find_context := SHBrowseForFolder(browse_info);
      if Assigned(find_context) then
      begin
        if SHGetPathFromIDList(find_context,folder) then
          result := folder
        else
          result := '';
        GlobalFreePtr(find_context);
      end
      else
        result := '';
    end;
    pour l'utiliser, il faut appeler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BrowseForFolder('Titre', LeDossierASelectionnerALOuverture);

  3. #3
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Salut
    Normalement, le SelectDirectory suffit
    Voici un exemple de code que j'ai utilisé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if SelectDirectory(c_BrowseTitle, c_Root, Dir,
        [sdNewFolder, sdShowEdit, sdShowShares, sdNewUI,sdValidateDir]) then
    c_BrowseTitle et c_Root sont des constantes de type string.
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Merci à vous deux.
    En effet, les deux solutions fonctionnent. Je pense choisir la version plus 'compliquée' (de rbh) qui a l'avantage de vmontrer l'arborescence en entier et d'être plus 'users friendly' alors que celle de Pedro impose de taper l'emplacement par soi-même si c'est dans un dossier parent ou parallèle.

  5. #5
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Citation Envoyé par gige47 Voir le message
    Merci à vous deux.
    ...impose de taper l'emplacement par soi-même si c'est dans un dossier parent ou parallèle.
    Comment ça?
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Et bien, si je veux garder en mémoire dans un fichier d'initialisation le chemin du dossier choisi et toujours rouvrir la fenêtre avec ce dossier comme "c_root", ça m'embête.
    Imaginons que l'utilisateur enregistre sur le d:\ et que la fois d'après il veut enregistrer sur c:\Travail\Resultats\Direct il doit taper tel quel le chemin d'accès car il ne sait pas remonter dans l'arborescence. Ce que permet de faire l'autre méthode. A moins qu'il y ait une option supplémentaire à mettre dans SelectDirectory?

  7. #7
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Salut
    Je pense que tu as mal compris: Voici le contenu de ces constantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      c_BrowseTitle = 'Sélectionnez le répertoire de sortie';
      c_Root = '';

    En fait, si tu mets c_Root à '', tu as toute l'arborescence depuis le bureau de Win. Comme il ne change jamais, je le mets en constante
    C'est dans la variable que tu passes ("Dir" dans mon code) qu'il faut mettre le chemin dans lequel tu veux qu'elle s'affiche. En sortie, elle aura le répertoire que tu as choisi
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Merveilleux! Ca fonctionne... Comme quoi, quand on se comprend ça va beaucoup mieux.
    Merci

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

Discussions similaires

  1. [Link Error] avec SelectDirectory
    Par Aleksis dans le forum C++Builder
    Réponses: 1
    Dernier message: 22/08/2006, 00h04
  2. Créer une arborescence avec XSL
    Par kobe dans le forum XSL/XSLT/XPATH
    Réponses: 19
    Dernier message: 13/06/2006, 09h54
  3. Réponses: 3
    Dernier message: 28/03/2006, 10h52
  4. copie d'une arborescence avec excel vb
    Par kernel57 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 18/11/2005, 08h31
  5. Réponses: 4
    Dernier message: 07/12/2002, 15h24

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