Получаем / Задаем путь / папку TShellListView в виде строки (не используя .Root)

StackOverflow https://stackoverflow.com/questions/953741

Вопрос

Я хочу задать путь для 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 выглядят закрытыми.Мне трудно поверить, что не существует простого способа получить / задать путь, поэтому я предполагаю, что здесь мне не хватает чего-то простого, но этот компонент вообще не документирован.

Это было полезно?

Решение

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

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);

Другие советы

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

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

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

procedure TForm2.Button2Click(Sender: TObject);
begin
  ShellListView1.Root := 'C:\windows';
end;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top