SelectDirectory + bouton créer un nouveau dossier [Résolu]

Messages postés
4
Date d'inscription
lundi 8 août 2005
Statut
Membre
Dernière intervention
20 décembre 2005
- - Dernière réponse : cs_Adkiks
Messages postés
40
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
29 janvier 2006
- 22 déc. 2005 à 23:40
Bonjour,

Je voudrais savoir si il est possible d'obtenir, d'une manière ou d'une autre, la même boîte de dialogue que celle proposée avec SelectDirectory pour permettre à l'utilisateur de sélectionner un dossier existant, mais avec en plus le bouton "Créer un nouveau dossier". Il semble que que la fonction SelectDirectory ne le permette pas.

Cela doit pourtant être possible, vu que l'API windows implémente bien cette fonctionnalité, mais je ne sais pas comment faire en Delphi.

Merci d'avance...
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
3 août 2018
32
3
Merci
Salut,
Essaye ceci, ça fera peut être ton bonheur

// Code testé OK sous Delphi4


var
Form1: TForm1;


Const
BIF_NEWDIALOGSTYLE = $0040; // BIF_NEWDIALOGSTYLE à rajouter si Delphi7 ne le connait pas


implementation


uses ShlObj, ActiveX ; // indispensable


{$R *.DFM}


function IncludeTrailingPathDelimiter( const S: string): string; // à rajouter si Delphi7 ne le connait pas
begin
Result : = S;
If not IsPathDelimiter(Result, Length(Result)) then
Result := Result +'\';
end ;


function IncludeTrailingBackslash(const S: string): string; // à rajouter si Delphi7 ne le connait pas
begin
Result : = IncludeTrailingPathDelimiter(S);
end;


// voici le function qui te permet de sélectionner et où crée un répertoire
function MySelectDirectory(const Title: string;const Root: WideString;var Directory: string; const
Flag:integer): Boolean;
var
RootItemIDList, lpItemID : PItemIDList;
BrowseInfo: TBrowseInfo;
WindowList: Pointer;
IDesktopFolder: IShellFolder;
Eaten, Flags: LongWord;
ShellMalloc: IMalloc;
DisplayName : array[0..MAX_PATH] of char;
TempPath : array[0..MAX_PATH] of char;
begin
Result:= False;
Try
FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
RootItemIDList := nil ;
if Root <> '' then
begin
SHGetDesktopFolder(IDesktopFolder);
IDesktopFolder.ParseDisplayName(Application.Handle, nil,
POleStr(Root), Eaten, RootItemIDList, Flags);
end;
with BrowseInfo do begin
hwndOwner : = Application.Handle;
pszDisplayName := @DisplayName;
pidlRoot:= RootItemIDList;
lpszTitle := PChar(Title);
ulFlags := Flag;
end ;
WindowList : = DisableTaskWindows(0);
try
lpItemID := SHBrowseForFolder(BrowseInfo);
finally
EnableTaskWindows(WindowList);
end ;
if lpItemId <> nil then
begin
SHGetPathFromIDList(lpItemID, TempPath);
Directory : = IncludeTrailingBackslash(TempPath);
GlobalFreePtr(lpItemID);
end;
finally
if Succeeded(SHGetMalloc(ShellMalloc)) then
ShellMalloc.Free(RootItemIDList);
end;
end;

// et la methode d'appel
procedure TForm1.Button1Click(Sender: TObject);
Var s : String;
begin
MySelectDirectory('Choix du répertoire', 'c:\', s,BIF_NEWDIALOGSTYLE);
Label1.Caption := s;
end;



@+
Cirec

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 141 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Cirec
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
3 août 2018
32
0
Merci
Salut,
il y a deux version de SelectDirectory celle que tu utilises à parament et la deuxième essaye celle-ci:
function SelectDirectory(const Caption: string; const Root: WideString; var Directory: string; Options: TSelectDirExtOpts [sdNewUI]; Parent: TWinControl nil): Boolean; overload;
de l'unité FileCtrl

Procedure TForm1.Button4Click(Sender: TObject);
Var aDir : String; // pour récupérer le répertoire
Begin
If SelectDirectory('Selectionnez un répertoire', 'c:\', aDir, [sdNewFolder, sdNewUI], // ces deux options permettent l'ajout d'un répertoire
Self) // Self = Form1.Handle dans ce cas peut aussi être Nil si pas de parent
Then
Label1.Caption := aDir;
End;



@+
Cirec
Commenter la réponse de Cirec
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
3 août 2018
32
0
Merci
Ps :
Ne pas oublier de cliquer sur Réponse acceptée lorsque la réponse vous convient.



@+
Cirec
Commenter la réponse de Cirec
Messages postés
4
Date d'inscription
lundi 8 août 2005
Statut
Membre
Dernière intervention
20 décembre 2005
0
Merci
Merci, mais je ne dispose pas de cette version de SelectDirectory, bien intéressante pourtant. Où puis-je me la procurer et comment l'installer ?

Je débute en Delphi, donc pour tout ce qui concerne d'éventuelles mise à jour de la vcl, je suis un peu largué...

merci.
Commenter la réponse de joelsprung
Messages postés
4307
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
25
0
Merci
qu'elle version de delphi as-tu ?

La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>
Commenter la réponse de f0xi
Messages postés
4307
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
25
0
Merci
trop lol le bug du <HR> dans ma reponse precedente!

Nix un coups de main pour debugger le site ?

La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>
Commenter la réponse de f0xi
Messages postés
4
Date d'inscription
lundi 8 août 2005
Statut
Membre
Dernière intervention
20 décembre 2005
0
Merci
J'utilise Delphi 7
Commenter la réponse de joelsprung
Messages postés
4
Date d'inscription
lundi 8 août 2005
Statut
Membre
Dernière intervention
20 décembre 2005
0
Merci
Merci beaucoup !!!
Commenter la réponse de joelsprung
Messages postés
40
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
29 janvier 2006
0
Merci
J'ai essayé le code et ca marche bien cependant On ne peut utiliser qu'une seule partition(ici la partition C).Je présume qu'on ne peut pas avoir toutes le partitions en meme temps.En supprimant C:\ on obtient:
MySelectDirectory('Choix du répertoire', '', s,BIF_NEWDIALOGSTYLE);
Et on peut ainsi Acceder a toutes les partitions.
Merci pour le code Cirec
Commenter la réponse de cs_Adkiks