Sélection d'un répertoire avec TOpenDialog

j'aimerais vraiment connaître les différentes façons dont je pourrais sélectionner un répertoire avec le TOpenDialog, qu'il s'agisse du téléchargement d'un nouveau composant ou de L'utilisation de ce qui est fourni par Delphi, mais de préférence en utilisant ce qui est fourni par Delphi.

avant cela, j'utilisais la commande SelectDirectory mais je pense que ce serait difficile pour les utilisateurs de mon programme de chercher le répertoire spécifié.

je pense que le SelectDirectory est "faible", car il peut être un processus long lorsque la recherche pour le répertoire que vous voulez. Par exemple, vous voulez naviguer dans le répertoire de données de L'Application. Combien de temps ou serait-il difficile d'y naviguer? En fin de compte, les utilisateurs peuvent ne pas atteindre leur répertoire souhaité.

j'ai besoin de quelque chose comme ça où l'utilisateur peut copier et coller des répertoires dans la barre d'adresse du répertoire en haut.

enter image description here

Merci pour toutes vos réponses.

44
demandé sur ple103 2011-09-15 00:38:44

5 réponses

Vous pouvez utiliser le TFileOpenDialog (sur Vista et+):

with TFileOpenDialog.Create(nil) do
  try
    Options := [fdoPickFolders];
    if Execute then
      ShowMessage(FileName);
  finally
    Free;
  end;

Personnellement, j'utilise toujours le TFileOpenDialog sur Vista+ et de secours, à l'aide de la SelectDirectory (la bonne!) sur XP, comme ceci:

if Win32MajorVersion >= 6 then
  with TFileOpenDialog.Create(nil) do
    try
      Title := 'Select Directory';
      Options := [fdoPickFolders, fdoPathMustExist, fdoForceFileSystem]; // YMMV
      OkButtonLabel := 'Select';
      DefaultFolder := FDir;
      FileName := FDir;
      if Execute then
        ShowMessage(FileName);
    finally
      Free;
    end
else
  if SelectDirectory('Select Directory', ExtractFileDrive(FDir), FDir,
             [sdNewUI, sdNewFolder]) then
    ShowMessage(FDir)
62
répondu Andreas Rejbrand 2011-09-15 08:19:27

Vous savez que les deux fonctions surchargées appelé FileCtrl.SelectDirectory produit des dialogues complètement différents, n'est-ce pas?

SelectDirectory(s, [], 0);

Capture d'écran http://privat.rejbrand.se/oldseldir.png

SelectDirectory('Select a directory', s, s, []);

Capture d'écran http://privat.rejbrand.se/newseldir.png

53
répondu Andreas Rejbrand 2011-09-14 21:02:44

vient de trouver le code ci-dessous qui semble bien fonctionner dans XP et Vista, Win7. Il fournit une INTERFACE utilisateur pour un utilisateur de sélectionner un répertoire. Il utilise TOpenDialog, mais lui envoie quelques messages pour nettoyer l'apparence dans le but de sélectionner un répertoire.

après avoir souffert des capacités limitées fournies par Windows lui-même, c'est un plaisir d'être en mesure de donner à mes utilisateurs une interface utilisateur familière où ils peuvent parcourir et sélectionner un dossier confortablement.

j'avais été je cherche quelque chose comme ça depuis longtemps, alors j'ai pensé le poster ici pour que les autres puissent en profiter.

voici à quoi ça ressemble dans Win 7:

screen capture

