我在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;
