可以使用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'属性。 – RRUZ 2011-05-19 18:33:55
我删除了我的评论;但'FileOpenDialog1.FileName'实际上会返回要选择的项目的显示名称(如文档,音乐等)。你是对的;有必要使用'GetDisplayName',+1 – 2011-05-19 18:39:57
感谢您的帮助!并感谢您将我介绍给StartsText。我编写了Delphi多年,并从未注意到该功能。在其他项目中会派上用场。 – 2011-05-20 18:46:30