我正在尝试创建一个打开的对话框(在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;

(请注意,应该有一个 FInitiatedTFileOpenDialog. 。因此,如果 FileOpenDialogTForm3, , 让 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;

其他提示

使用其他开放的对话框(自己在没有文件夹导航的情况下,只有一个文件列表框就自己制作表单),或者简单地审核不匹配初始dir的路径并拒绝实际打开文件。

“ 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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top