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

Signaler
Messages postés
4
Date d'inscription
lundi 8 août 2005
Statut
Membre
Dernière intervention
20 décembre 2005
-
Messages postés
40
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
29 janvier 2006
-
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...

9 réponses

Messages postés
3811
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
15 juin 2020
30
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
Messages postés
3811
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
15 juin 2020
30
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
Messages postés
3811
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
15 juin 2020
30
Ps :
Ne pas oublier de cliquer sur Réponse acceptée lorsque la réponse vous convient.



@+
Cirec
Messages postés
4
Date d'inscription
lundi 8 août 2005
Statut
Membre
Dernière intervention
20 décembre 2005

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.
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
30
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>
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
30
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>
Messages postés
4
Date d'inscription
lundi 8 août 2005
Statut
Membre
Dernière intervention
20 décembre 2005

J'utilise Delphi 7
Messages postés
4
Date d'inscription
lundi 8 août 2005
Statut
Membre
Dernière intervention
20 décembre 2005

Merci beaucoup !!!
Messages postés
40
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
29 janvier 2006

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