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

我认为执行此操作的方法是TFileOpenDialog.OnFolderChanging事件。但是我不确定如何测试所选文件或文件夹是否是DefaultDirectory的子级。给定文件名或目录名,如何确定它是否是DefaultDirectory的依赖项?

最佳答案

您可以使用ShellItem函数将TFileOpenDialog对话框的DefaultFolder属性与StartsText属性进行比较,并根据结果设置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;

10-05 22:42