Delphi OpenDialog, не позволяя пользователю перемещаться от исходного каталога - PullRequest
0 голосов
/ 13 сентября 2010

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

Спасибо

Ответы [ 3 ]

4 голосов
/ 13 сентября 2010

Если вы используете 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;
2 голосов
/ 13 сентября 2010

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

0 голосов
/ 13 сентября 2010

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

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

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;
...