我在使用指定的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属性是''
答案 0 :(得分:5)
这种行为很正常。请参阅OpenFileName.lpstrInitialDir
字段的文档:
初始目录。选择初始目录的算法在不同平台上有所不同。
Windows 7:
- 如果
lpstrInitialDir
与第一次应用程序使用“打开”或“另存为”对话框时传递的值相同,则用户最近选择的路径将用作初始目录。- 否则,如果
lpstrFile
包含路径,则该路径是初始目录。- 否则,如果
lpstrInitialDir
不是NULL
,则指定初始目录。- 如果
lpstrInitialDir
为NULL
且当前目录包含指定过滤器类型的任何文件,则初始目录为当前目录。- 否则,初始目录是当前用户的个人文件目录。
- 否则,初始目录是Desktop文件夹。
醇>Windows 2000 / XP / Vista:
- 如果
lpstrFile
包含路径,则该路径是初始目录。- 否则,
lpstrInitialDir
指定初始目录。- 否则,如果应用程序过去使用了“打开”或“另存为”对话框,则会选择最近使用的路径作为初始目录。但是,如果应用程序未长时间运行,则会丢弃其保存的选定路径。
- 如果
lpstrInitialDir
为NULL
且当前目录包含指定过滤器类型的任何文件,则初始目录为当前目录。- 否则,初始目录是当前用户的个人文件目录。
- 否则,初始目录是Desktop文件夹。
醇>
您每次都传递相同的值,因此规则1适用。操作系统忽略程序要求的目录,并使用用户喜欢的目录。您可能会在旧程序中看到不同的行为,因为您已经改变了它的行为,并且它不再请求与您第一次运行程序时所执行的初始目录相同。
你可能不应该担心它。
答案 1 :(得分:1)
如何解决该问题
如果您知道正确的路径,请设置一个虚拟文件,如
opendialog1.filename:=' C:\ folder1 * .doc';
这会打开正确的文件夹。 在这种情况下,不需要initialdir!