Delphi OpenDialog,不让用户离开最初的目录

时间:2010-09-13 15:38:42

标签: delphi windows-7 fileopendialog

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

谢谢

3 个答案:

答案 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。因此,如果FileOpenDialogTForm3的私人成员,请FInitiatedTForm3的私人成员。)

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

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'有一个类型为OnFolderChangingTFileDialogFolderChangingEvent事件,它有一个布尔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;