【问题标题】:Limit directories in TFileOpenDialog限制 TFileOpenDialog 中的目录
【发布时间】:2011-05-19 16:49:01
【问题描述】:

我在 Delphi XE 的数据输入表单上使用 TFileOpenDialog。用户在对话框中选择 PDF 文档,UNC 路径和文件名将存储在数据库字段中。我想将用户浏览的范围限制为 DefaultDirectory 属性和其下方的文件/子目录。我希望防止用户选择本地驱动器或映射驱动器上的文件,这些文件对于需要存储在数据库中的值的其他用户来说是不可访问的。

我认为这样做的方法是 TFileOpenDialog.OnFolderChanging 事件。但我不确定如何测试所选文件或文件夹是否是 DefaultDirectory 的子级。给定一个文件名或目录名,如何判断它是否依赖于 DefaultDirectory?

【问题讨论】:

    标签: delphi delphi-xe


    【解决方案1】:

    您可以使用StartsText 函数将TFileOpenDialog 对话框的ShellItem 属性与DefaultFolder 属性进行比较,并根据结果设置CanChange 值。

    检查此示例。

    uses
     StrUtils,
     ActiveX,
     ShlObj;
    
    {$R *.dfm}
    
    procedure TForm50.Button1Click(Sender: TObject);
    begin
      FileOpenDialog1.DefaultFolder:='C:\Program Files';
      FileOpenDialog1.Execute;
    end;
    
    function GetItemName(Item: IShellItem; var ItemName: TFileName): HResult;
    var
      pszItemName: LPCWSTR;
    begin
      Result := Item.GetDisplayName(SIGDN_FILESYSPATH, pszItemName);
      if Failed(Result) then
        Result := Item.GetDisplayName(SIGDN_NORMALDISPLAY, pszItemName);
      if Succeeded(Result) then
      try
        ItemName := pszItemName;
      finally
        CoTaskMemFree(pszItemName);
      end;
    end;
    
    
    procedure TForm50.FileOpenDialog1FolderChanging(Sender: TObject;var CanChange: Boolean);
    var
      CurrentDir : TFileName;
      Result     : HRESULT;
    begin
      Result    := GetItemName(TFileOpenDialog(Sender).ShellItem,CurrentDir);
      CanChange := Succeeded(Result) and StartsText(TFileOpenDialog(Sender).DefaultFolder,CurrentDir);
      if not CanChange then
       ShowMessage('Sorry do you not have access to this folder');
    end;
    

    【讨论】:

    • @daemon_x FileOpenDialog1.FileName 属性不返回用户尝试选择的OnFolderChanging 内的当前目录。因为他必须使用ShellItem 属性。
    • 我已经删除了我的评论;但FileOpenDialog1.FileName 实际上返回要选择的项目的显示名称(如文档、音乐等)。你是对的;必须使用GetDisplayName,+1
    • 感谢您的帮助!感谢您向我介绍 StartsText。我已经编写 Delphi 多年,但从未注意到该功能。在其他项目中会派上用场。
    • 没问题,很高兴为您提供帮助;)
    【解决方案2】:

    只是想着你想在这里做什么......

    您总是可以让用户选择一个文件夹,然后在选择无效路径时显示错误。之后,将用户返回到有效文件夹树的根目录。

    优点:

    • 您可以进行自己的验证。您可以有多个起始文件夹,或者您可以在接受和不接受的内容中有更复杂的模式。

    • 您可以告知用户您希望他们做什么,而不是禁止不允许的事情。在现代 UI 模式中,建议不要禁用按钮,而是让用户单击它,然后通知用户为什么不能执行某个操作。否则可能会让用户感到困惑,为什么他们不能做某些事情。

    【讨论】:

    • 虽然您有好的观点,但您并没有解决所提出的问题,即“我如何判断一个文件夹是否是另一个文件夹的子文件夹?”
    猜你喜欢
    • 2010-12-13
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    相关资源
    最近更新 更多