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 :

Changement de répertoire dans TOpendialog


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2002
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 33
    Par défaut Changement de répertoire dans TOpendialog
    Bonjour,
    je voudrait interdire le Changement de répertoire dans TOpenialog afin que l'utilisateur soit obligé de sélectionner son fichier dans le répertoire InitialDir.
    Merci.

  2. #2
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Salut,

    Je ne sais pas si c'est possible de verrouiller le répertoire InitDir pour la sélection des fichiers, cependant, tu peux effectuer un traitement pour les 2 cas qui se présente, c'est à dire :

    - Le fichier sélectionné est dans le répertoire ou dans un des sous répertoires du dossier initial : Le fichier pourra être ouvert.

    - Le fichier sélectionné est hors du répertoire initial : On affiche un message disant que le fichier ne peut pas être ouvert.

    Voici le code qui permet de faire ce traitement (je me suis juste limité aux tests) :

    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
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      AnsiString  DossierDeRecherche,FichierSelectionne;
      DossierDeRecherche=OpenDialog1->InitialDir;
      if (OpenDialog1->Execute())
      {
        FichierSelectionne=OpenDialog1->FileName;
        if (StrPos(FichierSelectionne.c_str(),DossierDeRecherche.c_str()))
        {
          // On fait le traitement désiré (on ouvre le fichier etc etc)
        }
        else
        ShowMessage("Le fichier sélectionné est en dehors du répertoire initial! Impossible de l'ouvrir.");
      }
    }
    La fonction StrPos permet de tester si la chaine de droite est présente dans la chaine de gauche.


    En espérant que celà t'aide
    @+

  3. #3
    Membre averti
    Inscrit en
    Août 2002
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 33
    Par défaut
    Le problème dans ce cas la, c'est que l'utilisateur peut s'amuser a se balader dans tous ses répertoires pendant 2 minutes pour trouver son fichier avant de le valider et de se retrouver avec un message lui indiquant qu'il avait pas le droit de changer de répertoire ! C'est pas acceptable pour un utilisateur et encore moins pour un client ! Ce que je cherche, c'est vraiement empêcher l'utilisateur de sortir de l'initialdir !
    Merci quand même !

  4. #4
    Membre éprouvé

    Profil pro
    Cadre
    Inscrit en
    Mars 2006
    Messages
    132
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Cadre

    Informations forums :
    Inscription : Mars 2006
    Messages : 132
    Par défaut
    Le plus simple serait de créer toi-même ta fenetre de dialogue ou tu n'affiches que les fichiers, pas de répertoire, et pas de boutons pour se déplacer

  5. #5
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Je suis d'accord avec Tenguryu Tu donnes toi même les fichiers disponible pour ton utilisateur, c'est le plus simple.
    Le OpenDialog, ou l'API correspondante n'offre pas la possibilité d'intervenir lorsque l'utilisateur navigue sur la fenêtre de choix. Il existe bien une option pour éviter le changement de répertoire, mais elle n'est plus supporter par l'OS. Tout est décrit ici, sur le site de msdn.

  6. #6
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Voici un petit exemple largement inspiré de la Source sur le fonctionnement du TTreeView (Merci à Ricky81):

    dans le cpp:
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::Button4Click(TObject *Sender)
    {  
       AnsiString chemin = ExtractFilePath(Application->ExeName);
       TreeView1->Items->GetFirstNode()->Text = chemin;
       TreeView1->Items->GetFirstNode()->DeleteChildren();
       // code recherchant tous les fichiers dans le repertoire dont le nom est défini
       // par le texte du premier noeud du TreeView
     
       TSearchRec SF;
       FindFirst(TreeView1->Items->Item[0]->Text + "\\*.*", faAnyFile, SF);
       do
       {
          if( !(SF.Attr & faDirectory) )       // Pour éviter les répertoires
          {
             TreeView1->Items->AddChild(TreeView1->Items->Item[0], SF.Name);
          }
        }
       while( FindNext(SF)==0 );
       FindClose(SF);
     
       TreeView1->Items->GetFirstNode()->Expand(true);
     
    }
    //---------------------------------------------------------------------------
     
     
    void __fastcall TForm1::TreeView1AdvancedCustomDrawItem(
          TCustomTreeView *Sender, TTreeNode *Node, TCustomDrawState State,
          TCustomDrawStage Stage, bool &PaintImages, bool &DefaultDraw)
    {
       //on récupère la largeur de la 1ere section du Header control dans w1
       int w1 = HeaderControl1->Sections->Items[0]->Width;
     
       //on récupère la surface (TRect) dans laquelle se dessine le noeud du TreeView1
       TRect R = Node->DisplayRect(true);
     
       // On elargit cette surface pour qu'elle aille jusqu'au bord droit du TreeView1
       R.Right = TreeView1->Width;
     
       // On Dessine un rectangle vide  pour effacer ce que le composant à déjas dessiné
       TreeView1->Canvas->FillRect(R);
     
       // On Dessine le nom du Fichier
       TreeView1->Canvas->TextOutA(R.Left, R.Top, Node->Text);
     
       // On dessine un signe "..."pour couvrir la fin du nom du fichier si il est trop long
       int w2 = TreeView1->Canvas->TextWidth( Node->Text);
       int w3 = TreeView1->Canvas->TextWidth("...");
       if( w2+R.Left > w1)
       {
          TreeView1->Canvas->TextOutA(w1-w3, R.Top, "...");
       }
     
       //On Verifie que le fichier existe bien
       TSearchRec SF;
       AnsiString c1 = FileSearch(Node->Text, TreeView1->Items->Item[0]->Text + "\\");
     
       // On aligne la gauche du rectangle de dessin sur la section du HeaderControl1
       R.Left = w1;
     
       //On efface ce qui pourrait gener sur le Canvas du TreeView1
       TreeView1->Canvas->FillRect(R);
     
       // On Dessine enfin le nom Complet du Fichier
       TreeView1->Canvas->TextOutA(w1, R.Top, c1);
     
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::HeaderControl1SectionResize(
          THeaderControl *HeaderControl, THeaderSection *Section)
    {
       // force à redessiner le treeview
       // lorsqu'on redimensionne la Section du HeaderControl
       TreeView1->Repaint();
    }
    //---------------------------------------------------------------------------
     
     
    void __fastcall TForm1::TreeView1Click(TObject *Sender)
    {
       Memo1->Clear();
       TStringList *File = new TStringList;
       File->LoadFromFile(TreeView1->Items->Item[TreeView1->Selected->Index+1]->Text);
       for(int i=0;i<File->Count;i++)
          Memo1->Lines->Add(File->Strings[i]);
       Memo1->SetFocus();
       Memo1->SelStart = 0;
       Memo1->SelLength = 0;
    }
    //---------------------------------------------------------------------------
    Il te faut un bouton, un TreeView et un Memo. Dans mon exemple, j'impose l'utilisateur à voir à travers le TreeView uniquement le répertoire de l'application. Il n'a pas de possibilité de changer. Le click sur un des fichiers le charge dans le Memo.

    Si ca te conviens ...

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

Discussions similaires

  1. Sélection multiple de fichiers dans TOpenDialog
    Par SOPRA-Eherve dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/05/2007, 19h02
  2. Réponses: 4
    Dernier message: 22/01/2007, 21h14
  3. changement de formulaire sur selection dans le select
    Par LeXo dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 15/06/2006, 11h51
  4. Changement valeur d'un champ dans une requête
    Par Mimile28 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/04/2005, 14h28

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