我正在尝试创建一个打开的对话框(在Windows 7中),其中用户被限制在初始目录中。在打开的对话框中,我将optionsEX设置为[ofExNoPlacesBar]并删除了允许他们快速选择文件夹和目录的栏,但是用户可以使用面包屑地址工具上升一个级别并键入不同的目录进入文件名文本框以更改目录。
谢谢
答案 0 :(得分:4)
如果您使用的是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;
答案 1 :(得分:2)
使用不同的打开对话框(自己创建一个没有文件夹导航的表单,只有文件列表框),或者只是审核与初始目录不匹配的路径并拒绝实际打开文件。
答案 2 :(得分:-1)
'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;
以下也有效,但更容易受到路径变化的影响(参见Andreas下面的评论);
procedure TForm1.FileOpenDialog1FolderChanging(Sender: TObject;
var CanChange: Boolean);
begin
CanChange := SameFileName(TFileOpenDialog(Sender).FileName,
TFileOpenDialog(Sender).DefaultFolder);
end;