2011-05-19 66 views
4

我在Delphi XE的数据输入窗体上使用TFileOpenDialog。用户在对话框中选择PDF文档,并将UNC路径和文件名存储在数据库字段中。我想限制用户浏览到DefaultDirectory属性和文件/子目录的范围。我希望阻止用户选择本地驱动器或映射驱动器上无法访问的文件,这些用户需要存储在数据库中的值。TFileOpenDialog中的限制目录

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

回答

4

可以使用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; 
+0

@daemon_x'FileOpenDialog1.FileName'属性不会返回用户试图选择的'OnFolderChanging'内的当前目录。因为他必须使用'ShellItem'属性。 – RRUZ 2011-05-19 18:33:55

+0

我删除了我的评论;但'FileOpenDialog1.FileName'实际上会返回要选择的项目的显示名称(如文档,音乐等)。你是对的;有必要使用'GetDisplayName',+1 – 2011-05-19 18:39:57

+0

感谢您的帮助!并感谢您将我介绍给StartsText。我编写了Delphi多年,并从未注意到该功能。在其他项目中会派上用场。 – 2011-05-20 18:46:30

0

只是你想在这里做什么想一起......

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

优点:

  • 你拿去做自己的验证。你可以有多个起始文件夹,或者你可以接受更多复杂的模式,而不是你所接受的模式。

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

+0

虽然你有很好的观点,但你并没有解决问题,即“如何判断一个文件夹是否是另一个文件夹的子文件夹?” – 2011-05-19 22:52:14