2012-03-02 4 views
4

Possible en double:
Delphi: Selecting a directory with TOpenDialogDELPHI - Comment utiliser opendialog1 pour choisir un dossier?

je dois ouvrir un dossier spécifique sur mon projet. Quand j'utilise opendialog1, je peux seulement ouvrir un fichier. Que diriez-vous d'ouvrir un dossier?

wanted - open folder dialog in Delphi

PS: J'utilise Delphi 2010

+3

Réponse de Ken (le seul à ce jour) est grande, mais cela semble être un dup de: http://stackoverflow.com/questions/ 7422689/delphi-selection-a-directory-with-topendialog – Argalatyr

+0

En fait, vous pouvez utiliser le descendant 'TOpenDialog' -' TSaveDialog' (ouais, c'est assez rapide et sale) – OnTheFly

+1

A voté pour fermer, mais il me manquera ["La réponse de Teran"] (http://stackoverflow.com/a/9529154/960757) là. – TLama

Répondre

6

Vous pouvez également utiliser TBrowseForFolder classe d'action (stdActns.pas):.

var 
    dir: string; 
begin 
    with TBrowseForFolder.Create(nil) do try 
    RootDir := 'C:\'; 
    if Execute then 
     dir := Folder; 
    finally 
    Free; 
    end; 
end; 

ou utiliser la fonction winapi - SHBrowseForFolder directement (deuxième SelectDirectory surcharge utilise, au lieu de la première surcharge, ce qui crée propre delphi-fenêtre avec tous les contrôles lors de l'exécution):

var 
    dir : PChar; 
    bfi : TBrowseInfo; 
    pidl : PItemIDList; 
begin 
    ZeroMemory(@bfi, sizeof(bfi)); 
    pidl := SHBrowseForFolder(bfi); 
    if pidl <> nil then try 
    GetMem(dir, MAX_PATH + 1); 
    try 
     if SHGetPathFromIDList(pidl, dir) then begin 
     // use dir 
     end; 
    finally 
     FreeMem(dir); 
    end; 
    finally 
    CoTaskMemFree(pidl); 
    end; 
end; 
+0

lignes 13,14 pourrait être remplacé par 'CoTaskMemFree' – OnTheFly

9

Vous cherchez SelectDirectory dans l'unité FileCtrl. Il dispose de deux versions surchargées:

function SelectDirectory(var Directory: string; 
    Options: TSelectDirOpts; HelpCtx: Longint): Boolean; 
function SelectDirectory(const Caption: string; const Root: WideString; 
var Directory: string; Options: TSelectDirExtOpts; Parent: TWinControl): Boolean; 

celui que vous voulez utiliser dépend de la version de Delphi que vous utilisez, et l'apparence et les fonctionnalités spécifiques que vous cherchez; Je (trouve habituellement la deuxième version fonctionne parfaitement pour les versions modernes de Delphi et Windows, et les utilisateurs semblent satisfaits de la « apparence normalement attendue et la fonctionnalité »

+2

+1 Ken, btw le nom de l'unité est 'FileCtrl'. – RRUZ

+1

Les deux fonctions ont été retirées de l'unité 'FileCtrl' il y a longtemps. –

+0

Rodrigo, merci pour la correction. Fixé. @Remy, le [docs pour XE2] (http://docwiki.embarcadero.com/VCL/fr/FileCtrl.SelectDirectory) dit que vous avez tort. Si elles ont été déplacées "il y a longtemps" les docs devraient mentionner ce fait. –

13

Sur Vista et plus vous pouvez montrer un dialogue plus moderne utilisant TFileOpenDialog.

var 
    OpenDialog: TFileOpenDialog; 
    SelectedFolder: string; 
..... 
OpenDialog := TFileOpenDialog.Create(MainForm); 
try 
    OpenDialog.Options := OpenDialog.Options + [fdoPickFolders]; 
    if not OpenDialog.Execute then 
    Abort; 
    SelectedFolder := OpenDialog.FileName; 
finally 
    OpenDialog.Free; 
end; 

qui ressemble à ceci:

enter image description here

Questions connexes