2009-06-05 5 views
2

Je souhaite définir le chemin d'accès à TShellListView pour afficher un répertoire de fichiers à l'aide de Delphi 2007. Je peux initialement utiliser TShellListView.Root pour définir le chemin racine comme cela et il montre le répertoire que je veux:Get/Set TShellListView Chemin d'accès/Dossier en tant que chaîne (sans utiliser .Root)

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

Mais si l'utilisateur quitte ce répertoire en utilisant backspace et j'essaie de régler le .root retour au répertoire d'origine, le répertoire affiché ne change pas. Il ressemble à .Root est destiné à définir la racine de l'espace de noms shell, pas le répertoire en cours.

De même, si l'utilisateur navigue (en utilisant un retour arrière, etc.), la propriété .Root ne se met pas à jour pour refléter le chemin actuellement affiché. Il n'y a pas de propriété .Path comme pour TShellTreeView. Ce que je veux est un moyen d'obtenir et de définir le chemin actuel sous forme de chaîne sans avoir besoin de lier TShellListView à TShellTreeView et de définir TShellTreeView.Path ou hack ShellCtrls.pas puisque les méthodes pertinentes de TShellListView semblent toutes privées. J'ai du mal à croire qu'il n'y a pas de moyen simple d'obtenir/définir le chemin, donc je suppose qu'il me manque quelque chose de simple ici, mais ce composant n'est pas documenté du tout.

Répondre

3

Vous pouvez obtenir le chemin actuellement chargé à l'aide

ShellListView1.RootFolder.PathName 

Définition des œuvres de propriété de racines, mais il est pas mis à jour lorsque vous modifiez des dossiers de manière interactive. Vous devez donc le forcer à penser qu'il y a un changement. Cela fonctionne si vous réinitialisant toujours à la même voie originale:

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

Sinon, pour les chemins arbitraires, vous pouvez simplement ajouter/retirer le \ arrière afin de tromper le chèque SameText à SetRoot:

if ShellListView1.Root[Length(ShellListView1.Root)] = '\' then 
    ShellListView1.Root := ExcludeTrailingPathDelimiter(ANewPath) 
else 
    ShellListView1.Root := IncludeTrailingPathDelimiter(ANewPath); 
+0

Votre solution de contournement suggérée pour ajouter/supprimer la barre oblique semble fonctionner correctement. J'ai ajouté un code de contournement similaire à une nouvelle propriété Path ajoutée à un descendant TShellListView que j'utiliserai à la place de celle par défaut. – Anagoge

1

Pour obtenir le dossier en cours sous forme de chaîne, vous pouvez accéder à la propriété RootFolder.

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

Pour définir le dossier en cours en tant que chaîne, utilisez la propriété root.

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

Voir ma question - Si l'utilisateur quitte ce répertoire en utilisant le retour arrière et que vous remettez le fichier .Root dans le répertoire d'origine, le répertoire affiché ne change pas. Il ressemble à .Root est destiné à définir la racine de l'espace de noms shell, pas le répertoire en cours. La seule façon que j'ai trouvé pour définir le répertoire courant est d'utiliser un TShellTreeView.Path connecté ou de pirater la source TShellListView - ni l'une ni l'autre qui sont idéales. – Anagoge

+0

Désolé, j'ai seulement testé le réglage de quelque chose d'autre que ce qu'il était initialement. – Vegar

Questions connexes