多次设置`Select DirectoryDialog`的`InitialDir`属性

问题描述 投票:0回答:1

我正在尝试使用InitialDirTSelectDirectoryDialog属性:

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 pageTSelectDirectoryDialog目前正在下降,所以我没有关于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时,我该怎么做?

lazarus freepascal
1个回答
3
投票

通过在每次调用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初始值的唯一方法是在每次调用之前恢复它。

© www.soinside.com 2019 - 2024. All rights reserved.