Delphi OpenDialog, не позволяя пользователю перейти от внутреннего дире
-
02-10-2019 - |
Вопрос
Я пытаюсь создать открытый диалог (в 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;