我正在尝试使用InitialDir
的TSelectDirectoryDialog
属性:
procedure selectfolder;
begin
SelectDirectoryDialog1.InitialDir := strPath;
If SelectDirectoryDialog1.Execute then begin
Edit1.Text := SelectDirectoryDialog1.FileName;
end;
end;
第一次(使用strPath = X)它工作正常,第二次我使用这个过程(strPath = Y)它不使用新路径(Y),而是我之前选择的路径。
在第二次设置InitialDir属性之前,是否必须调用SelectDirectoryDialog1."reinitiate"
之类的方法?另一个想法是使用不同的属性然后使用InitialDir,但我不知道哪个属性可以完成。不幸的是doc page的TSelectDirectoryDialog
目前正在下降,所以我没有关于TSelectDirectoryDialog
的可用方法/属性的描述以及我为解决我的问题而测试的方法/属性。
如果我手动创建TSelectDirectoryDialog类实例并且不使用Component Palette中的那个来“创建表单”,我就可以使用它。然后我只是销毁实例并创建一个新实例。
procedure TForm1.Button4Click(Sender: TObject);
var SelectDirectoryDialogManual : TSelectDirectoryDialog;
begin
SelectDirectoryDialogManual := TSelectDirectoryDialog.Create(nil);
SelectDirectoryDialogManual.InitialDir := 'C:\Windows';
if SelectDirectoryDialogManual.Execute then ShowMessage(SelectDirectoryDialogManual.FileName);
SelectDirectoryDialogManual.Free;
end;
但是当我使用Component Palette组件创建SelectDirectoryDialog1时,我该怎么做?
通过在每次调用Execute之前保存和恢复InitialDir的值,或者在评论中执行@Sertac所说的内容,这可以起作用但不那么“自我记录”imo,ymmv。
下面的代码对我来说很好。 edInitialDir
是一个TEdit
,它保存了使用SelectDirectoryDialog1
选择的最新目录,然后将其用于下一次调用。
procedure TForm1.Button1Click(Sender: TObject);
begin
SelectDirectoryDialog1.InitialDir := edInitialDir.Text;
if SelectDirectoryDialog1.Execute then
Caption := 'executed'
else
Caption := 'not executed';
edInitialDir.Text := SelectDirectoryDialog1.FileName;
end;
注意:SelectDirectoryDialog1
的所有属性都是从Component Palette新添加的实例的默认值。
关于你的评论,TSelectDirectoryDialog.Execute调用TWin32WSSelectDirectoryDialog.CreateHandle(参见Dialogs.Pas,第1219行)。最初的部分如下:
class function TWin32WSSelectDirectoryDialog.CreateHandle(const ACommonDialog: TCommonDialog): THandle;
var
Options : TOpenOptions;
InitialDir : string;
Buffer : PChar;
bi : TBrowseInfo;
iidl : PItemIDList;
biw : TBROWSEINFOW;
Bufferw : PWideChar absolute Buffer;
InitialDirW: widestring;
Title: widestring;
DirName: string;
begin
DirName := '';
InitialDir := TSelectDirectoryDialog(ACommonDialog).FileName;
Options := TSelectDirectoryDialog(ACommonDialog).Options;
if length(InitialDir)=0 then
InitialDir := TSelectDirectoryDialog(ACommonDialog).InitialDir;
if length(InitialDir)>0 then begin
// remove the \ at the end.
if Copy(InitialDir,length(InitialDir),1)=PathDelim then
InitialDir := copy(InitialDir,1, length(InitialDir)-1);
// if it is a rootdirectory, then the InitialDir must have a \ at the end.
if Copy(InitialDir,length(InitialDir),1)=DriveDelim then
InitialDir := InitialDir + PathDelim;
end;
从中您可以看到它最初尝试从FileName属性派生InitialDir的值,并且只有当它导致空字符串时它才会尝试使用InitialDir属性的存储值。这就是为什么对话框在下次调用Execute时使用先前选择的目录的原因,这正是您应该期待的,即使您不喜欢它。从第二次和后续调用中重用IntialDir初始值的唯一方法是在每次调用之前恢复它。