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.

Foi útil?

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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top