Delphi OpenDialog sans laisser l'utilisateur à naviguer loin de la dir initiale
-
02-10-2019 - |
Question
Je suis en train de créer un dialogue ouvert (sous Windows 7) où l'utilisateur se limite au répertoire initial. Sur la boîte de dialogue ouverte, j'ai mis le optionsEX à [ofExNoPlacesBar] et qui supprime la barre qui leur permet de sélectionner des dossiers et des répertoires pour aller rapidement, mais l'utilisateur peut utiliser l'outil d'adresse de mie de pain pour monter un niveau et tapez un répertoire différent dans la zone de texte de nom de fichier dans les répertoires de changement.
Merci
La solution
Si vous utilisez Delphi 2009+, il y a un TFileOpenDialog
. Utilisez ceci, et ensemble
procedure TForm3.FileOpenDialog1FolderChange(Sender: TObject);
begin
FInitiated := true;
end;
procedure TForm3.FileOpenDialog1FolderChanging(Sender: TObject;
var CanChange: Boolean);
begin
CanChange := not FInitiated;
end;
procedure TForm3.btnOpenClick(Sender: TObject);
begin
FInitiated := false;
FileOpenDialog1.DefaultFolder := 'C:\MyFolder\';
FileOpenDialog1.Execute;
end;
où
var
FInitiated: boolean;
(avis qu'il devrait y avoir exactement un FInitiated
par TFileOpenDialog
. Donc, si FileOpenDialog
est membre privé de TForm3
, laissez-FInitiated
être membre privé de TForm3
aussi bien.)
Pour améliorer l'expérience utilisateur, vous utiliserez probablement
procedure TForm3.FileOpenDialog1FolderChanging(Sender: TObject;
var CanChange: Boolean);
begin
CanChange := not FInitiated;
if not CanChange then beep;
end;
ou
procedure TForm3.FileOpenDialog1FolderChanging(Sender: TObject;
var CanChange: Boolean);
begin
CanChange := not FInitiated;
if not CanChange then
MessageBox(Handle, PChar('Directory selection is not allowed.'), PChar(Caption), MB_ICONINFORMATION);
end;
Autres conseils
Utilisez une boîte de dialogue ouverte différente (faire un formulaire vous sans navigation dossier, seule une zone de liste de fichiers), ou simplement la vérification d'un chemin ne correspond pas à la dir initiale et refusent d'ouvrir effectivement le fichier.
Le 'FileOpenDialog' a OnFolderChanging
événement de type TFileDialogFolderChangingEvent
qui ont un paramètre CanChange
booléen. Je pense régler ce paramètre à false servirait le but.
modifier
Exemple d'utilisation selon les commentaires de Remy (si je comprends bien);
procedure TForm1.FileOpenDialog1FolderChanging(Sender: TObject;
var CanChange: Boolean);
var
Dlg: TFileOpenDialog;
DefFolder: IShellItem;
iOrder: Integer;
begin
CanChange := False;
Dlg := Sender as TFileOpenDialog;
if Succeeded(SHCreateItemFromParsingName(PWideChar(WideString(Dlg.DefaultFolder)), nil, IShellItem, DefFolder)) then
try
CanChange := Dlg.ShellItem.Compare(DefFolder, SICHINT_ALLFIELDS, iOrder) = S_OK;
finally
DefFolder := nil;
end;
end;
Les travaux ci-dessous, mais aussi plus vulnérables aux variations de chemin (voir les commentaires de Andreas ci-dessous);
procedure TForm1.FileOpenDialog1FolderChanging(Sender: TObject;
var CanChange: Boolean);
begin
CanChange := SameFileName(TFileOpenDialog(Sender).FileName,
TFileOpenDialog(Sender).DefaultFolder);
end;