delphi opendialog无需让用户远离initital dir
-
02-10-2019 - |
题
我正在尝试创建一个打开的对话框(在Windows 7中),其中用户仅限于初始目录。在“打开对话框”中,我已将OptionSex设置为[OfexnoplaceSBAR],并且可以删除可以让他们选择文件夹和目录快速转到的标准进入文件名文本框以更改目录。
谢谢
解决方案
如果您使用的是Delphi 2009+,则有一个 TFileOpenDialog
. 。使用此并设置
procedure TForm3.FileOpenDialog1FolderChange(Sender: TObject);
begin
FInitiated := true;
end;
procedure TForm3.FileOpenDialog1FolderChanging(Sender: TObject;
var CanChange: Boolean);
begin
CanChange := not FInitiated;
end;
procedure TForm3.btnOpenClick(Sender: TObject);
begin
FInitiated := false;
FileOpenDialog1.DefaultFolder := 'C:\MyFolder\';
FileOpenDialog1.Execute;
end;
在哪里
var
FInitiated: boolean;
(请注意,应该有一个 FInitiated
每 TFileOpenDialog
. 。因此,如果 FileOpenDialog
是 TForm3
, , 让 FInitiated
成为私人成员 TForm3
也是。)
为了改善用户体验,您可能会使用
procedure TForm3.FileOpenDialog1FolderChanging(Sender: TObject;
var CanChange: Boolean);
begin
CanChange := not FInitiated;
if not CanChange then beep;
end;
或者
procedure TForm3.FileOpenDialog1FolderChanging(Sender: TObject;
var CanChange: Boolean);
begin
CanChange := not FInitiated;
if not CanChange then
MessageBox(Handle, PChar('Directory selection is not allowed.'), PChar(Caption), MB_ICONINFORMATION);
end;
其他提示
使用其他开放的对话框(自己在没有文件夹导航的情况下,只有一个文件列表框就自己制作表单),或者简单地审核不匹配初始dir的路径并拒绝实际打开文件。
“ fileopendialog”有一个 OnFolderChanging
类型的事件 TFileDialogFolderChangingEvent
有布尔人 CanChange
范围。我希望将此参数设置为false会达到目的。
编辑:
根据雷米的评论的示例用法(如果我正确理解);
procedure TForm1.FileOpenDialog1FolderChanging(Sender: TObject;
var CanChange: Boolean);
var
Dlg: TFileOpenDialog;
DefFolder: IShellItem;
iOrder: Integer;
begin
CanChange := False;
Dlg := Sender as TFileOpenDialog;
if Succeeded(SHCreateItemFromParsingName(PWideChar(WideString(Dlg.DefaultFolder)), nil, IShellItem, DefFolder)) then
try
CanChange := Dlg.ShellItem.Compare(DefFolder, SICHINT_ALLFIELDS, iOrder) = S_OK;
finally
DefFolder := nil;
end;
end;
以下也有效,但更容易受到路径变化的影响(请参见下面的Andreas评论);
procedure TForm1.FileOpenDialog1FolderChanging(Sender: TObject;
var CanChange: Boolean);
begin
CanChange := SameFileName(TFileOpenDialog(Sender).FileName,
TFileOpenDialog(Sender).DefaultFolder);
end;
不隶属于 StackOverflow