Delphi OpenDialog, не позволяя пользователю перейти от внутреннего дире

StackOverflow https://stackoverflow.com/questions/3701959

Вопрос

Я пытаюсь создать открытый диалог (в Windows 7), где пользователь ограничен исходным каталогом. В открытом диалоге я установил опцион для [ofExnoplacesbar], и который удаляет панель, которая позволит им выбирать папки и каталоги, чтобы быстро перейти, но пользователь может использовать инструмент Address Crumb Crumb, чтобы подняться на уровень и введите другой каталог В текстовое поле имени файла, чтобы изменить каталоги.

Спасибо

Это было полезно?

Решение

Если вы используете Delphi 2009+, есть TFileOpenDialog. Отказ Используйте это и установить

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;

(Обратите внимание, что должен быть ровно один FInitiated нами TFileOpenDialog. Отказ Так что если FileOpenDialog является частным членом TForm3, позволять FInitiated быть частным членом TForm3 также.)

Чтобы улучшить пользовательский опыт, вы, вероятно, будете использовать

procedure TForm3.FileOpenDialog1FolderChanging(Sender: TObject;
  var CanChange: Boolean);
begin
  CanChange := not FInitiated;
  if not CanChange then beep;
end;

или

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;

Другие советы

Используйте другой открытый диалог (сделайте форму себя без навигации папки, только в списке файлов) или просто аудит для пути, не совпадающего на начальном DIR и отказаться от фактического открытия файла.

'Fileopendialog' имеет OnFolderChanging событие типа TFileDialogFolderChangingEvent которые имеют логический CanChange параметр. Я ожидаю, что установка этого параметра на ложь будет служить цели.

редактировать:
Пример использования в соответствии с комментариями REMY (если я правильно понял);

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;

Ниже также работает, но более уязвимы для вариаций пути (см. Комментарии к андреасу ниже);

procedure TForm1.FileOpenDialog1FolderChanging(Sender: TObject;
  var CanChange: Boolean);
begin
  CanChange := SameFileName(TFileOpenDialog(Sender).FileName,
                            TFileOpenDialog(Sender).DefaultFolder);
end;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top