Получить / установить TShellListView Path / Folder как строку (не используется .Root) - PullRequest
2 голосов
/ 05 июня 2009

Я хочу установить путь для TShellListView для отображения каталога файлов с помощью Delphi 2007. Сначала я могу использовать TShellListView.Root для установки корневого пути, как показано ниже, и он показывает каталог, который мне нужен:

View := TShellListView.Create(Self);
// ...
View.Root := 'C:\Windows';

Но если пользователь уходит из этого каталога с помощью backspace, и я пытаюсь установить .Root обратно в исходный каталог, отображаемый каталог не изменяется. Похоже, что .Root предназначен для определения корня пространства имен оболочки, а не текущего каталога.

Кроме того, если пользователь перемещается (используя backspace и т. Д.), Свойство .Root не обновляется, чтобы отображать отображаемый в данный момент путь. Свойство .Path отсутствует, как для TShellTreeView.

Мне нужен способ получить и установить текущий путь в виде строки без необходимости связывать TShellListView с TShellTreeView и устанавливать TShellTreeView.Path или взламывать ShellCtrls.pas, поскольку соответствующие методы TShellListView все выглядят закрытыми. Мне трудно поверить, что не существует простого способа получить / установить путь, поэтому я предполагаю, что упускаю что-то простое здесь, но этот компонент вообще не задокументирован.

Ответы [ 2 ]

3 голосов
/ 05 июня 2009

Вы можете получить текущий загруженный путь, используя

ShellListView1.RootFolder.PathName

Настройка свойства Root работает, но не обновляется при интерактивном изменении папок. Таким образом, вы должны заставить его думать, что есть изменение. Это работает, если вы всегда сбрасываете его на один и тот же исходный путь:

ShellListView1.Root := View.RootFolder.PathName; // Updates to current location
ShellListView1.Root := 'C:\Windows';

В качестве альтернативы, для произвольных путей вы можете просто добавить / удалить завершающий \, чтобы обмануть проверку SameText в SetRoot:

if ShellListView1.Root[Length(ShellListView1.Root)] = '\' then
  ShellListView1.Root := ExcludeTrailingPathDelimiter(ANewPath)
else
  ShellListView1.Root := IncludeTrailingPathDelimiter(ANewPath);
1 голос
/ 05 июня 2009

Чтобы получить текущую папку в виде строки, вы можете получить доступ к свойству RootFolder.

procedure TForm2.Button1Click(Sender: TObject);
begin
  showmessage(ShellListView1.RootFolder.PathName);
end;

Чтобы установить текущую папку как строку, вы используете свойство root.

procedure TForm2.Button2Click(Sender: TObject);
begin
  ShellListView1.Root := 'C:\windows';
end;
...