无法在InitialDir中打开OpenDialog窗口

时间:2014-10-23 13:53:49

标签: delphi delphi-xe5 openfiledialog

我在使用指定的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;

运行此代码时,它会一直打开我打开的最后一个文件的文件夹。我读到解决方案是清除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;

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

2 个答案:

答案 0 :(得分:5)

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

  

初始目录。选择初始目录的算法在不同平台上有所不同。

     

Windows 7:

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

    Windows 2000 / XP / Vista:

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

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

你可能不应该担心它。

答案 1 :(得分:1)

如何解决该问题

如果您知道正确的路径,请设置一个虚拟文件,如

opendialog1.filename:=' C:\ folder1 * .doc';

这会打开正确的文件夹。 在这种情况下,不需要initialdir!