Get / Set TShellListView caminho / pasta como String (não usar .Root)
-
11-09-2019 - |
Pergunta
Eu quero definir o caminho para uma TShellListView para exibir um diretório de arquivos usando o Delphi 2007. Eu inicialmente pode usar TShellListView.Root para definir o caminho de raiz como este e mostra o diretório eu quero:
View := TShellListView.Create(Self);
// ...
View.Root := 'C:\Windows';
Mas se o usuário navega longe desse diretório usando backspace e eu tentar definir a volta .Root para o diretório original, o diretório exibido não muda. Parece que .Root pretende definir a raiz do namespace shell, e não o diretório atual.
Além disso, se as navega usuários ao redor (usando a tecla de retrocesso, etc.) a propriedade .Root não atualiza para refletir o caminho exibido atualmente. Não há nenhuma propriedade .Path como existe para TShellTreeView.
O que eu quero é uma maneira de obter e definir o caminho atual como uma string sem ser necessário ligar o TShellListView a um TShellTreeView e definir TShellTreeView.Path ou ShellCtrls.pas de hackers desde os métodos de TShellListView todo o olhar privadas. Acho que é difícil acreditar que não há uma maneira simples de obter / definir o caminho, então eu suponho que eu estou faltando algo simples aqui, mas este componente não está documentada em tudo.
Solução
Você pode obter o caminho atualmente carregado usando
ShellListView1.RootFolder.PathName
A configuração da propriedade Root funciona, mas não é atualizada quando você alterar pastas de forma interativa. Então, você precisa forçá-lo a pensar que há uma mudança. Isso funciona se você está sempre redefini-lo para o mesmo caminho original:
ShellListView1.Root := View.RootFolder.PathName; // Updates to current location
ShellListView1.Root := 'C:\Windows';
Como alternativa, para caminhos arbitrários você poderia apenas adicionar / remover a fuga \, a fim de enganar o cheque SameText em SetRoot:
if ShellListView1.Root[Length(ShellListView1.Root)] = '\' then
ShellListView1.Root := ExcludeTrailingPathDelimiter(ANewPath)
else
ShellListView1.Root := IncludeTrailingPathDelimiter(ANewPath);
Outras dicas
Para obter a pasta atual como uma string, você pode acessar a RootFolder-propriedade.
procedure TForm2.Button1Click(Sender: TObject);
begin
showmessage(ShellListView1.RootFolder.PathName);
end;
Para definir a pasta atual como uma string, você usa a raiz-propriedade.
procedure TForm2.Button2Click(Sender: TObject);
begin
ShellListView1.Root := 'C:\windows';
end;