我在使OpenDialog窗口在指定的initialdir中启动时遇到问题。
我现在有的是

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属性是''

最佳答案

这是正常现象。请参见OpenFileName.lpstrInitialDir字段的文档:


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

Windows 7的:


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


Windows 2000 / XP / Vista:


如果lpstrFile包含路径,则该路径是初始目录。
否则,lpstrInitialDir指定初始目录。
否则,如果应用程序过去曾使用过“打开”或“另存为”对话框,则将最近使用的路径选作初始目录。但是,如果应用程序长时间不运行,则其保存的所选路径将被丢弃。
如果lpstrInitialDirNULL,并且当前目录包含指定过滤器类型的任何文件,则初始目录为当前目录。
否则,初始目录是当前用户的个人文件目录。
否则,初始目录为桌面文件夹。



您每次都传递相同的值,因此适用规则1。操作系统将忽略您的程序要求的目录,而是使用用户喜欢的目录。您可能会在较旧的程序中看到不同的行为,因为随着时间的流逝,它的行为有所改变,并且它不再请求与首次运行该程序时相同的初始目录。

您可能不必担心。

10-08 14:41