2009-06-05 13 views
2

Ich möchte den Pfad für eine TShellListView festlegen, um ein Verzeichnis von Dateien mit Delphi 2007 anzuzeigen. Ich kann TShellListView.Root zunächst verwenden, um den Stammpfad festzulegen dies und es zeigt das Verzeichnis ich möchte:Abrufen/Festlegen von TShellListView-Pfad/Ordner als Zeichenfolge (ohne .Root)

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

Aber wenn der Benutzer aus dem Verzeichnis mit Backspace navigiert weg und ich versuche, die .root wieder auf den ursprünglichen Verzeichnis gesetzt, angezeigt das Verzeichnis ändert sich nicht. Es sieht aus wie .Root soll den Stamm des Shell-Namespace definieren, nicht das aktuelle Verzeichnis.

Wenn der Benutzer herum navigiert (mit Rücktaste usw.), wird die Eigenschaft .Root nicht aktualisiert, um den aktuell angezeigten Pfad wiederzugeben. Es gibt keine .Path-Eigenschaft wie für TShellTreeView.

Was ich will ist eine Möglichkeit, den aktuellen Pfad als String zu erhalten und setzen, ohne die TShellListView mit einem TShellTreeView verknüpfen und TShellTreeView.Path oder hack ShellCtrls.pas, da die relevanten Methoden von TShellListView alle privat aussehen. Es fällt mir schwer zu glauben, dass es keinen einfachen Weg gibt, den Pfad zu bestimmen, also nehme ich an, dass ich etwas Einfaches vermisse, aber diese Komponente ist überhaupt nicht dokumentiert.

Antwort

3

Sie können den aktuell geladenen Pfad

ShellListView1.RootFolder.PathName 

die Root-Eigenschaft funktioniert mit bekommen Einstellung, aber es wird nicht aktualisiert, wenn Sie Ordner interaktiv ändern. Du musst es also zwingen, zu denken, dass sich etwas ändert. Dies funktioniert, wenn Sie es immer auf den gleichen ursprünglichen Pfad zurückzusetzen:

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

Alternativ kann für beliebige Pfade könnten Sie einfach den nachgestellten \ um hinzufügen/entfernen die SameText Check in SetRoot zu täuschen:

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

Die vorgeschlagene Problemumgehung zum Hinzufügen/Entfernen des Schrägstrichs scheint gut zu funktionieren. Ich habe einen ähnlichen Umgehungscode zu einer neuen Path-Eigenschaft hinzugefügt, die ich zu einem TShellListView-Nachfolger hinzugefügt habe, den ich anstelle des Standard-Objekts verwenden werde. – Anagoge

1

Um den aktuellen Ordner als Zeichenfolge abzurufen, können Sie auf die RootFolder-Eigenschaft zugreifen.

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

Um den aktuellen Ordner als Zeichenfolge festzulegen, verwenden Sie die Root-Eigenschaft.

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

Siehe meine Frage - Wenn der Benutzer mit Backspace von diesem Verzeichnis weg navigiert und Sie .Root auf das ursprüngliche Verzeichnis zurücksetzen, ändert sich das angezeigte Verzeichnis nicht. Es sieht aus wie .Root soll den Stamm des Shell-Namespace definieren, nicht das aktuelle Verzeichnis. Die einzige Möglichkeit, das aktuelle Verzeichnis einzurichten, besteht darin, einen verbundenen TShellTreeView.Path zu verwenden oder die TShellListView-Quelle zu hacken - von denen beide nicht ideal sind. – Anagoge

+0

Entschuldigung, ich habe nur getestet, es auf etwas anderes einzustellen, als es ursprünglich war. – Vegar