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

Était-ce utile?

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;

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top