Delphi OpenDialog,而不允许用户离开初始目录

Delphi OpenDialog,而不允许用户离开初始目录,delphi,windows-7,fileopendialog,Delphi,Windows 7,Fileopendialog,我正在尝试创建一个打开的对话框(在Windows7中),用户被限制在初始目录中。在“打开”对话框中,我已将optionsEX设置为[ofExNoPlacesBar],并删除了一个栏,该栏允许用户快速选择文件夹和目录,但用户可以使用面包屑地址工具提升一个级别,并在文件名文本框中键入不同的目录以更改目录 谢谢使用不同的打开对话框(自己制作一个表单,没有文件夹导航,只有一个文件列表框),或者只审核与初始目录不匹配的路径并拒绝实际打开文件。使用不同的打开对话框(自己制作一个表单,没有文件夹导航,只有一个

我正在尝试创建一个打开的对话框(在Windows7中),用户被限制在初始目录中。在“打开”对话框中,我已将optionsEX设置为[ofExNoPlacesBar],并删除了一个栏,该栏允许用户快速选择文件夹和目录,但用户可以使用面包屑地址工具提升一个级别,并在文件名文本框中键入不同的目录以更改目录


谢谢

使用不同的打开对话框(自己制作一个表单,没有文件夹导航,只有一个文件列表框),或者只审核与初始目录不匹配的路径并拒绝实际打开文件。

使用不同的打开对话框(自己制作一个表单,没有文件夹导航,只有一个文件列表框),或者简单地审核与初始目录不匹配的路径,并拒绝实际打开文件。

FileOpenDialog'有一个类型为的事件,该事件具有布尔
CanChange
参数。我希望将此参数设置为false可以达到此目的

编辑:
根据Remy的评论使用示例(如果我理解正确)

以下方法同样有效,但更容易受到路径变化的影响(见下文Andreas的评论)


“FileOpenDialog”具有类型为的事件,该事件具有布尔
CanChange
参数。我希望将此参数设置为false可以达到此目的

编辑:
根据Remy的评论使用示例(如果我理解正确)

以下方法同样有效,但更容易受到路径变化的影响(见下文Andreas的评论)


如果您使用的是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;
在哪里

(请注意,每个
TFileOpenDialog
应该只有一个
FInitiated
。因此,如果
FileOpenDialog
TForm3
的私有成员,那么让
FInitiated
也成为
TForm3
的私有成员。)

为了改善用户体验,您可能会使用

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


如果您使用的是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;
在哪里

(请注意,每个
TFileOpenDialog
应该只有一个
FInitiated
。因此,如果
FileOpenDialog
TForm3
的私有成员,那么让
FInitiated
也成为
TForm3
的私有成员。)

为了改善用户体验,您可能会使用

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


是的,但是将其设置为literal
false
将使对话框无法打开,因为需要在对话框打开之前设置初始目录@Andreas-CanChange可以设置为false,条件是更改文件夹不是预定义的文件夹,否?@Andreas:当触发
OnFolderChangeing
事件时,对话框的
ShellItem
属性指向表示要更改的文件夹的
IShellItem
界面,并且
FileName
属性设置为文件夹的文件系统路径。您可以将这些值与对话框的
InitialDir
值进行比较,看看它们是否匹配。@Sertac:您知道为什么吗?因为
“C:\WINDOWS”“C:\WINDOWS”
。还有一个风险是有一个“\”后缀、.\”等。因此这是一个相当不稳定的方法,除非使用更复杂的
SameDir
函数。如果您不这样做,我认为我的方法安全得多。@Sertac:您的代码仍然不起作用<由于反斜杠,code>SameFileName('C:\WINDOWS\','C:\WINDOWS')返回
false
。请在两个参数中使用
includetrailingbackslax
。那么我最终会给你一个+1!是的,但是将其设置为literal
false
将使对话框无法打开,因为需要在对话框打开之前设置初始目录@Andreas-CanChange可以设置为false,条件是更改文件夹不是预定义的文件夹,否?@Andreas:当触发
OnFolderChangeing
事件时,对话框的
ShellItem
属性指向表示要更改的文件夹的
IShellItem
界面,并且
FileName
属性设置为文件夹的文件系统路径。您可以将这些值与对话框的
InitialDir
值进行比较,看看它们是否匹配。@Sertac:您知道为什么吗?因为
“C:\WINDOWS”“C:\WINDOWS”
。还有一个风险是有一个“\”后缀、.\”等。因此这是一个相当不稳定的方法,除非使用更复杂的
SameDir
函数。如果您不这样做,我认为我的方法安全得多。@Sertac:您的代码仍然不起作用<由于反斜杠,code>SameFileName('C:\WINDOWS\','C:\WINDOWS')返回
false
。请在两个参数中使用
includetrailingbackslax
。那么我最终会给你一个+1!
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;