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.
Version imprimable
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.
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) :
La fonction StrPos permet de tester si la chaine de droite est présente dans la chaine de gauche.Code:
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."); } }
En espérant que celà t'aide :roll:
@+ ;)
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 !
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
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.
Voici un petit exemple largement inspiré de la Source sur le fonctionnement du TTreeView (Merci à Ricky81):
dans le cpp:
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.Code:
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; } //---------------------------------------------------------------------------
Si ca te conviens ...;)
Salut !
Avec mon BCB3 Pro j'utilise une form (bsDialog), un TFileListBox et deux TBitBtn (Ok et Cancel).
C'est pas plus simple pour interdire à l'utilisateur tout accès à un quelconque dossier ?
A plus !
C'est finalement ce que j'ai fait (faire ma propre boite) car j'ai pas trouvé de solution adéquate