更改Delphi OpenDialog的目录

时间:2010-10-25 14:46:13

标签: delphi delphi-7

该计划的一些背景:
该程序使用选项卡式界面同时处理多个文件 我正在尝试更改OpenDialog的目录,所以每次打开文件时都会显示我当前正在处理的文件的目录,但即使我将InitialDir设置为文件的路径,它也会显示最后打开的文件目录,而不是我设置的目录 我尝试了以下方法:

if Length(CurrentFileName) > 0 then
begin
  OpenFileDialog.InitialDir :='';
  SetCurrentDirectory(PChar(CurrentFileName));
  OpenFileDialog.InitialDir := ExtractFileDir(CurrentFileName);
end;
if OpenFileDialog.Execute then
...

其中CurrentFileName是包含当前选项卡打开文件的文件名的完整路径。但没有运气。

有没有办法实现这个目标?

例如:

tab1c:\mydir\file.txt已开启 tab2d:\someotherdir\somefile.txt已开启

如果我转到tab1并拨打开放功能我OpenDialog应该向我显示c:\mydir\的内容

我正在使用Delphi 7.感谢任何帮助。

5 个答案:

答案 0 :(得分:8)

以下是Windows Vista及更早版本的the rules

  1. 如果lpstrFile包含路径,则该路径是初始目录。
  2. 否则,lpstrInitialDir指定初始目录。
  3. 否则,如果应用程序过去使用了“打开”或“另存为”对话框,则会选择最近使用的路径作为初始目录。但是,如果应用程序未长时间运行,则会丢弃其保存的选定路径。
  4. 如果lpstrInitialDir为NULL并且当前目录包含指定过滤器类型的任何文件,则初始目录是当前目录。
  5. 否则,初始目录是当前用户的个人文件目录。
  6. 否则,初始目录是Desktop文件夹。
  7. 因此,如果当前FileName属性为非空,则忽略InitialDir属性,应用程序的当前目录也是如此。这符合您观察到的内容,因此请确保在使用对话框之间清除FileName属性。

    (规则与Windows 7不同,它们可能会影响您的计划。如果您从第一个标签打开文件,然后从第二个标签打开文件,另一个尝试打开文件,而第一个标签是选中可能不再显示第一个选项卡的目录。)

答案 1 :(得分:5)

我以为

if Length(CurrentFileName) > 0 then
  OpenFileDialog.FileName := ExtractFilePath(CurrentFileName);

if OpenFileDialog.Execute

是要走的路,但显然情况比我想象的要复杂一些。

无论如何,我严重怀疑

  OpenFileDialog.FileName := ExtractFilePath(CurrentFileName);
  OpenFileDialog.InitialDir := OpenFileDialog.FileName;
  SetCurrentDirectory(PChar(OpenFileDialog.FileName));

会让你失望。现在确定目录的三种主要方式是同样的事情!有点过度杀戮,但如果Windows改变了它的行为,可能是必要的。

顺便说一句,您的代码中存在错误。 SetCurrentDirectory想要目录作为参数,而不是文件名。

答案 2 :(得分:3)

应清除FileName属性,例如:

procedure TForm1.Button1Click(Sender: TObject);
begin
  OpenDialog1.FileName:= '';
  OpenDialog1.InitialDir:= 'C:\';
  OpenDialog1.Execute;
end;

答案 3 :(得分:1)

我有一个类似的问题 - 使用Opendialog1.InitialDir := GetCurrentDir - 没有用。 尝试将其显示为Opendialog1.Title := Opendialog1.InitialDir - 显示正确的字符串。 然后声明新的字符串(dir)并使用

dirr := GetCurrentDir;
Opendialog1.InitialDir := dirr;

这似乎工作正常(不确定原因,但工作) HTH

答案 4 :(得分:0)

刚刚测试过,下面的代码在Delphi 2010中运行。要么它是Delphi 7中的错误,要么需要仔细检查CurrentFileName的值是否符合您的要求。

procedure TForm1.Button1Click(Sender: TObject);
begin
  opendialog1.InitialDir := 'c:\temp';
  opendialog1.Execute;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  opendialog1.InitialDir := 'c:\temp\fpc';
  opendialog1.Execute;
end;