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