如何修改Delphi中的TFileOpenDialog以限制目录选择?
- 内容介绍
- 相关推荐
本文共计333个文字,预计阅读时间需要2分钟。
在Delphi XE中,我使用TFileOpenDialog选择PDF文档。用户在对话框中选定文件后,UNC路径和文件名存入数据库字段。我想限制用户浏览范围在DefaultDirectory属性指定的目录及其子目录下。
我在Delphi XE中的数据输入表单上使用TFileOpenDialog.用户在对话框中选择PDF文档,UNC路径和文件名存储在数据库字段中.我想将用户浏览的范围限制在DefaultDirectory属性和下面的文件/子目录.我希望防止用户选择本地驱动器或映射驱动器上的文件,这些文件不能被需要存储在数据库中的值的其他用户访问.我认为这样做的方法是TFileOpenDialog.OnFolderChanging事件.但我不确定如何测试所选文件或文件夹是否是DefaultDirectory的子项.给定文件名或目录名,如何判断它是否是DefaultDirectory的依赖?
您可以使用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;
本文共计333个文字,预计阅读时间需要2分钟。
在Delphi XE中,我使用TFileOpenDialog选择PDF文档。用户在对话框中选定文件后,UNC路径和文件名存入数据库字段。我想限制用户浏览范围在DefaultDirectory属性指定的目录及其子目录下。
我在Delphi XE中的数据输入表单上使用TFileOpenDialog.用户在对话框中选择PDF文档,UNC路径和文件名存储在数据库字段中.我想将用户浏览的范围限制在DefaultDirectory属性和下面的文件/子目录.我希望防止用户选择本地驱动器或映射驱动器上的文件,这些文件不能被需要存储在数据库中的值的其他用户访问.我认为这样做的方法是TFileOpenDialog.OnFolderChanging事件.但我不确定如何测试所选文件或文件夹是否是DefaultDirectory的子项.给定文件名或目录名,如何判断它是否是DefaultDirectory的依赖?
您可以使用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;

