0

我使用 FileCtrl.SelectDirectory 来显示“打开文件夹”对话框。但是,我对它不满意,因为它不允许用户输入开始浏览的路径。例如,如果用户已经在剪贴板中有路径,它应该能够将它输入到我的对话框中,而不是浪费 12 秒来导航(打开)大量文件夹,直到它到达那里。

我发现这段代码似乎与 FileCtrl.SelectDirectory 完全一样。我希望它能让我更多地配置对话框。它没有。

那么,如何在 SelectDirectory 中显示用户可以输入路径的编辑框?

我现在拥有的解决方案是我自己的对话框。它是使用 TDirectory 和 TListBox 从零开始构建的。非常便利。但是它看起来很陈旧,因为它使用了 Embarcadero 的文件管理控件(TDirectory、TListBox),而且我们都知道它们看起来有多无聊。


说清楚:我想要像 FileCtrl.SelectDirectory 这样的东西,但有一个精确的 TEdit 或一个用户可以输入其路径的 crumbar(如果他有的话)。例子:在此处输入图像描述

4

5 回答 5

2

将 sdShowEdit 传递给 FileCtrl.SelectDirectory 会添加一个编辑框,您可以将目录粘贴到该编辑框中。

  FileCtrl.SelectDirectory('Caption', 'C:\', Dir, [sdNewUI, sdShowEdit]);
于 2013-10-21T19:12:56.953 回答
2

如果您使用SelectDirectory()具有Root参数的重载版本,它将在内部调用SHBrowseForFolder()(另一个重载显示自定义 VCL Win3.1 样式对话框)。如果为传递给Directory参数的变量分配初始值,它将SHBrowseForFolder()作为初始选定文件夹传递给。您还可以在参数中指定sdShowEdit标志。Options但是,编辑框并不用于输入完整路径。但是,如果您SHBrowseForFolder()直接调用,您可以为其提供自己的回调函数,因此当对话框向您发送BFFM_VALIDATEFAILED事件时,您可以从对话框的编辑框中获取文本并向对话框窗口发送BFFM_SETSELECTION消息以导航到正确的小路。

您真正需要的是由 Vista+IFileDialog对话框提供的自定义。您可以使用该IFileDialogCustomize界面将自定义控件添加到对话框中,例如编辑框和按钮,然后实现该IFileDialogControlEvents界面以了解这些控件何时发生各种操作,例如按钮单击。您可以使用它来检查自定义编辑框或剪贴板中的有效路径,如果检测到,则告诉对话框通过该IFileDialog.SetFolder()方法导航到该路径。

于 2013-10-21T18:26:38.287 回答
1

Jedi VCS 的 TJvDirectoryEdit 就是这样做的。查一下。

这是它的一些图片:

在此处输入图像描述

在此处输入图像描述

于 2013-10-21T19:40:08.343 回答
0

如果我理解正确,我认为这可能是您的解决方案。

 procedure TForm1.Button1Click(Sender: TObject);
 var
  opendialog : Topendialog;
 begin
   openDialog := TOpenDialog.Create(self);
   openDialog.InitialDir := GetCurrentDir; {This can also be what is on the clipboard}
   openDialog.Options := [ofFileMustExist];
   openDialog.Filter := 'Text Document |*.txt'; {This is the type of file the user must open}
   openDialog.FilterIndex := 1;
   opendialog.execute;
end;

此代码创建并显示一个简单的打开对话框。然后用户选择的路径是:

opendialog.filename
于 2013-10-21T18:46:33.257 回答
0

@davea 的答案还可以,但它只显示旧的(WinXP)对话框样式。

所以,这是我现在使用的代码。在 Win Vista 及更高版本上,它显示新样式对话框和 Win XP 上的旧样式:

{$WARN SYMBOL_PLATFORM OFF}
{$IFDEF MSWindows}

function SelectAFolder(VAR Folder: string; CONST Options: TFileDialogOptions= [fdoPickFolders, fdoForceFileSystem, fdoPathMustExist, fdoDefaultNoMiniMode]): Boolean;   { Keywords: FolderDialog, BrowseForFolder}    { Works with UNC paths }
VAR Dlg: TFileOpenDialog;
begin
 { Win Vista and up }
 if OS_IsWindowsVistaUp then
  begin
   Dlg:= TFileOpenDialog.Create(NIL);   { Class for Vista and newer Windows operating systems style file open dialogs }
    TRY
      Dlg.Options       := Options;         
      Dlg.DefaultFolder := Folder;
      Dlg.FileName      := Folder;
      Result            := Dlg.Execute;
      if Result
      then Folder:= Dlg.FileName;
    FINALLY
      FreeAndNil(Dlg);
    END;
  end
 else
   { Win XP or down }
   Result:= vcl.FileCtrl.SelectDirectory('', ExtractFileDrive(Folder), Folder, [sdNewUI, sdShowEdit, sdNewFolder], nil);

 if Result
 then Folder:= Trail(Folder);
end;
{$ENDIF}
{$WARN SYMBOL_PLATFORM On}

{ Keywords: FolderDialog, BrowseForFolder}
于 2016-09-16T10:04:25.300 回答