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

C++Builder Discussion :

Comment choisir un répertoire moderne (Bureau, Mes docs) ?


Sujet :

C++Builder

  1. #1
    Invité
    Invité(e)
    Par défaut Comment choisir un répertoire moderne (Bureau, Mes docs) ?
    Bonjour,

    J'ai besoin d'écrire une fonctionnalité dans une application qui permet à l'utilisateur de choisir un dossier.

    Bien sûr, on peut le faire avec les composants Windows 3.1 "DriveComboBox" et "DirectoryListBox", mais dans ces composants, on ne voit pas apparaitre les dossiers "bureau" et "Mes documents" par exemple.

    J'ai cherché un peu et j'ai trouvé dans le répertoire "C:\Program Files\Borland\CBuilder6\Examples\ShellControls" des paquets à installer qui permettent d'installer les composants "ShellTreeView", "ShellComboBox" et "ShellListView".

    Ces composants proposent ce que je cherchais.
    Le ShellComboBox fonctionne très bien.
    Avec ShellListView, je n'arrive pas à trier les éléménts en ordre croissant et décroissant (ordre aléatoire ?!).
    Avec le ShellTreeView, j'ai une erreur "Violation d'accès à l'adresse 0xxxx dans VCL60.bpl", même message avec SHELL32.dll". Le ShellTreeView fonctionne bien dans une fenetre vierge. Mais j'obtiens ces messages d'erreurs quand je le place dans un TPanel...

    Auriez-vous rencontré les mêmes problèmes et existe-t-il des composants analogues qui fonctionnent mieux (compatibles Windows 98, 2000, XP) ?

    Merci,

    A+

  2. #2
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 472
    Par défaut yop
    Salut,
    Voici un bout de code sympatique :
    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
     
    //---------------------------------------------------------------------------
    AnsiString BrowseForFolder( HWND WinHandle, AnsiString title )
    {
      PItemIDList IDRoot;
      TBrowseInfo BrowseInfo;
      PItemIDList PList;
      Char Path[MAX_PATH];
     
      SHGetSpecialFolderLocation(WinHandle, CSIDL_NETWORK, &IDRoot);
      AnsiString  FolderName;
      ZeroMemory(&BrowseInfo, sizeof(TBrowseInfo));
      ZeroMemory(Path, MAX_PATH);
     
      BrowseInfo.hwndOwner  =  WinHandle;
      BrowseInfo.pidlRoot   =  NULL;
      BrowseInfo.pszDisplayName = FolderName.c_str();
      BrowseInfo.lpszTitle  = title.c_str();
      BrowseInfo.lpfn       = NULL;
      BrowseInfo.ulFlags    = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_RETURNFSANCESTORS;
     
      PList = SHBrowseForFolder(&BrowseInfo);    //<-- show the dialog
     
      if (PList)
      {
        SHGetPathFromIDList(PList, Path);
        return (AnsiString)Path;
      }
      else
        return "";
    }
    //---------------------------------------------------------------------------
    void __fastcall TFConfiguration::SpeedButton3Click(TObject *Sender)
    {
            ESauvegarde->Text = LongToShortPath(BrowseForFolder(Handle,""));
    }
    //---------------------------------------------------------------------------
    AnsiString __fastcall TFConfiguration::LongToShortPath( AnsiString LongPath )
    {
            char Path[MAX_PATH+1];
            GetShortPathName(LongPath.c_str(),Path,255);
            return( AnsiString(Path) );
    }
    //---------------------------------------------------------------------------
    Cordialement,
    MaTHieU

  3. #3
    Invité
    Invité(e)
    Par défaut Merci !
    Merci Matthieu !

    Je crois effectivement que la bonne méthode c'est d'utiliser les fonctions ...

    SHBrowseForFolder
    SHGetPathFromIDList

    ... de l'API Windows

    Là je suis en train d'essayer de retrouver le nom qui s'affiche dans le navigateur grace à la fonction IShellFolder::GetDisplayNameOf(... IDList...)
    Je crois qu'il faut passer par BinToObject pour récupérer un pointeur sur le IShellFolder... Pas évident ! Tu n'aurais pas un exemple sur ce sujet ?

    J'ai trouvé une doc intéressante ici :
    http://www.codeproject.com/shell/namespcextguide1.asp#Introduction


    Merci encore,

    A+

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 10
    Par défaut
    Hello,

    quels sont les include à faire (à part "windows.h") pour pouvoir utiliser ce code ?

    Merci d'avance

  5. #5
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 472
    Par défaut yop
    Salut,

    Il me semble qu'il faut ajouter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #include <shlobj.h>
    Cordialement,
    MaTHieU

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 10
    Par défaut
    Hello, merci pour ta réponse rapide !

    lors de l'include de il me sort le message d'erreur suivant:

    Construction
    [C++ Erreur] shobjidl.h(2193): E2238 Multiple declaration for 'FOLDERSETTINGS'
    [C++ Erreur] shobjidl.h(8095): E2238 Multiple declaration for 'DESKBANDINFO'
    [C++ Erreur] ShlObj.h(1422): E2238 Multiple declaration for 'FVSHOWINFO'
    [C++ Erreur] ShlObj.h(3457): E2238 Multiple declaration for 'SHELLFLAGSTATE'

    EDIT >> Après un petit tour sur google, je poste la solution testée

    Le define
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define NO_WIN32_LEAN_AND_MEAN
    doit impérativement se trouver AVANT

  7. #7
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 472
    Par défaut yop
    Salut,

    Essai d'ajouter ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define NO_WIN32_LEAN_AND_MEAN
    Juste avant le :
    Cordialement,
    MaTHieU

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 10
    Par défaut
    Merci Mathieu !

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

Discussions similaires

  1. Comment choisir un répertoire (et non pas un fichier)
    Par FrankW dans le forum Débuter
    Réponses: 2
    Dernier message: 14/12/2007, 13h18
  2. Réponses: 5
    Dernier message: 13/06/2006, 15h14
  3. Comment choisir le SGBD pour mes statistiques ?
    Par erwan.bodere dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 05/04/2006, 18h45
  4. [JSP][Tomcat] COmment choisir la place des fichiers .class?
    Par mathieu dans le forum Tomcat et TomEE
    Réponses: 16
    Dernier message: 03/03/2004, 09h24
  5. Comment trouver le répertoire démarrage sous 98?
    Par PHILOSOPHE dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 18/11/2003, 20h10

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