joelsprung
Messages postés4Date d'inscriptionlundi 8 août 2005StatutMembreDernière intervention20 décembre 2005
-
19 déc. 2005 à 11:30
cs_Adkiks
Messages postés40Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention29 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.
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 20 déc. 2005 à 13:11
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;
Ifnot 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és3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 19 déc. 2005 à 12:11
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;
cs_Adkiks
Messages postés40Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention29 janvier 2006 22 déc. 2005 à 23:40
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