//***********************
//** Choose a directory **
//**   uses Messages   **
//***********************
  //General usage here:
  //  http://www.delphipages.com/forum/showthread.php?p=185734
  //Need a class to hold a procedure to be called by Dialog.OnShow:
  type TOpenDir = class(TObject)
  public
    Dialog: TOpenDialog;
    procedure HideControls(Sender: TObject);
  end;
  //This procedure hides de combo box of file types...
  procedure TOpenDir.HideControls(Sender: TObject);
  const
    //CDM_HIDECONTROL and CDM_SETCONTROLTEXT values from:
    //  doc.ddart.net/msdn/header/include/commdlg.h.html
    //  CMD_HIDECONTROL = CMD_FIRST + 5 = (WM_USER + 100) + 5;
    //Usage of CDM_HIDECONTROL and CDM_SETCONTROLTEXT here:
    //  msdn.microsoft.com/en-us/library/ms646853%28VS.85%29.aspx
    //  msdn.microsoft.com/en-us/library/ms646855%28VS.85%29.aspx
    CDM_HIDECONTROL =    WM_USER + 100 + 5;
    CDM_SETCONTROLTEXT = WM_USER + 100 + 4;
    //Component IDs from:
    //  msdn.microsoft.com/en-us/library/ms646960%28VS.85%29.aspx#_win32_Open_and_Save_As_Dialog_Box_Customization
    //Translation into exadecimal in dlgs.h:
    //  www.koders.com/c/fidCD2C946367FEE401460B8A91A3DB62F7D9CE3244.aspx
    //
    //File type filter...
    cmb1: integer  = 0; //Combo box with list of file type filters
    stc2: integer  = 1; //Label of the file type
    //File name const...
    cmb13: integer = c; //Combo box with name of the current file
    edt1: integer  = 0; //Edit with the name of the current file
    stc3: integer  = 2; //Label of the file name combo
  var H: THandle;
  begin
    H:= GetParent(Dialog.Handle);
    //Hide file types combo...
    SendMessage(H, CDM_HIDECONTROL, cmb1,  0);
    SendMessage(H, CDM_HIDECONTROL, stc2,  0);
    //Hide file name label, edit and combo...
    SendMessage(H, CDM_HIDECONTROL, cmb13, 0);
    SendMessage(H, CDM_HIDECONTROL, edt1,  0);
    SendMessage(H, CDM_HIDECONTROL, stc3,  0);
    //NOTE: How to change label text (the lentgh is not auto):
    //SendMessage(H, CDM_SETCONTROLTEXT, stc3, DWORD(pChar('Hello!')));
  end;
//Call it when you need the user to chose a folder for you...
function GimmeDir(var Dir: string): boolean;
var
  OpenDialog: TOpenDialog;
  OpenDir: TOpenDir;
begin
  //The standard dialog...
  OpenDialog:= TOpenDialog.Create(nil);
  //Objetc that holds the OnShow code to hide controls
  OpenDir:= TOpenDir.create;
  try
    //Conect both components...
    OpenDir.Dialog:= OpenDialog;
    OpenDialog.OnShow:= OpenDir.HideControls;
    //Configure it so only folders are shown (and file without extension!)...
    OpenDialog.FileName:= '*.';
    OpenDialog.Filter:=   '*.';
    OpenDialog.Title:=    'Chose a folder';
    //No need to check file existis!
    OpenDialog.Options:= OpenDialog.Options + [ofNoValidate];
    //Initial folder...
    OpenDialog.InitialDir:= Dir;
    //Ask user...
    if OpenDialog.Execute then begin
      Dir:= ExtractFilePath(OpenDialog.FileName);
      result:= true;
    end else begin
      result:= false;
    end;
  finally
    //Clean up...
    OpenDir.Free;
    OpenDialog.Free;
  end;
end;
6
répondu RobertFrank 2013-09-06 00:48:00

incluez juste

FileCtrl.pas

var
  sDir:String;
begin
  SelectDirectory('Your caption','',sDir);
end;

il suffit de laisser le deuxième argument vide si vous voulez voir tous les répertoires y compris le bureau. Si vous définissez le deuxième argument à N'importe quel chemin valide, alors votre dialogue aura ce chemin au dossier supérieur et vous ne pouvez pas naviguer au-delà de cela.

Par exemple:

SelectDirectory('Your caption','C:\',sDir) ne vous laissera pas de sélectionner quoi que ce soit au-delà de C:\, comme D:\ ou E:\ etc.

Donc il est bon de le laisser vide.

6
répondu Shadab Mozaffar 2016-11-28 20:07:43

Si vous utilisez JVCL vous pouvez utiliser TJvSelectDirectory. Avec cela, vous pouvez passer entre l'ancien et le nouveau style en mettant une propriété. Par exemple:

Dlg := TJvSelectDirectory.Create(Self);
try
    Dlg.Title := MyTitle;
    Dlg.InitialDir := MyStartDir;
    Dlg.Options := Dlg.Options + [sdAllowCreate, sdPerformCreate];     
    Dlg.ClassicDialog := False;   //switch style
    if Dlg.Execute() then
      NewDir := Dlg.Directory;
finally
    Dlg.Free;
end; 
2
répondu yonojoy 2015-07-17 07:59:54