0

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

谢谢

4

3 回答 3

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;
于 2010-09-13T15:58:25.953 回答
2

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

于 2010-09-13T15:48:25.680 回答
-1

'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;
于 2010-09-13T15:58:16.220 回答