J'aimerais vraiment connaître les différentes façons de sélectionner un répertoire avec TOpenDialog, qu'il s'agisse de télécharger un nouveau composant ou d'utiliser 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 rechercher le répertoire spécifié.
Je pense que SelectDirectory est "faible" car cela peut être un long processus lors de la recherche du répertoire que vous souhaitez. Supposons, par exemple, que vous souhaitiez accéder au répertoire Application Data. Quelle serait la durée ou la difficulté de s'y rendre? En fin de compte, les utilisateurs peuvent même ne pas atteindre le 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 là-bas.
Merci pour toutes vos réponses.
Vous pouvez utiliser le TFileOpenDialog
(sur Vista +):
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 le repli en utilisant le SelectDirectory
(le bon!) 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)
Vous savez que les deux fonctions surchargées appelées FileCtrl.SelectDirectory
produit des dialogues entièrement différents, non?
SelectDirectory(s, [], 0);
SelectDirectory('Select a directory', s, s, []);
Il suffit d'inclure
FileCtrl.pas
var
sDir:String;
begin
SelectDirectory('Your caption','',sDir);
end;
Laissez simplement 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 sur un chemin valide, votre boîte de dialogue aura ce chemin vers le dossier supérieur et vous ne pourrez pas naviguer au-delà.
Par exemple:
SelectDirectory('Your caption','C:\',sDir)
ne vous permettra pas de sélectionner quoi que ce soit au-delà de C:\
, comme D:\
ou E:\
etc.
Il est donc bon de le laisser vide.
Je viens de trouver le code ci-dessous qui semble bien fonctionner dans XP et Vista, Win7. Il fournit une interface utilisateur à un utilisateur pour sélectionner un répertoire. Il utilise TOpenDialog, mais lui envoie quelques messages pour nettoyer l'apparence aux fins de la sélection d'un répertoire.
Après avoir souffert des capacités limitées fournies par Windows lui-même, c'est un plaisir de pouvoir donner à mes utilisateurs une interface utilisateur familière où ils peuvent parcourir et sélectionner un dossier confortablement.
Je cherchais quelque chose comme ça depuis longtemps, alors j'ai pensé le publier ici afin que d'autres puissent en bénéficier.
Voici à quoi cela ressemble dans Win 7:
//***********************
//** 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 = $470; //Combo box with list of file type filters
stc2: integer = $441; //Label of the file type
//File name const...
cmb13: integer = $47c; //Combo box with name of the current file
edt1: integer = $480; //Edit with the name of the current file
stc3: integer = $442; //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;
Si vous utilisez JVCL vous pouvez utiliser TJvSelectDirectory. Avec cela, vous pouvez basculer entre l'ancien et le nouveau style en définissant 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;