Ограничить каталоги в TFileOpenDialog - PullRequest
4 голосов
/ 19 мая 2011

Я использую TFileOpenDialog в форме ввода данных в Delphi XE. Пользователь выбирает документ PDF в диалоговом окне, а путь и имя файла UNC сохраняются в поле базы данных. Я хочу ограничить область просмотра пользователем свойства DefaultDirectory и файлов / подкаталогов ниже этого. Я надеюсь, что пользователь не сможет выбирать файлы, которые находятся на локальных дисках или подключенных дисках и недоступны другим пользователям, которым понадобятся значения, хранящиеся в базе данных.

Я думаю, что способ сделать это - событие TFileOpenDialog.OnFolderChanging. Но я не уверен, как проверить, является ли выбранный файл или папка дочерним по отношению к DefaultDirectory. Учитывая имя файла или имя каталога, как я могу определить, зависит ли оно от DefaultDirectory?

Ответы [ 2 ]

4 голосов
/ 19 мая 2011

вы можете сравнить свойство ShellItem диалогового окна TFileOpenDialog со свойством DefaultFolder, используя StartsText и установите значение CanChange в соответствии с результатом.

проверьте этот образец.

uses
 StrUtils,
 ActiveX,
 ShlObj;

{$R *.dfm}

procedure TForm50.Button1Click(Sender: TObject);
begin
  FileOpenDialog1.DefaultFolder:='C:\Program Files';
  FileOpenDialog1.Execute;
end;

function GetItemName(Item: IShellItem; var ItemName: TFileName): HResult;
var
  pszItemName: LPCWSTR;
begin
  Result := Item.GetDisplayName(SIGDN_FILESYSPATH, pszItemName);
  if Failed(Result) then
    Result := Item.GetDisplayName(SIGDN_NORMALDISPLAY, pszItemName);
  if Succeeded(Result) then
  try
    ItemName := pszItemName;
  finally
    CoTaskMemFree(pszItemName);
  end;
end;


procedure TForm50.FileOpenDialog1FolderChanging(Sender: TObject;var CanChange: Boolean);
var
  CurrentDir : TFileName;
  Result     : HRESULT;
begin
  Result    := GetItemName(TFileOpenDialog(Sender).ShellItem,CurrentDir);
  CanChange := Succeeded(Result) and StartsText(TFileOpenDialog(Sender).DefaultFolder,CurrentDir);
  if not CanChange then
   ShowMessage('Sorry do you not have access to this folder');
end;
0 голосов
/ 19 мая 2011

Просто подумайте о том, что вы пытаетесь сделать здесь ...

Вы всегда можете позволить пользователю выбрать папку, а затем показать ошибку, если был выбран неверный путь.После этого верните пользователя в корень действительного дерева папок.

Преимущества:

  • Вы можете выполнить собственную проверку.У вас может быть несколько начальных папок или более сложные шаблоны того, что вы принимаете, а что нет.

  • Вы можете информировать своих пользователей о том, что вы хотите, чтобы они делали,вместо того, чтобы запрещать то, что не разрешено.В современных шаблонах пользовательского интерфейса рекомендуется не отключать кнопки, а позволить пользователю нажимать на них, а затем информировать пользователя, почему определенная операция не может быть выполнена.В противном случае это может сбить с толку пользователей, почему они не могут делать определенные вещи.

...