Изменение каталога Delphi OpenDialog - PullRequest
5 голосов
/ 25 октября 2010

Небольшая предыстория программы:
Программа использует интерфейс с вкладками для работы с несколькими файлами одновременно.
Я пытаюсь изменить каталог OpenDialog, поэтому каждый раз, когда я вызываю openfile покажет каталог файла, над которым я сейчас работаю, но даже когда я задаю InitialDir путь к файлу, он всегда отображает последний открытый каталог файла, а не тот, который я его устанавливаю.
Я пробовалследующее:

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

Где CurrentFileName - полный путь с именем файла открытого файла текущей вкладки.Но не повезло.

Есть ли способ достичь этого?

Так, например:

tab1 имеет c:\mydir\file.txt открыто
tab2 имеет d:\someotherdir\somefile.txt открыл

Если я перейду на tab1 и вызову функцию открытия, я OpenDialog должен показать мне содержимое c:\mydir\

Я использую Delphi 7. Любая помощьоценили.

Ответы [ 5 ]

8 голосов
/ 25 октября 2010

Вот правила для Windows Vista и более ранних версий:

  1. Если lpstrFile содержит путь, этот путь является начальным каталогом.
  2. В противном случае lpstrInitialDir указывает начальный каталог.
  3. В противном случае, если в прошлом приложение использовало диалоговое окно «Открыть» или «Сохранить как», последний использованный путь выбирается в качестве исходного каталога. Однако, если приложение долго не запускается, его сохраненный выбранный путь отбрасывается.
  4. Если lpstrInitialDir имеет значение NULL и текущий каталог содержит любые файлы указанных типов фильтров, начальный каталог является текущим каталогом.
  5. В противном случае начальный каталог - это каталог личных файлов текущего пользователя.
  6. В противном случае начальным каталогом является папка Desktop.

Итак, если текущее свойство FileName не пустое, то свойство InitialDir игнорируется, как и текущий каталог приложения. Это соответствует тому, что вы наблюдали, поэтому убедитесь, что вы очищаете свойство FileName между использованиями вашего диалогового окна.

(Правила отличаются от Windows 7 и могут помешать вашим планам. Если вы откроете файл на первой вкладке, а затем откроете файл на второй вкладке, еще одна попытка открыть файл, пока первая вкладка selected может больше не отображать каталог первой вкладки.)

5 голосов
/ 25 октября 2010

Я думал, что

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

if OpenFileDialog.Execute

был путь, но, видимо, ситуация несколько более запутанная, чем я думал.

Во всяком случае, я серьезно сомневаюсь, что

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

сделает вас разочарованным. Теперь три основных способа определения dir говорят одно и то же! Немного перегружено, но если Windows изменила свое поведение, это может быть необходимо.

Кстати, в вашем коде есть ошибка. SetCurrentDirectory хочет каталог как аргумент, а не имя файла.

3 голосов
/ 25 октября 2010

FileName свойство должно быть очищено, например:

procedure TForm1.Button1Click(Sender: TObject);
begin
  OpenDialog1.FileName:= '';
  OpenDialog1.InitialDir:= 'C:\';
  OpenDialog1.Execute;
end;
1 голос
/ 26 сентября 2011

У меня была похожая проблема - использование Opendialog1.InitialDir := GetCurrentDir - не работало. Попытался отобразить его как Opendialog1.Title := Opendialog1.InitialDir - показал правильную строку. Затем объявили новую строку (dir) и использовали

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

Это, кажется, работает нормально (не знаю почему, но работает) НТН

0 голосов
/ 25 октября 2010

Только что протестировано, и приведенный ниже код работает в 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;
...