无法在InitialDir中打开OpenDialog窗口

use*_*658 2 delphi openfiledialog delphi-xe5

我在使用指定的initialdir启动OpenDialog窗口时遇到问题.我现在拥有的是什么

procedure TForm1.fileMenuLoadClick(Sender: TObject);
begin     
SetCurrentDir(StartDir);
      SetCurrentDir('Cases');
      OpenDialog.Filename := '';
      OpenDialog.InitialDir := GetCurrentDir;
      OpenDialog.Filter := 'Sparfiler (.dat)|*.dat';
      // -------------------------------
      if OpenDialog.Execute then
      begin
        GeometryClear;
        DerobModel.Filename := OpenDialog.Filename;
        DerobModel.Open;
        pressed := True;
        SetCurrentDir('../');
        DerobModel.HouseProperties.StringValue['CaseDir'] := GetCurrentDir;
        DerobModel.HouseProperties.StringValue['StartDir'] := StartDir;
        SetCurrentDir(StartDir);
        UpdateGeometryPanel;
        mainUpdateComboBox;
        UpdatePropertiesPanel;
        UpdateEnergyPanel;
        UpdateAbsorption;
        UpdateClimatePanel;
        UpdateClimate;
        mainHide;
        Geometry.IsSelected := True;
        GeometryPanel.Visible := True;
        TreeView1.Enabled := True;
        TreeView1.HitTest := True;
        DerobModel.HouseProperties.BoolValue['GlazeChange'] := False;
      end;
Run Code Online (Sandbox Code Playgroud)

运行此代码时,它会一直打开我打开的最后一个文件的文件夹.我读到解决方案是清除OpenDialog的FileName属性,但它不起作用.然而有趣的是,它正在处理来自我的应用程序的先前版本的代码.

procedure TForm1.fileMenuLoadClick(Sender: TObject);
begin
  SetCurrentDir(StartDir);
  SetCurrentDir('Cases');
  OpenDialog.Filename := '';
  OpenDialog.InitialDir := GetCurrentDir;
  OpenDialog.Filter := 'Sparfiler (.dat)|*.dat';
  // -------------------------------
  if OpenDialog.Execute then
  begin
    GeometryClear;
    DerobModel.Filename := OpenDialog.Filename;
    DerobModel.Open;
    pressed := True;
    SetCurrentDir('../');
    DerobModel.HouseProperties.StringValue['CaseDir'] := GetCurrentDir;
    DerobModel.HouseProperties.StringValue['StartDir'] := StartDir;
    SetCurrentDir(StartDir);
    UpdateGeometryPanel;
    mainUpdateComboBox;
    LoadClimateFiles;
    UpdatePropertiesPanel;
    UpdateEnergyPanel;
    UpdateAbsorption;
    UpdateClimatePanel;
    UpdateClimate;
    mainHide;
    Geometry.IsSelected := True;
    GeometryPanel.Visible := True;
    TreeView1.Enabled := True;
    TreeView1.HitTest := True;
    DerobModel.HouseProperties.BoolValue['GlazeChange'] := False;
  end;

end;
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我,这让我疯了.我的意思是唯一的区别是函数LoadClimateFiles,但现在改为在其他函数之一中调用.调试器说InitialDir是我想要的地方,而FileName属性是''

Rob*_*edy 5

这种行为很正常.请参阅该OpenFileName.lpstrInitialDir字段的文档:

初始目录.用于选择初始目录的算法在不同平台上变化.

Windows 7的:

  1. 如果lpstrInitialDir具有与第一次应用程序使用"打开"或"另存为"对话框时传递的值相同的值,则用户最近选择的路径将用作初始目录.
  2. 否则,如果lpstrFile包含路径,则该路径是初始目录.
  3. 否则,如果lpstrInitialDir不是NULL,则指定初始目录.
  4. 如果lpstrInitialDirNULL且当前目录包含指定过滤器类型的任何文件,则初始目录是当前目录.
  5. 否则,初始目录是当前用户的个人文件目录.
  6. 否则,初始目录是Desktop文件夹.

Windows 2000/XP/Vista:

  1. 如果lpstrFile包含路径,则该路径是初始目录.
  2. 否则,lpstrInitialDir指定初始目录.
  3. 否则,如果应用程序过去使用了"打开"或"另存为"对话框,则会选择最近使用的路径作为初始目录.但是,如果应用程序未长时间运行,则会丢弃其保存的选定路径.
  4. 如果lpstrInitialDirNULL且当前目录包含指定过滤器类型的任何文件,则初始目录是当前目录.
  5. 否则,初始目录是当前用户的个人文件目录.
  6. 否则,初始目录是Desktop文件夹.

您每次都传递相同的值,因此适用规则1.操作系统忽略程序要求的目录,并使用用户喜欢的目录.您可能在旧程序中看到不同的行为,因为您已经改变了它的行为,并且它不再请求与您第一次运行程序时所执行的初始目录相同的初始目录.

你可能不应该担心它.